xref: /aosp_15_r20/external/angle/src/libANGLE/Framebuffer.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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