1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // Framebuffer.h: Defines the gl::Framebuffer class. Implements GL framebuffer 8*8975f5c5SAndroid Build Coastguard Worker // objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_FRAMEBUFFER_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_FRAMEBUFFER_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <vector> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker #include "common/FixedVector.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "common/Optional.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Constants.h" 19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Debug.h" 20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h" 21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/FramebufferAttachment.h" 22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Observer.h" 23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/RefCountObject.h" 24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/State.h" 25*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker namespace rx 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker class GLImplFactory; 30*8975f5c5SAndroid Build Coastguard Worker class FramebufferImpl; 31*8975f5c5SAndroid Build Coastguard Worker class RenderbufferImpl; 32*8975f5c5SAndroid Build Coastguard Worker class SurfaceImpl; 33*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker namespace egl 36*8975f5c5SAndroid Build Coastguard Worker { 37*8975f5c5SAndroid Build Coastguard Worker class Display; 38*8975f5c5SAndroid Build Coastguard Worker class Surface; 39*8975f5c5SAndroid Build Coastguard Worker } // namespace egl 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker namespace gl 42*8975f5c5SAndroid Build Coastguard Worker { 43*8975f5c5SAndroid Build Coastguard Worker struct Caps; 44*8975f5c5SAndroid Build Coastguard Worker class Context; 45*8975f5c5SAndroid Build Coastguard Worker struct Extensions; 46*8975f5c5SAndroid Build Coastguard Worker class Framebuffer; 47*8975f5c5SAndroid Build Coastguard Worker class ImageIndex; 48*8975f5c5SAndroid Build Coastguard Worker class PixelLocalStorage; 49*8975f5c5SAndroid Build Coastguard Worker class Renderbuffer; 50*8975f5c5SAndroid Build Coastguard Worker class TextureCapsMap; 51*8975f5c5SAndroid Build Coastguard Worker 52*8975f5c5SAndroid Build Coastguard Worker struct FramebufferStatus 53*8975f5c5SAndroid Build Coastguard Worker { 54*8975f5c5SAndroid Build Coastguard Worker bool isComplete() const; 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker static FramebufferStatus Complete(); 57*8975f5c5SAndroid Build Coastguard Worker static FramebufferStatus Incomplete(GLenum status, const char *reason); 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker GLenum status = GL_FRAMEBUFFER_COMPLETE; 60*8975f5c5SAndroid Build Coastguard Worker const char *reason = nullptr; 61*8975f5c5SAndroid Build Coastguard Worker }; 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker class FramebufferState final : angle::NonCopyable 64*8975f5c5SAndroid Build Coastguard Worker { 65*8975f5c5SAndroid Build Coastguard Worker public: 66*8975f5c5SAndroid Build Coastguard Worker explicit FramebufferState(rx::UniqueSerial serial); 67*8975f5c5SAndroid Build Coastguard Worker FramebufferState(const Caps &caps, FramebufferID id, rx::UniqueSerial serial); 68*8975f5c5SAndroid Build Coastguard Worker ~FramebufferState(); 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker const std::string &getLabel() const; 71*8975f5c5SAndroid Build Coastguard Worker uint32_t getReadIndex() const; 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getAttachment(const Context *context, GLenum attachment) const; 74*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getReadAttachment() const; 75*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getFirstNonNullAttachment() const; 76*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getFirstColorAttachment() const; 77*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDepthOrStencilAttachment() const; 78*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getStencilOrDepthStencilAttachment() const; 79*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getColorAttachment(size_t colorAttachment) const; 80*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDepthAttachment() const; 81*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getStencilAttachment() const; 82*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDepthStencilAttachment() const; 83*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getReadPixelsAttachment(GLenum readFormat) const; 84*8975f5c5SAndroid Build Coastguard Worker getDrawBufferStates()85*8975f5c5SAndroid Build Coastguard Worker const DrawBuffersVector<GLenum> &getDrawBufferStates() const { return mDrawBufferStates; } getEnabledDrawBuffers()86*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask getEnabledDrawBuffers() const { return mEnabledDrawBuffers; } getReadBufferState()87*8975f5c5SAndroid Build Coastguard Worker GLenum getReadBufferState() const { return mReadBufferState; } 88*8975f5c5SAndroid Build Coastguard Worker getColorAttachments()89*8975f5c5SAndroid Build Coastguard Worker const DrawBuffersVector<FramebufferAttachment> &getColorAttachments() const 90*8975f5c5SAndroid Build Coastguard Worker { 91*8975f5c5SAndroid Build Coastguard Worker return mColorAttachments; 92*8975f5c5SAndroid Build Coastguard Worker } getColorAttachmentsMask()93*8975f5c5SAndroid Build Coastguard Worker const DrawBufferMask getColorAttachmentsMask() const { return mColorAttachmentsMask; } 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker const Extents getAttachmentExtentsIntersection() const; 96*8975f5c5SAndroid Build Coastguard Worker bool attachmentsHaveSameDimensions() const; 97*8975f5c5SAndroid Build Coastguard Worker bool hasSeparateDepthAndStencilAttachments() const; 98*8975f5c5SAndroid Build Coastguard Worker bool colorAttachmentsAreUniqueImages() const; 99*8975f5c5SAndroid Build Coastguard Worker Box getDimensions() const; 100*8975f5c5SAndroid Build Coastguard Worker Extents getExtents() const; 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDrawBuffer(size_t drawBufferIdx) const; 103*8975f5c5SAndroid Build Coastguard Worker size_t getDrawBufferCount() const; 104*8975f5c5SAndroid Build Coastguard Worker getDefaultWidth()105*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultWidth() const { return mDefaultWidth; } getDefaultHeight()106*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultHeight() const { return mDefaultHeight; } getDefaultSamples()107*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultSamples() const { return mDefaultSamples; } getDefaultFixedSampleLocations()108*8975f5c5SAndroid Build Coastguard Worker bool getDefaultFixedSampleLocations() const { return mDefaultFixedSampleLocations; } getDefaultLayers()109*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultLayers() const { return mDefaultLayers; } getFlipY()110*8975f5c5SAndroid Build Coastguard Worker bool getFlipY() const { return mFlipY; } 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker bool hasDepth() const; 113*8975f5c5SAndroid Build Coastguard Worker bool hasStencil() const; 114*8975f5c5SAndroid Build Coastguard Worker GLuint getStencilBitCount() const; 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker bool hasExternalTextureAttachment() const; 117*8975f5c5SAndroid Build Coastguard Worker bool hasYUVAttachment() const; 118*8975f5c5SAndroid Build Coastguard Worker 119*8975f5c5SAndroid Build Coastguard Worker bool isMultiview() const; 120*8975f5c5SAndroid Build Coastguard Worker getNumViews()121*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE GLsizei getNumViews() const 122*8975f5c5SAndroid Build Coastguard Worker { 123*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *attachment = getFirstNonNullAttachment(); 124*8975f5c5SAndroid Build Coastguard Worker if (attachment == nullptr) 125*8975f5c5SAndroid Build Coastguard Worker { 126*8975f5c5SAndroid Build Coastguard Worker return FramebufferAttachment::kDefaultNumViews; 127*8975f5c5SAndroid Build Coastguard Worker } 128*8975f5c5SAndroid Build Coastguard Worker return attachment->getNumViews(); 129*8975f5c5SAndroid Build Coastguard Worker } 130*8975f5c5SAndroid Build Coastguard Worker 131*8975f5c5SAndroid Build Coastguard Worker GLint getBaseViewIndex() const; 132*8975f5c5SAndroid Build Coastguard Worker getWriteControlMode()133*8975f5c5SAndroid Build Coastguard Worker SrgbWriteControlMode getWriteControlMode() const { return mSrgbWriteControlMode; } 134*8975f5c5SAndroid Build Coastguard Worker id()135*8975f5c5SAndroid Build Coastguard Worker FramebufferID id() const { return mId; } 136*8975f5c5SAndroid Build Coastguard Worker 137*8975f5c5SAndroid Build Coastguard Worker bool isDefault() const; 138*8975f5c5SAndroid Build Coastguard Worker getSurfaceTextureOffset()139*8975f5c5SAndroid Build Coastguard Worker const Offset &getSurfaceTextureOffset() const { return mSurfaceTextureOffset; } 140*8975f5c5SAndroid Build Coastguard Worker getFramebufferSerial()141*8975f5c5SAndroid Build Coastguard Worker rx::UniqueSerial getFramebufferSerial() const { return mFramebufferSerial; } 142*8975f5c5SAndroid Build Coastguard Worker 143*8975f5c5SAndroid Build Coastguard Worker bool isBoundAsDrawFramebuffer(const Context *context) const; 144*8975f5c5SAndroid Build Coastguard Worker isFoveationEnabled()145*8975f5c5SAndroid Build Coastguard Worker bool isFoveationEnabled() const { return mFoveationState.isFoveated(); } 146*8975f5c5SAndroid Build Coastguard Worker getFoveationState()147*8975f5c5SAndroid Build Coastguard Worker const FoveationState &getFoveationState() const { return mFoveationState; } 148*8975f5c5SAndroid Build Coastguard Worker 149*8975f5c5SAndroid Build Coastguard Worker private: 150*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getWebGLDepthStencilAttachment() const; 151*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getWebGLDepthAttachment() const; 152*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getWebGLStencilAttachment() const; 153*8975f5c5SAndroid Build Coastguard Worker 154*8975f5c5SAndroid Build Coastguard Worker friend class Framebuffer; 155*8975f5c5SAndroid Build Coastguard Worker 156*8975f5c5SAndroid Build Coastguard Worker // The Framebuffer ID is unique to a Context. 157*8975f5c5SAndroid Build Coastguard Worker // The Framebuffer UniqueSerial is unique to a Share Group. 158*8975f5c5SAndroid Build Coastguard Worker FramebufferID mId; 159*8975f5c5SAndroid Build Coastguard Worker rx::UniqueSerial mFramebufferSerial; 160*8975f5c5SAndroid Build Coastguard Worker std::string mLabel; 161*8975f5c5SAndroid Build Coastguard Worker 162*8975f5c5SAndroid Build Coastguard Worker DrawBuffersVector<FramebufferAttachment> mColorAttachments; 163*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment mDepthAttachment; 164*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment mStencilAttachment; 165*8975f5c5SAndroid Build Coastguard Worker 166*8975f5c5SAndroid Build Coastguard Worker // Tracks all the color buffers attached to this FramebufferDesc 167*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask mColorAttachmentsMask; 168*8975f5c5SAndroid Build Coastguard Worker 169*8975f5c5SAndroid Build Coastguard Worker DrawBuffersVector<GLenum> mDrawBufferStates; 170*8975f5c5SAndroid Build Coastguard Worker GLenum mReadBufferState; 171*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask mEnabledDrawBuffers; 172*8975f5c5SAndroid Build Coastguard Worker ComponentTypeMask mDrawBufferTypeMask; 173*8975f5c5SAndroid Build Coastguard Worker 174*8975f5c5SAndroid Build Coastguard Worker GLint mDefaultWidth; 175*8975f5c5SAndroid Build Coastguard Worker GLint mDefaultHeight; 176*8975f5c5SAndroid Build Coastguard Worker GLint mDefaultSamples; 177*8975f5c5SAndroid Build Coastguard Worker bool mDefaultFixedSampleLocations; 178*8975f5c5SAndroid Build Coastguard Worker GLint mDefaultLayers; 179*8975f5c5SAndroid Build Coastguard Worker bool mFlipY; 180*8975f5c5SAndroid Build Coastguard Worker 181*8975f5c5SAndroid Build Coastguard Worker // It's necessary to store all this extra state so we can restore attachments 182*8975f5c5SAndroid Build Coastguard Worker // when DEPTH_STENCIL/DEPTH/STENCIL is unbound in WebGL 1. 183*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment mWebGLDepthStencilAttachment; 184*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment mWebGLDepthAttachment; 185*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment mWebGLStencilAttachment; 186*8975f5c5SAndroid Build Coastguard Worker bool mWebGLDepthStencilConsistent; 187*8975f5c5SAndroid Build Coastguard Worker 188*8975f5c5SAndroid Build Coastguard Worker // Tracks if we need to initialize the resources for each attachment. 189*8975f5c5SAndroid Build Coastguard Worker angle::BitSet<IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS + 2> mResourceNeedsInit; 190*8975f5c5SAndroid Build Coastguard Worker 191*8975f5c5SAndroid Build Coastguard Worker bool mDefaultFramebufferReadAttachmentInitialized; 192*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment mDefaultFramebufferReadAttachment; 193*8975f5c5SAndroid Build Coastguard Worker 194*8975f5c5SAndroid Build Coastguard Worker // EXT_sRGB_write_control 195*8975f5c5SAndroid Build Coastguard Worker SrgbWriteControlMode mSrgbWriteControlMode; 196*8975f5c5SAndroid Build Coastguard Worker 197*8975f5c5SAndroid Build Coastguard Worker Offset mSurfaceTextureOffset; 198*8975f5c5SAndroid Build Coastguard Worker 199*8975f5c5SAndroid Build Coastguard Worker // GL_QCOM_framebuffer_foveated 200*8975f5c5SAndroid Build Coastguard Worker FoveationState mFoveationState; 201*8975f5c5SAndroid Build Coastguard Worker }; 202*8975f5c5SAndroid Build Coastguard Worker 203*8975f5c5SAndroid Build Coastguard Worker class Framebuffer final : public angle::ObserverInterface, 204*8975f5c5SAndroid Build Coastguard Worker public LabeledObject, 205*8975f5c5SAndroid Build Coastguard Worker public angle::Subject 206*8975f5c5SAndroid Build Coastguard Worker { 207*8975f5c5SAndroid Build Coastguard Worker public: 208*8975f5c5SAndroid Build Coastguard Worker // Constructor to build default framebuffers. 209*8975f5c5SAndroid Build Coastguard Worker Framebuffer(const Context *context, rx::GLImplFactory *factory); 210*8975f5c5SAndroid Build Coastguard Worker // Constructor to build application-defined framebuffers 211*8975f5c5SAndroid Build Coastguard Worker Framebuffer(const Context *context, rx::GLImplFactory *factory, FramebufferID id); 212*8975f5c5SAndroid Build Coastguard Worker 213*8975f5c5SAndroid Build Coastguard Worker ~Framebuffer() override; 214*8975f5c5SAndroid Build Coastguard Worker void onDestroy(const Context *context); 215*8975f5c5SAndroid Build Coastguard Worker 216*8975f5c5SAndroid Build Coastguard Worker egl::Error setSurfaces(const Context *context, 217*8975f5c5SAndroid Build Coastguard Worker egl::Surface *surface, 218*8975f5c5SAndroid Build Coastguard Worker egl::Surface *readSurface); 219*8975f5c5SAndroid Build Coastguard Worker void setReadSurface(const Context *context, egl::Surface *readSurface); 220*8975f5c5SAndroid Build Coastguard Worker egl::Error unsetSurfaces(const Context *context); 221*8975f5c5SAndroid Build Coastguard Worker angle::Result setLabel(const Context *context, const std::string &label) override; 222*8975f5c5SAndroid Build Coastguard Worker const std::string &getLabel() const override; 223*8975f5c5SAndroid Build Coastguard Worker getImplementation()224*8975f5c5SAndroid Build Coastguard Worker rx::FramebufferImpl *getImplementation() const { return mImpl; } 225*8975f5c5SAndroid Build Coastguard Worker id()226*8975f5c5SAndroid Build Coastguard Worker FramebufferID id() const { return mState.mId; } 227*8975f5c5SAndroid Build Coastguard Worker 228*8975f5c5SAndroid Build Coastguard Worker void setAttachment(const Context *context, 229*8975f5c5SAndroid Build Coastguard Worker GLenum type, 230*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 231*8975f5c5SAndroid Build Coastguard Worker const ImageIndex &textureIndex, 232*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *resource); 233*8975f5c5SAndroid Build Coastguard Worker void setAttachmentMultisample(const Context *context, 234*8975f5c5SAndroid Build Coastguard Worker GLenum type, 235*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 236*8975f5c5SAndroid Build Coastguard Worker const ImageIndex &textureIndex, 237*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *resource, 238*8975f5c5SAndroid Build Coastguard Worker GLsizei samples); 239*8975f5c5SAndroid Build Coastguard Worker void setAttachmentMultiview(const Context *context, 240*8975f5c5SAndroid Build Coastguard Worker GLenum type, 241*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 242*8975f5c5SAndroid Build Coastguard Worker const ImageIndex &textureIndex, 243*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *resource, 244*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews, 245*8975f5c5SAndroid Build Coastguard Worker GLint baseViewIndex); 246*8975f5c5SAndroid Build Coastguard Worker void resetAttachment(const Context *context, GLenum binding); 247*8975f5c5SAndroid Build Coastguard Worker 248*8975f5c5SAndroid Build Coastguard Worker bool detachTexture(Context *context, TextureID texture); 249*8975f5c5SAndroid Build Coastguard Worker bool detachRenderbuffer(Context *context, RenderbufferID renderbuffer); 250*8975f5c5SAndroid Build Coastguard Worker 251*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getColorAttachment(size_t colorAttachment) const; 252*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDepthAttachment() const; 253*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getStencilAttachment() const; 254*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDepthStencilAttachment() const; 255*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDepthOrStencilAttachment() const; 256*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getStencilOrDepthStencilAttachment() const; 257*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getReadColorAttachment() const; 258*8975f5c5SAndroid Build Coastguard Worker GLenum getReadColorAttachmentType() const; 259*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getFirstColorAttachment() const; 260*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getFirstNonNullAttachment() const; 261*8975f5c5SAndroid Build Coastguard Worker getColorAttachments()262*8975f5c5SAndroid Build Coastguard Worker const DrawBuffersVector<FramebufferAttachment> &getColorAttachments() const 263*8975f5c5SAndroid Build Coastguard Worker { 264*8975f5c5SAndroid Build Coastguard Worker return mState.mColorAttachments; 265*8975f5c5SAndroid Build Coastguard Worker } 266*8975f5c5SAndroid Build Coastguard Worker getState()267*8975f5c5SAndroid Build Coastguard Worker const FramebufferState &getState() const { return mState; } 268*8975f5c5SAndroid Build Coastguard Worker 269*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getAttachment(const Context *context, GLenum attachment) const; 270*8975f5c5SAndroid Build Coastguard Worker bool isMultiview() const; 271*8975f5c5SAndroid Build Coastguard Worker bool readDisallowedByMultiview() const; 272*8975f5c5SAndroid Build Coastguard Worker GLsizei getNumViews() const; 273*8975f5c5SAndroid Build Coastguard Worker GLint getBaseViewIndex() const; 274*8975f5c5SAndroid Build Coastguard Worker Extents getExtents() const; 275*8975f5c5SAndroid Build Coastguard Worker 276*8975f5c5SAndroid Build Coastguard Worker size_t getDrawbufferStateCount() const; 277*8975f5c5SAndroid Build Coastguard Worker GLenum getDrawBufferState(size_t drawBuffer) const; 278*8975f5c5SAndroid Build Coastguard Worker const DrawBuffersVector<GLenum> &getDrawBufferStates() const; 279*8975f5c5SAndroid Build Coastguard Worker void setDrawBuffers(size_t count, const GLenum *buffers); 280*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *getDrawBuffer(size_t drawBuffer) const; 281*8975f5c5SAndroid Build Coastguard Worker ComponentType getDrawbufferWriteType(size_t drawBuffer) const; 282*8975f5c5SAndroid Build Coastguard Worker ComponentTypeMask getDrawBufferTypeMask() const; 283*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask getDrawBufferMask() const; 284*8975f5c5SAndroid Build Coastguard Worker bool hasEnabledDrawBuffer() const; 285*8975f5c5SAndroid Build Coastguard Worker 286*8975f5c5SAndroid Build Coastguard Worker GLenum getReadBufferState() const; 287*8975f5c5SAndroid Build Coastguard Worker void setReadBuffer(GLenum buffer); 288*8975f5c5SAndroid Build Coastguard Worker getNumColorAttachments()289*8975f5c5SAndroid Build Coastguard Worker size_t getNumColorAttachments() const { return mState.mColorAttachments.size(); } hasDepth()290*8975f5c5SAndroid Build Coastguard Worker bool hasDepth() const { return mState.hasDepth(); } hasStencil()291*8975f5c5SAndroid Build Coastguard Worker bool hasStencil() const { return mState.hasStencil(); } getStencilBitCount()292*8975f5c5SAndroid Build Coastguard Worker GLuint getStencilBitCount() const { return mState.getStencilBitCount(); } 293*8975f5c5SAndroid Build Coastguard Worker hasExternalTextureAttachment()294*8975f5c5SAndroid Build Coastguard Worker bool hasExternalTextureAttachment() const { return mState.hasExternalTextureAttachment(); } hasYUVAttachment()295*8975f5c5SAndroid Build Coastguard Worker bool hasYUVAttachment() const { return mState.hasYUVAttachment(); } 296*8975f5c5SAndroid Build Coastguard Worker 297*8975f5c5SAndroid Build Coastguard Worker // This method calls checkStatus. 298*8975f5c5SAndroid Build Coastguard Worker int getSamples(const Context *context) const; 299*8975f5c5SAndroid Build Coastguard Worker int getReadBufferResourceSamples(const Context *context) const; 300*8975f5c5SAndroid Build Coastguard Worker 301*8975f5c5SAndroid Build Coastguard Worker angle::Result getSamplePosition(const Context *context, size_t index, GLfloat *xy) const; 302*8975f5c5SAndroid Build Coastguard Worker 303*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultWidth() const; 304*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultHeight() const; 305*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultSamples() const; 306*8975f5c5SAndroid Build Coastguard Worker bool getDefaultFixedSampleLocations() const; 307*8975f5c5SAndroid Build Coastguard Worker GLint getDefaultLayers() const; 308*8975f5c5SAndroid Build Coastguard Worker bool getFlipY() const; 309*8975f5c5SAndroid Build Coastguard Worker void setDefaultWidth(const Context *context, GLint defaultWidth); 310*8975f5c5SAndroid Build Coastguard Worker void setDefaultHeight(const Context *context, GLint defaultHeight); 311*8975f5c5SAndroid Build Coastguard Worker void setDefaultSamples(const Context *context, GLint defaultSamples); 312*8975f5c5SAndroid Build Coastguard Worker void setDefaultFixedSampleLocations(const Context *context, bool defaultFixedSampleLocations); 313*8975f5c5SAndroid Build Coastguard Worker void setDefaultLayers(GLint defaultLayers); 314*8975f5c5SAndroid Build Coastguard Worker void setFlipY(bool flipY); 315*8975f5c5SAndroid Build Coastguard Worker 316*8975f5c5SAndroid Build Coastguard Worker bool isFoveationEnabled() const; 317*8975f5c5SAndroid Build Coastguard Worker void setFoveatedFeatureBits(const GLuint features); 318*8975f5c5SAndroid Build Coastguard Worker GLuint getFoveatedFeatureBits() const; 319*8975f5c5SAndroid Build Coastguard Worker bool isFoveationConfigured() const; 320*8975f5c5SAndroid Build Coastguard Worker void configureFoveation(); 321*8975f5c5SAndroid Build Coastguard Worker void setFocalPoint(uint32_t layer, 322*8975f5c5SAndroid Build Coastguard Worker uint32_t focalPointIndex, 323*8975f5c5SAndroid Build Coastguard Worker float focalX, 324*8975f5c5SAndroid Build Coastguard Worker float focalY, 325*8975f5c5SAndroid Build Coastguard Worker float gainX, 326*8975f5c5SAndroid Build Coastguard Worker float gainY, 327*8975f5c5SAndroid Build Coastguard Worker float foveaArea); 328*8975f5c5SAndroid Build Coastguard Worker const FocalPoint &getFocalPoint(uint32_t layer, uint32_t focalPoint) const; 329*8975f5c5SAndroid Build Coastguard Worker GLuint getSupportedFoveationFeatures() const; hasAnyAttachmentChanged()330*8975f5c5SAndroid Build Coastguard Worker bool hasAnyAttachmentChanged() const { return mAttachmentChangedAfterEnablingFoveation; } 331*8975f5c5SAndroid Build Coastguard Worker 332*8975f5c5SAndroid Build Coastguard Worker void invalidateCompletenessCache(); cachedStatusValid()333*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool cachedStatusValid() { return mCachedStatus.valid(); } 334*8975f5c5SAndroid Build Coastguard Worker checkStatus(const Context * context)335*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE const FramebufferStatus &checkStatus(const Context *context) const 336*8975f5c5SAndroid Build Coastguard Worker { 337*8975f5c5SAndroid Build Coastguard Worker // The default framebuffer is always complete except when it is surfaceless in which 338*8975f5c5SAndroid Build Coastguard Worker // case it is always unsupported. 339*8975f5c5SAndroid Build Coastguard Worker ASSERT(!isDefault() || mCachedStatus.valid()); 340*8975f5c5SAndroid Build Coastguard Worker if (isDefault() || (!hasAnyDirtyBit() && mCachedStatus.valid())) 341*8975f5c5SAndroid Build Coastguard Worker { 342*8975f5c5SAndroid Build Coastguard Worker return mCachedStatus.value(); 343*8975f5c5SAndroid Build Coastguard Worker } 344*8975f5c5SAndroid Build Coastguard Worker 345*8975f5c5SAndroid Build Coastguard Worker return checkStatusImpl(context); 346*8975f5c5SAndroid Build Coastguard Worker } 347*8975f5c5SAndroid Build Coastguard Worker 348*8975f5c5SAndroid Build Coastguard Worker // Helper for checkStatus == GL_FRAMEBUFFER_COMPLETE. isComplete(const Context * context)349*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool isComplete(const Context *context) const 350*8975f5c5SAndroid Build Coastguard Worker { 351*8975f5c5SAndroid Build Coastguard Worker return checkStatus(context).isComplete(); 352*8975f5c5SAndroid Build Coastguard Worker } 353*8975f5c5SAndroid Build Coastguard Worker 354*8975f5c5SAndroid Build Coastguard Worker bool hasValidDepthStencil() const; 355*8975f5c5SAndroid Build Coastguard Worker 356*8975f5c5SAndroid Build Coastguard Worker // Returns the offset into the texture backing the default framebuffer's surface if any. Returns 357*8975f5c5SAndroid Build Coastguard Worker // zero offset otherwise. The renderer will apply the offset to scissor and viewport rects used 358*8975f5c5SAndroid Build Coastguard Worker // for draws, clears, and blits. 359*8975f5c5SAndroid Build Coastguard Worker const Offset &getSurfaceTextureOffset() const; 360*8975f5c5SAndroid Build Coastguard Worker 361*8975f5c5SAndroid Build Coastguard Worker angle::Result discard(const Context *context, size_t count, const GLenum *attachments); 362*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidate(const Context *context, size_t count, const GLenum *attachments); 363*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidateSub(const Context *context, 364*8975f5c5SAndroid Build Coastguard Worker size_t count, 365*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments, 366*8975f5c5SAndroid Build Coastguard Worker const Rectangle &area); 367*8975f5c5SAndroid Build Coastguard Worker 368*8975f5c5SAndroid Build Coastguard Worker angle::Result clear(const Context *context, GLbitfield mask); 369*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferfv(const Context *context, 370*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 371*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 372*8975f5c5SAndroid Build Coastguard Worker const GLfloat *values); 373*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferuiv(const Context *context, 374*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 375*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 376*8975f5c5SAndroid Build Coastguard Worker const GLuint *values); 377*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferiv(const Context *context, 378*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 379*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 380*8975f5c5SAndroid Build Coastguard Worker const GLint *values); 381*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferfi(const Context *context, 382*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 383*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 384*8975f5c5SAndroid Build Coastguard Worker GLfloat depth, 385*8975f5c5SAndroid Build Coastguard Worker GLint stencil); 386*8975f5c5SAndroid Build Coastguard Worker 387*8975f5c5SAndroid Build Coastguard Worker GLenum getImplementationColorReadFormat(const Context *context); 388*8975f5c5SAndroid Build Coastguard Worker GLenum getImplementationColorReadType(const Context *context); 389*8975f5c5SAndroid Build Coastguard Worker 390*8975f5c5SAndroid Build Coastguard Worker angle::Result readPixels(const Context *context, 391*8975f5c5SAndroid Build Coastguard Worker const Rectangle &area, 392*8975f5c5SAndroid Build Coastguard Worker GLenum format, 393*8975f5c5SAndroid Build Coastguard Worker GLenum type, 394*8975f5c5SAndroid Build Coastguard Worker const PixelPackState &pack, 395*8975f5c5SAndroid Build Coastguard Worker Buffer *packBuffer, 396*8975f5c5SAndroid Build Coastguard Worker void *pixels); 397*8975f5c5SAndroid Build Coastguard Worker 398*8975f5c5SAndroid Build Coastguard Worker angle::Result blit(const Context *context, 399*8975f5c5SAndroid Build Coastguard Worker const Rectangle &sourceArea, 400*8975f5c5SAndroid Build Coastguard Worker const Rectangle &destArea, 401*8975f5c5SAndroid Build Coastguard Worker GLbitfield mask, 402*8975f5c5SAndroid Build Coastguard Worker GLenum filter); isDefault()403*8975f5c5SAndroid Build Coastguard Worker bool isDefault() const { return mState.isDefault(); } 404*8975f5c5SAndroid Build Coastguard Worker 405*8975f5c5SAndroid Build Coastguard Worker enum DirtyBitType : size_t 406*8975f5c5SAndroid Build Coastguard Worker { 407*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_COLOR_ATTACHMENT_0, 408*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_COLOR_ATTACHMENT_MAX = 409*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_COLOR_ATTACHMENT_0 + IMPLEMENTATION_MAX_DRAW_BUFFERS, 410*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEPTH_ATTACHMENT = DIRTY_BIT_COLOR_ATTACHMENT_MAX, 411*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_STENCIL_ATTACHMENT, 412*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_COLOR_BUFFER_CONTENTS_0, 413*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_COLOR_BUFFER_CONTENTS_MAX = 414*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_COLOR_BUFFER_CONTENTS_0 + IMPLEMENTATION_MAX_DRAW_BUFFERS, 415*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEPTH_BUFFER_CONTENTS = DIRTY_BIT_COLOR_BUFFER_CONTENTS_MAX, 416*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_STENCIL_BUFFER_CONTENTS, 417*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DRAW_BUFFERS, 418*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_READ_BUFFER, 419*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEFAULT_WIDTH, 420*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEFAULT_HEIGHT, 421*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEFAULT_SAMPLES, 422*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS, 423*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_DEFAULT_LAYERS, 424*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_FRAMEBUFFER_SRGB_WRITE_CONTROL_MODE, 425*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_FLIP_Y, 426*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_FOVEATION, 427*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_UNKNOWN, 428*8975f5c5SAndroid Build Coastguard Worker DIRTY_BIT_MAX = DIRTY_BIT_UNKNOWN 429*8975f5c5SAndroid Build Coastguard Worker }; 430*8975f5c5SAndroid Build Coastguard Worker 431*8975f5c5SAndroid Build Coastguard Worker using DirtyBits = angle::BitSet<DIRTY_BIT_MAX>; hasAnyDirtyBit()432*8975f5c5SAndroid Build Coastguard Worker bool hasAnyDirtyBit() const { return mDirtyBits.any(); } 433*8975f5c5SAndroid Build Coastguard Worker getActiveFloat32ColorAttachmentDrawBufferMask()434*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask getActiveFloat32ColorAttachmentDrawBufferMask() const 435*8975f5c5SAndroid Build Coastguard Worker { 436*8975f5c5SAndroid Build Coastguard Worker return mFloat32ColorAttachmentBits & getDrawBufferMask(); 437*8975f5c5SAndroid Build Coastguard Worker } 438*8975f5c5SAndroid Build Coastguard Worker getActiveSharedExponentColorAttachmentDrawBufferMask()439*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask getActiveSharedExponentColorAttachmentDrawBufferMask() const 440*8975f5c5SAndroid Build Coastguard Worker { 441*8975f5c5SAndroid Build Coastguard Worker return mSharedExponentColorAttachmentBits & getDrawBufferMask(); 442*8975f5c5SAndroid Build Coastguard Worker } 443*8975f5c5SAndroid Build Coastguard Worker hasResourceThatNeedsInit()444*8975f5c5SAndroid Build Coastguard Worker bool hasResourceThatNeedsInit() const { return mState.mResourceNeedsInit.any(); } 445*8975f5c5SAndroid Build Coastguard Worker 446*8975f5c5SAndroid Build Coastguard Worker angle::Result syncState(const Context *context, 447*8975f5c5SAndroid Build Coastguard Worker GLenum framebufferBinding, 448*8975f5c5SAndroid Build Coastguard Worker Command command) const; 449*8975f5c5SAndroid Build Coastguard Worker 450*8975f5c5SAndroid Build Coastguard Worker void setWriteControlMode(SrgbWriteControlMode srgbWriteControlMode); 451*8975f5c5SAndroid Build Coastguard Worker 452*8975f5c5SAndroid Build Coastguard Worker // Observer implementation 453*8975f5c5SAndroid Build Coastguard Worker void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; 454*8975f5c5SAndroid Build Coastguard Worker 455*8975f5c5SAndroid Build Coastguard Worker bool formsRenderingFeedbackLoopWith(const Context *context) const; 456*8975f5c5SAndroid Build Coastguard Worker bool formsCopyingFeedbackLoopWith(TextureID copyTextureID, 457*8975f5c5SAndroid Build Coastguard Worker GLint copyTextureLevel, 458*8975f5c5SAndroid Build Coastguard Worker GLint copyTextureLayer) const; 459*8975f5c5SAndroid Build Coastguard Worker 460*8975f5c5SAndroid Build Coastguard Worker angle::Result ensureClearAttachmentsInitialized(const Context *context, GLbitfield mask); 461*8975f5c5SAndroid Build Coastguard Worker angle::Result ensureClearBufferAttachmentsInitialized(const Context *context, 462*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 463*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer); 464*8975f5c5SAndroid Build Coastguard Worker angle::Result ensureDrawAttachmentsInitialized(const Context *context); 465*8975f5c5SAndroid Build Coastguard Worker 466*8975f5c5SAndroid Build Coastguard Worker // Conservatively initializes both read color and depth. Blit can access the depth buffer. 467*8975f5c5SAndroid Build Coastguard Worker angle::Result ensureReadAttachmentsInitialized(const Context *context); 468*8975f5c5SAndroid Build Coastguard Worker Box getDimensions() const; 469*8975f5c5SAndroid Build Coastguard Worker 470*8975f5c5SAndroid Build Coastguard Worker // ANGLE_shader_pixel_local_storage. 471*8975f5c5SAndroid Build Coastguard Worker // Lazily creates a PixelLocalStorage object for this Framebuffer. 472*8975f5c5SAndroid Build Coastguard Worker PixelLocalStorage &getPixelLocalStorage(const Context *); 473*8975f5c5SAndroid Build Coastguard Worker // Returns nullptr if the pixel local storage object has not been created yet. peekPixelLocalStorage()474*8975f5c5SAndroid Build Coastguard Worker PixelLocalStorage *peekPixelLocalStorage() const { return mPixelLocalStorage.get(); } 475*8975f5c5SAndroid Build Coastguard Worker // Detaches the the pixel local storage object so the Context can call deleteContextObjects(). 476*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<PixelLocalStorage> detachPixelLocalStorage(); 477*8975f5c5SAndroid Build Coastguard Worker 478*8975f5c5SAndroid Build Coastguard Worker static const FramebufferID kDefaultDrawFramebufferHandle; 479*8975f5c5SAndroid Build Coastguard Worker 480*8975f5c5SAndroid Build Coastguard Worker private: 481*8975f5c5SAndroid Build Coastguard Worker bool detachResourceById(Context *context, GLenum resourceType, GLuint resourceId); 482*8975f5c5SAndroid Build Coastguard Worker bool detachMatchingAttachment(Context *context, 483*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment *attachment, 484*8975f5c5SAndroid Build Coastguard Worker GLenum matchType, 485*8975f5c5SAndroid Build Coastguard Worker GLuint matchId); 486*8975f5c5SAndroid Build Coastguard Worker FramebufferStatus checkStatusWithGLFrontEnd(const Context *context) const; 487*8975f5c5SAndroid Build Coastguard Worker const FramebufferStatus &checkStatusImpl(const Context *context) const; 488*8975f5c5SAndroid Build Coastguard Worker void setAttachment(const Context *context, 489*8975f5c5SAndroid Build Coastguard Worker GLenum type, 490*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 491*8975f5c5SAndroid Build Coastguard Worker const ImageIndex &textureIndex, 492*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *resource, 493*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews, 494*8975f5c5SAndroid Build Coastguard Worker GLuint baseViewIndex, 495*8975f5c5SAndroid Build Coastguard Worker bool isMultiview, 496*8975f5c5SAndroid Build Coastguard Worker GLsizei samplesIn); 497*8975f5c5SAndroid Build Coastguard Worker void commitWebGL1DepthStencilIfConsistent(const Context *context, 498*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews, 499*8975f5c5SAndroid Build Coastguard Worker GLuint baseViewIndex, 500*8975f5c5SAndroid Build Coastguard Worker bool isMultiview, 501*8975f5c5SAndroid Build Coastguard Worker GLsizei samples); 502*8975f5c5SAndroid Build Coastguard Worker void setAttachmentImpl(const Context *context, 503*8975f5c5SAndroid Build Coastguard Worker GLenum type, 504*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 505*8975f5c5SAndroid Build Coastguard Worker const ImageIndex &textureIndex, 506*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *resource, 507*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews, 508*8975f5c5SAndroid Build Coastguard Worker GLuint baseViewIndex, 509*8975f5c5SAndroid Build Coastguard Worker bool isMultiview, 510*8975f5c5SAndroid Build Coastguard Worker GLsizei samples); 511*8975f5c5SAndroid Build Coastguard Worker void updateAttachment(const Context *context, 512*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment *attachment, 513*8975f5c5SAndroid Build Coastguard Worker size_t dirtyBit, 514*8975f5c5SAndroid Build Coastguard Worker angle::ObserverBinding *onDirtyBinding, 515*8975f5c5SAndroid Build Coastguard Worker GLenum type, 516*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 517*8975f5c5SAndroid Build Coastguard Worker const ImageIndex &textureIndex, 518*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachmentObject *resource, 519*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews, 520*8975f5c5SAndroid Build Coastguard Worker GLuint baseViewIndex, 521*8975f5c5SAndroid Build Coastguard Worker bool isMultiview, 522*8975f5c5SAndroid Build Coastguard Worker GLsizei samples); 523*8975f5c5SAndroid Build Coastguard Worker 524*8975f5c5SAndroid Build Coastguard Worker void markAttachmentsInitialized(const DrawBufferMask &color, bool depth, bool stencil); 525*8975f5c5SAndroid Build Coastguard Worker 526*8975f5c5SAndroid Build Coastguard Worker // Checks that we have a partially masked clear: 527*8975f5c5SAndroid Build Coastguard Worker // * some color channels are masked out 528*8975f5c5SAndroid Build Coastguard Worker // * some stencil values are masked out 529*8975f5c5SAndroid Build Coastguard Worker // * scissor test partially overlaps the framebuffer 530*8975f5c5SAndroid Build Coastguard Worker bool partialClearNeedsInit(const Context *context, bool color, bool depth, bool stencil); 531*8975f5c5SAndroid Build Coastguard Worker bool partialBufferClearNeedsInit(const Context *context, GLenum bufferType); 532*8975f5c5SAndroid Build Coastguard Worker 533*8975f5c5SAndroid Build Coastguard Worker FramebufferAttachment *getAttachmentFromSubjectIndex(angle::SubjectIndex index); 534*8975f5c5SAndroid Build Coastguard Worker updateFloat32AndSharedExponentColorAttachmentBits(size_t index,const InternalFormat * format)535*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE void updateFloat32AndSharedExponentColorAttachmentBits( 536*8975f5c5SAndroid Build Coastguard Worker size_t index, 537*8975f5c5SAndroid Build Coastguard Worker const InternalFormat *format) 538*8975f5c5SAndroid Build Coastguard Worker { 539*8975f5c5SAndroid Build Coastguard Worker mFloat32ColorAttachmentBits.set(index, format->type == GL_FLOAT); 540*8975f5c5SAndroid Build Coastguard Worker mSharedExponentColorAttachmentBits.set(index, format->type == GL_UNSIGNED_INT_5_9_9_9_REV); 541*8975f5c5SAndroid Build Coastguard Worker } 542*8975f5c5SAndroid Build Coastguard Worker 543*8975f5c5SAndroid Build Coastguard Worker angle::Result syncAllDrawAttachmentState(const Context *context, Command command) const; 544*8975f5c5SAndroid Build Coastguard Worker angle::Result syncAttachmentState(const Context *context, 545*8975f5c5SAndroid Build Coastguard Worker Command command, 546*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *attachment) const; 547*8975f5c5SAndroid Build Coastguard Worker 548*8975f5c5SAndroid Build Coastguard Worker FramebufferState mState; 549*8975f5c5SAndroid Build Coastguard Worker rx::FramebufferImpl *mImpl; 550*8975f5c5SAndroid Build Coastguard Worker 551*8975f5c5SAndroid Build Coastguard Worker mutable Optional<FramebufferStatus> mCachedStatus; 552*8975f5c5SAndroid Build Coastguard Worker DrawBuffersVector<angle::ObserverBinding> mDirtyColorAttachmentBindings; 553*8975f5c5SAndroid Build Coastguard Worker angle::ObserverBinding mDirtyDepthAttachmentBinding; 554*8975f5c5SAndroid Build Coastguard Worker angle::ObserverBinding mDirtyStencilAttachmentBinding; 555*8975f5c5SAndroid Build Coastguard Worker 556*8975f5c5SAndroid Build Coastguard Worker mutable DirtyBits mDirtyBits; 557*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask mFloat32ColorAttachmentBits; 558*8975f5c5SAndroid Build Coastguard Worker DrawBufferMask mSharedExponentColorAttachmentBits; 559*8975f5c5SAndroid Build Coastguard Worker 560*8975f5c5SAndroid Build Coastguard Worker // The dirty bits guard is checked when we get a dependent state change message. We verify that 561*8975f5c5SAndroid Build Coastguard Worker // we don't set a dirty bit that isn't already set, when inside the dirty bits syncState. 562*8975f5c5SAndroid Build Coastguard Worker mutable Optional<DirtyBits> mDirtyBitsGuard; 563*8975f5c5SAndroid Build Coastguard Worker 564*8975f5c5SAndroid Build Coastguard Worker // ANGLE_shader_pixel_local_storage 565*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<PixelLocalStorage> mPixelLocalStorage; 566*8975f5c5SAndroid Build Coastguard Worker 567*8975f5c5SAndroid Build Coastguard Worker // QCOM_framebuffer_foveated 568*8975f5c5SAndroid Build Coastguard Worker bool mAttachmentChangedAfterEnablingFoveation; 569*8975f5c5SAndroid Build Coastguard Worker }; 570*8975f5c5SAndroid Build Coastguard Worker 571*8975f5c5SAndroid Build Coastguard Worker using UniqueFramebufferPointer = angle::UniqueObjectPointer<Framebuffer, Context>; 572*8975f5c5SAndroid Build Coastguard Worker 573*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 574*8975f5c5SAndroid Build Coastguard Worker 575*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_FRAMEBUFFER_H_ 576