xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/FramebufferVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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 // FramebufferVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for FramebufferVk, implementing FramebufferImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FramebufferImpl.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/RenderTargetCache.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/BufferVk.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/SurfaceVk.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/UtilsVk.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_resource.h"
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker namespace rx
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker class RenderTargetVk;
26*8975f5c5SAndroid Build Coastguard Worker class WindowSurfaceVk;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker class FramebufferVk : public FramebufferImpl
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker   public:
31*8975f5c5SAndroid Build Coastguard Worker     FramebufferVk(vk::Renderer *renderer, const gl::FramebufferState &state);
32*8975f5c5SAndroid Build Coastguard Worker     ~FramebufferVk() override;
33*8975f5c5SAndroid Build Coastguard Worker     void destroy(const gl::Context *context) override;
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     angle::Result discard(const gl::Context *context,
36*8975f5c5SAndroid Build Coastguard Worker                           size_t count,
37*8975f5c5SAndroid Build Coastguard Worker                           const GLenum *attachments) override;
38*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidate(const gl::Context *context,
39*8975f5c5SAndroid Build Coastguard Worker                              size_t count,
40*8975f5c5SAndroid Build Coastguard Worker                              const GLenum *attachments) override;
41*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidateSub(const gl::Context *context,
42*8975f5c5SAndroid Build Coastguard Worker                                 size_t count,
43*8975f5c5SAndroid Build Coastguard Worker                                 const GLenum *attachments,
44*8975f5c5SAndroid Build Coastguard Worker                                 const gl::Rectangle &area) override;
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker     angle::Result clear(const gl::Context *context, GLbitfield mask) override;
47*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearBufferfv(const gl::Context *context,
48*8975f5c5SAndroid Build Coastguard Worker                                 GLenum buffer,
49*8975f5c5SAndroid Build Coastguard Worker                                 GLint drawbuffer,
50*8975f5c5SAndroid Build Coastguard Worker                                 const GLfloat *values) override;
51*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearBufferuiv(const gl::Context *context,
52*8975f5c5SAndroid Build Coastguard Worker                                  GLenum buffer,
53*8975f5c5SAndroid Build Coastguard Worker                                  GLint drawbuffer,
54*8975f5c5SAndroid Build Coastguard Worker                                  const GLuint *values) override;
55*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearBufferiv(const gl::Context *context,
56*8975f5c5SAndroid Build Coastguard Worker                                 GLenum buffer,
57*8975f5c5SAndroid Build Coastguard Worker                                 GLint drawbuffer,
58*8975f5c5SAndroid Build Coastguard Worker                                 const GLint *values) override;
59*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearBufferfi(const gl::Context *context,
60*8975f5c5SAndroid Build Coastguard Worker                                 GLenum buffer,
61*8975f5c5SAndroid Build Coastguard Worker                                 GLint drawbuffer,
62*8975f5c5SAndroid Build Coastguard Worker                                 GLfloat depth,
63*8975f5c5SAndroid Build Coastguard Worker                                 GLint stencil) override;
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker     const gl::InternalFormat &getImplementationColorReadFormat(
66*8975f5c5SAndroid Build Coastguard Worker         const gl::Context *context) const override;
67*8975f5c5SAndroid Build Coastguard Worker     angle::Result readPixels(const gl::Context *context,
68*8975f5c5SAndroid Build Coastguard Worker                              const gl::Rectangle &area,
69*8975f5c5SAndroid Build Coastguard Worker                              GLenum format,
70*8975f5c5SAndroid Build Coastguard Worker                              GLenum type,
71*8975f5c5SAndroid Build Coastguard Worker                              const gl::PixelPackState &pack,
72*8975f5c5SAndroid Build Coastguard Worker                              gl::Buffer *packBuffer,
73*8975f5c5SAndroid Build Coastguard Worker                              void *pixels) override;
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     angle::Result blit(const gl::Context *context,
76*8975f5c5SAndroid Build Coastguard Worker                        const gl::Rectangle &sourceArea,
77*8975f5c5SAndroid Build Coastguard Worker                        const gl::Rectangle &destArea,
78*8975f5c5SAndroid Build Coastguard Worker                        GLbitfield mask,
79*8975f5c5SAndroid Build Coastguard Worker                        GLenum filter) override;
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker     gl::FramebufferStatus checkStatus(const gl::Context *context) const override;
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     angle::Result syncState(const gl::Context *context,
84*8975f5c5SAndroid Build Coastguard Worker                             GLenum binding,
85*8975f5c5SAndroid Build Coastguard Worker                             const gl::Framebuffer::DirtyBits &dirtyBits,
86*8975f5c5SAndroid Build Coastguard Worker                             gl::Command command) override;
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     angle::Result getSamplePosition(const gl::Context *context,
89*8975f5c5SAndroid Build Coastguard Worker                                     size_t index,
90*8975f5c5SAndroid Build Coastguard Worker                                     GLfloat *xy) const override;
91*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk *getDepthStencilRenderTarget() const;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     // Internal helper function for readPixels operations.
94*8975f5c5SAndroid Build Coastguard Worker     angle::Result readPixelsImpl(ContextVk *contextVk,
95*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Rectangle &area,
96*8975f5c5SAndroid Build Coastguard Worker                                  const PackPixelsParams &packPixelsParams,
97*8975f5c5SAndroid Build Coastguard Worker                                  VkImageAspectFlagBits copyAspectFlags,
98*8975f5c5SAndroid Build Coastguard Worker                                  RenderTargetVk *renderTarget,
99*8975f5c5SAndroid Build Coastguard Worker                                  void *pixels);
100*8975f5c5SAndroid Build Coastguard Worker 
101*8975f5c5SAndroid Build Coastguard Worker     gl::Extents getReadImageExtents() const;
102*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle getNonRotatedCompleteRenderArea() const;
103*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle getRotatedCompleteRenderArea(ContextVk *contextVk) const;
104*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle getRotatedScissoredRenderArea(ContextVk *contextVk) const;
105*8975f5c5SAndroid Build Coastguard Worker     // Returns render area with deferred clears in consideration. When deferred clear is used
106*8975f5c5SAndroid Build Coastguard Worker     // in the render pass, the render area must cover the whole framebuffer.
107*8975f5c5SAndroid Build Coastguard Worker     gl::Rectangle getRenderArea(ContextVk *contextVk) const;
getLayerCount()108*8975f5c5SAndroid Build Coastguard Worker     uint32_t getLayerCount() const { return mCurrentFramebufferDesc.getLayerCount(); }
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     const gl::DrawBufferMask &getEmulatedAlphaAttachmentMask() const;
111*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk *getColorDrawRenderTarget(size_t colorIndexGL) const;
112*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk *getColorReadRenderTarget() const;
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker     angle::Result startNewRenderPass(ContextVk *contextVk,
115*8975f5c5SAndroid Build Coastguard Worker                                      const gl::Rectangle &renderArea,
116*8975f5c5SAndroid Build Coastguard Worker                                      vk::RenderPassCommandBuffer **commandBufferOut,
117*8975f5c5SAndroid Build Coastguard Worker                                      bool *renderPassDescChangedOut);
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker     GLint getSamples() const;
120*8975f5c5SAndroid Build Coastguard Worker 
getRenderPassDesc()121*8975f5c5SAndroid Build Coastguard Worker     const vk::RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; }
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker     angle::Result getFramebuffer(ContextVk *contextVk, vk::RenderPassFramebuffer *framebufferOut);
124*8975f5c5SAndroid Build Coastguard Worker 
hasDeferredClears()125*8975f5c5SAndroid Build Coastguard Worker     bool hasDeferredClears() const { return !mDeferredClears.empty(); }
hasDeferredDepthClear()126*8975f5c5SAndroid Build Coastguard Worker     bool hasDeferredDepthClear() const { return mDeferredClears.testDepth(); }
hasDeferredStencilClear()127*8975f5c5SAndroid Build Coastguard Worker     bool hasDeferredStencilClear() const { return mDeferredClears.testStencil(); }
128*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushDepthStencilDeferredClear(ContextVk *contextVk,
129*8975f5c5SAndroid Build Coastguard Worker                                                  VkImageAspectFlagBits aspect);
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker     void switchToColorFramebufferFetchMode(ContextVk *contextVk, bool hasColorFramebufferFetch);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     bool updateLegacyDither(ContextVk *contextVk);
134*8975f5c5SAndroid Build Coastguard Worker 
setBackbuffer(WindowSurfaceVk * backbuffer)135*8975f5c5SAndroid Build Coastguard Worker     void setBackbuffer(WindowSurfaceVk *backbuffer) { mBackbuffer = backbuffer; }
getBackbuffer()136*8975f5c5SAndroid Build Coastguard Worker     WindowSurfaceVk *getBackbuffer() const { return mBackbuffer; }
137*8975f5c5SAndroid Build Coastguard Worker 
138*8975f5c5SAndroid Build Coastguard Worker     void releaseCurrentFramebuffer(ContextVk *contextVk);
139*8975f5c5SAndroid Build Coastguard Worker 
getLastRenderPassQueueSerial()140*8975f5c5SAndroid Build Coastguard Worker     const QueueSerial &getLastRenderPassQueueSerial() const { return mLastRenderPassQueueSerial; }
141*8975f5c5SAndroid Build Coastguard Worker 
hasAnyExternalAttachments()142*8975f5c5SAndroid Build Coastguard Worker     bool hasAnyExternalAttachments() const { return mIsExternalColorAttachments.any(); }
143*8975f5c5SAndroid Build Coastguard Worker 
hasFrontBufferUsage()144*8975f5c5SAndroid Build Coastguard Worker     bool hasFrontBufferUsage() const
145*8975f5c5SAndroid Build Coastguard Worker     {
146*8975f5c5SAndroid Build Coastguard Worker         return (mAttachmentHasFrontBufferUsage & mState.getColorAttachmentsMask()).any();
147*8975f5c5SAndroid Build Coastguard Worker     }
148*8975f5c5SAndroid Build Coastguard Worker 
isFoveationEnabled()149*8975f5c5SAndroid Build Coastguard Worker     bool isFoveationEnabled() { return mFoveationState.isFoveated(); }
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker   private:
152*8975f5c5SAndroid Build Coastguard Worker     enum class ClearWithCommand
153*8975f5c5SAndroid Build Coastguard Worker     {
154*8975f5c5SAndroid Build Coastguard Worker         Always,
155*8975f5c5SAndroid Build Coastguard Worker         OptimizeWithLoadOp,
156*8975f5c5SAndroid Build Coastguard Worker     };
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker     enum class RenderTargetImage
159*8975f5c5SAndroid Build Coastguard Worker     {
160*8975f5c5SAndroid Build Coastguard Worker         Attachment,
161*8975f5c5SAndroid Build Coastguard Worker         Resolve,
162*8975f5c5SAndroid Build Coastguard Worker         FragmentShadingRate,
163*8975f5c5SAndroid Build Coastguard Worker     };
164*8975f5c5SAndroid Build Coastguard Worker 
165*8975f5c5SAndroid Build Coastguard Worker     struct RenderTargetInfo
166*8975f5c5SAndroid Build Coastguard Worker     {
RenderTargetInfoRenderTargetInfo167*8975f5c5SAndroid Build Coastguard Worker         RenderTargetInfo() : renderTarget(nullptr), renderTargetImage(RenderTargetImage::Attachment)
168*8975f5c5SAndroid Build Coastguard Worker         {}
RenderTargetInfoRenderTargetInfo169*8975f5c5SAndroid Build Coastguard Worker         RenderTargetInfo(RenderTargetVk *renderTarget, RenderTargetImage renderTargetImage)
170*8975f5c5SAndroid Build Coastguard Worker             : renderTarget(renderTarget), renderTargetImage(renderTargetImage)
171*8975f5c5SAndroid Build Coastguard Worker         {}
172*8975f5c5SAndroid Build Coastguard Worker         RenderTargetVk *renderTarget;
173*8975f5c5SAndroid Build Coastguard Worker         RenderTargetImage renderTargetImage;
174*8975f5c5SAndroid Build Coastguard Worker     };
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker     // Returns the attachments to be used to create a framebuffer.  The views returned in
177*8975f5c5SAndroid Build Coastguard Worker     // |unpackedAttachments| are not necessarily packed, but the render targets in
178*8975f5c5SAndroid Build Coastguard Worker     // |packedRenderTargetsInfoOut| are.  In particular, the resolve attachment views need to stay
179*8975f5c5SAndroid Build Coastguard Worker     // sparse to be placed in |RenderPassFramebuffer|, but the calling function will have to pack
180*8975f5c5SAndroid Build Coastguard Worker     // them to match the render buffers before creating a framebuffer.
181*8975f5c5SAndroid Build Coastguard Worker     angle::Result getAttachmentsAndRenderTargets(
182*8975f5c5SAndroid Build Coastguard Worker         vk::Context *context,
183*8975f5c5SAndroid Build Coastguard Worker         vk::FramebufferAttachmentsVector<VkImageView> *unpackedAttachments,
184*8975f5c5SAndroid Build Coastguard Worker         vk::FramebufferAttachmentsVector<RenderTargetInfo> *packedRenderTargetsInfoOut);
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker     angle::Result createNewFramebuffer(
187*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
188*8975f5c5SAndroid Build Coastguard Worker         uint32_t framebufferWidth,
189*8975f5c5SAndroid Build Coastguard Worker         const uint32_t framebufferHeight,
190*8975f5c5SAndroid Build Coastguard Worker         const uint32_t framebufferLayers,
191*8975f5c5SAndroid Build Coastguard Worker         const vk::FramebufferAttachmentsVector<VkImageView> &unpackedAttachments,
192*8975f5c5SAndroid Build Coastguard Worker         const vk::FramebufferAttachmentsVector<RenderTargetInfo> &renderTargetsInfo);
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker     // The 'in' rectangles must be clipped to the scissor and FBO. The clipping is done in 'blit'.
195*8975f5c5SAndroid Build Coastguard Worker     angle::Result blitWithCommand(ContextVk *contextVk,
196*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Rectangle &sourceArea,
197*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Rectangle &destArea,
198*8975f5c5SAndroid Build Coastguard Worker                                   RenderTargetVk *readRenderTarget,
199*8975f5c5SAndroid Build Coastguard Worker                                   RenderTargetVk *drawRenderTarget,
200*8975f5c5SAndroid Build Coastguard Worker                                   GLenum filter,
201*8975f5c5SAndroid Build Coastguard Worker                                   bool colorBlit,
202*8975f5c5SAndroid Build Coastguard Worker                                   bool depthBlit,
203*8975f5c5SAndroid Build Coastguard Worker                                   bool stencilBlit,
204*8975f5c5SAndroid Build Coastguard Worker                                   bool flipX,
205*8975f5c5SAndroid Build Coastguard Worker                                   bool flipY);
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker     // Resolve color with subpass attachment
208*8975f5c5SAndroid Build Coastguard Worker     angle::Result resolveColorWithSubpass(ContextVk *contextVk,
209*8975f5c5SAndroid Build Coastguard Worker                                           const UtilsVk::BlitResolveParameters &params);
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     // Resolve depth/stencil with subpass attachment
212*8975f5c5SAndroid Build Coastguard Worker     angle::Result resolveDepthStencilWithSubpass(ContextVk *contextVk,
213*8975f5c5SAndroid Build Coastguard Worker                                                  const UtilsVk::BlitResolveParameters &params,
214*8975f5c5SAndroid Build Coastguard Worker                                                  VkImageAspectFlags aspects);
215*8975f5c5SAndroid Build Coastguard Worker 
216*8975f5c5SAndroid Build Coastguard Worker     // Resolve color with vkCmdResolveImage
217*8975f5c5SAndroid Build Coastguard Worker     angle::Result resolveColorWithCommand(ContextVk *contextVk,
218*8975f5c5SAndroid Build Coastguard Worker                                           const UtilsVk::BlitResolveParameters &params,
219*8975f5c5SAndroid Build Coastguard Worker                                           vk::ImageHelper *srcImage);
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearImpl(const gl::Context *context,
222*8975f5c5SAndroid Build Coastguard Worker                             gl::DrawBufferMask clearColorBuffers,
223*8975f5c5SAndroid Build Coastguard Worker                             bool clearDepth,
224*8975f5c5SAndroid Build Coastguard Worker                             bool clearStencil,
225*8975f5c5SAndroid Build Coastguard Worker                             const VkClearColorValue &clearColorValue,
226*8975f5c5SAndroid Build Coastguard Worker                             const VkClearDepthStencilValue &clearDepthStencilValue);
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker     void mergeClearsWithDeferredClears(
229*8975f5c5SAndroid Build Coastguard Worker         gl::DrawBufferMask clearColorBuffers,
230*8975f5c5SAndroid Build Coastguard Worker         bool clearDepth,
231*8975f5c5SAndroid Build Coastguard Worker         bool clearStencil,
232*8975f5c5SAndroid Build Coastguard Worker         const gl::DrawBuffersArray<VkClearColorValue> &clearColorValues,
233*8975f5c5SAndroid Build Coastguard Worker         const VkClearDepthStencilValue &clearDepthStencilValue);
234*8975f5c5SAndroid Build Coastguard Worker     angle::Result clearWithDraw(ContextVk *contextVk,
235*8975f5c5SAndroid Build Coastguard Worker                                 const gl::Rectangle &clearArea,
236*8975f5c5SAndroid Build Coastguard Worker                                 gl::DrawBufferMask clearColorBuffers,
237*8975f5c5SAndroid Build Coastguard Worker                                 bool clearDepth,
238*8975f5c5SAndroid Build Coastguard Worker                                 bool clearStencil,
239*8975f5c5SAndroid Build Coastguard Worker                                 gl::BlendStateExt::ColorMaskStorage::Type colorMasks,
240*8975f5c5SAndroid Build Coastguard Worker                                 uint8_t stencilMask,
241*8975f5c5SAndroid Build Coastguard Worker                                 const gl::DrawBuffersArray<VkClearColorValue> &clearColorValues,
242*8975f5c5SAndroid Build Coastguard Worker                                 const VkClearDepthStencilValue &clearDepthStencilValue);
243*8975f5c5SAndroid Build Coastguard Worker     void restageDeferredClears(ContextVk *contextVk);
244*8975f5c5SAndroid Build Coastguard Worker     void restageDeferredClearsForReadFramebuffer(ContextVk *contextVk);
245*8975f5c5SAndroid Build Coastguard Worker     void restageDeferredClearsImpl(ContextVk *contextVk);
246*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushDeferredClears(ContextVk *contextVk);
247*8975f5c5SAndroid Build Coastguard Worker     void clearWithCommand(ContextVk *contextVk,
248*8975f5c5SAndroid Build Coastguard Worker                           const gl::Rectangle &scissoredRenderArea,
249*8975f5c5SAndroid Build Coastguard Worker                           ClearWithCommand behavior,
250*8975f5c5SAndroid Build Coastguard Worker                           vk::ClearValuesArray *clears);
251*8975f5c5SAndroid Build Coastguard Worker     void clearWithLoadOp(ContextVk *contextVk);
252*8975f5c5SAndroid Build Coastguard Worker     void updateActiveColorMasks(size_t colorIndex, bool r, bool g, bool b, bool a);
253*8975f5c5SAndroid Build Coastguard Worker     void updateRenderPassDesc(ContextVk *contextVk);
254*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateColorAttachment(const gl::Context *context, uint32_t colorIndex);
255*8975f5c5SAndroid Build Coastguard Worker     void updateColorAttachmentColorspace(gl::SrgbWriteControlMode srgbWriteControlMode);
256*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateDepthStencilAttachment(const gl::Context *context);
257*8975f5c5SAndroid Build Coastguard Worker     void updateDepthStencilAttachmentSerial(ContextVk *contextVk);
258*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushColorAttachmentUpdates(const gl::Context *context,
259*8975f5c5SAndroid Build Coastguard Worker                                               bool deferClears,
260*8975f5c5SAndroid Build Coastguard Worker                                               uint32_t colorIndex);
261*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushDepthStencilAttachmentUpdates(const gl::Context *context, bool deferClears);
262*8975f5c5SAndroid Build Coastguard Worker     angle::Result invalidateImpl(ContextVk *contextVk,
263*8975f5c5SAndroid Build Coastguard Worker                                  size_t count,
264*8975f5c5SAndroid Build Coastguard Worker                                  const GLenum *attachments,
265*8975f5c5SAndroid Build Coastguard Worker                                  bool isSubInvalidate,
266*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Rectangle &invalidateArea);
267*8975f5c5SAndroid Build Coastguard Worker 
268*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk *getReadPixelsRenderTarget(GLenum format) const;
269*8975f5c5SAndroid Build Coastguard Worker     VkImageAspectFlagBits getReadPixelsAspectFlags(GLenum format) const;
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker     VkClearValue getCorrectedColorClearValue(size_t colorIndexGL,
272*8975f5c5SAndroid Build Coastguard Worker                                              const VkClearColorValue &clearColor) const;
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     void updateLayerCount();
275*8975f5c5SAndroid Build Coastguard Worker 
276*8975f5c5SAndroid Build Coastguard Worker     angle::Result ensureFragmentShadingRateImageAndViewInitialized(
277*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
278*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateAttachmentWidth,
279*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateAttachmentHeight);
280*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateFragmentShadingRateWithCPU(
281*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
282*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateWidth,
283*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateHeight,
284*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateBlockWidth,
285*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateBlockHeight,
286*8975f5c5SAndroid Build Coastguard Worker         const uint32_t foveatedAttachmentWidth,
287*8975f5c5SAndroid Build Coastguard Worker         const uint32_t foveatedAttachmentHeight,
288*8975f5c5SAndroid Build Coastguard Worker         const std::vector<gl::FocalPoint> &activeFocalPoints);
289*8975f5c5SAndroid Build Coastguard Worker     angle::Result generateFragmentShadingRateWithCompute(
290*8975f5c5SAndroid Build Coastguard Worker         ContextVk *contextVk,
291*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateWidth,
292*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateHeight,
293*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateBlockWidth,
294*8975f5c5SAndroid Build Coastguard Worker         const uint32_t fragmentShadingRateBlockHeight,
295*8975f5c5SAndroid Build Coastguard Worker         const uint32_t foveatedAttachmentWidth,
296*8975f5c5SAndroid Build Coastguard Worker         const uint32_t foveatedAttachmentHeight,
297*8975f5c5SAndroid Build Coastguard Worker         const std::vector<gl::FocalPoint> &activeFocalPoints);
298*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateFragmentShadingRateAttachment(ContextVk *contextVk,
299*8975f5c5SAndroid Build Coastguard Worker                                                       const gl::FoveationState &foveationState,
300*8975f5c5SAndroid Build Coastguard Worker                                                       const gl::Extents &foveatedAttachmentSize);
301*8975f5c5SAndroid Build Coastguard Worker     angle::Result updateFoveationState(ContextVk *contextVk,
302*8975f5c5SAndroid Build Coastguard Worker                                        const gl::FoveationState &newFoveationState,
303*8975f5c5SAndroid Build Coastguard Worker                                        const gl::Extents &foveatedAttachmentSize);
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     void insertCache(ContextVk *contextVk,
306*8975f5c5SAndroid Build Coastguard Worker                      const vk::FramebufferDesc &desc,
307*8975f5c5SAndroid Build Coastguard Worker                      vk::FramebufferHelper &&newFramebuffer);
308*8975f5c5SAndroid Build Coastguard Worker 
309*8975f5c5SAndroid Build Coastguard Worker     WindowSurfaceVk *mBackbuffer;
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker     vk::RenderPassDesc mRenderPassDesc;
312*8975f5c5SAndroid Build Coastguard Worker     RenderTargetCache<RenderTargetVk> mRenderTargetCache;
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker     // This variable is used to quickly compute if we need to do a masked clear. If a color
315*8975f5c5SAndroid Build Coastguard Worker     // channel is masked out, we check against the Framebuffer Attachments (RenderTargets) to see
316*8975f5c5SAndroid Build Coastguard Worker     // if the masked out channel is present in any of the attachments.
317*8975f5c5SAndroid Build Coastguard Worker     gl::BlendStateExt::ColorMaskStorage::Type mActiveColorComponentMasksForClear;
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker     // When we draw to the framebuffer, and the real format has an alpha channel but the format of
320*8975f5c5SAndroid Build Coastguard Worker     // the framebuffer does not, we need to mask out the alpha channel. This DrawBufferMask will
321*8975f5c5SAndroid Build Coastguard Worker     // contain the mask to apply to the alpha channel when drawing.
322*8975f5c5SAndroid Build Coastguard Worker     gl::DrawBufferMask mEmulatedAlphaAttachmentMask;
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     // mCurrentFramebufferDesc is used to detect framebuffer changes using its serials. Therefore,
325*8975f5c5SAndroid Build Coastguard Worker     // it must be maintained even when using the imageless framebuffer extension.
326*8975f5c5SAndroid Build Coastguard Worker     vk::FramebufferDesc mCurrentFramebufferDesc;
327*8975f5c5SAndroid Build Coastguard Worker 
328*8975f5c5SAndroid Build Coastguard Worker     // The framebuffer cache actually owns the Framebuffer object and manages its lifetime. We just
329*8975f5c5SAndroid Build Coastguard Worker     // store the current VkFramebuffer handle here that associated with mCurrentFramebufferDesc.
330*8975f5c5SAndroid Build Coastguard Worker     vk::Framebuffer mCurrentFramebuffer;
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker     vk::ClearValuesArray mDeferredClears;
333*8975f5c5SAndroid Build Coastguard Worker 
334*8975f5c5SAndroid Build Coastguard Worker     // Whether any of the color attachments are an external image such as dmabuf, AHB etc.  In such
335*8975f5c5SAndroid Build Coastguard Worker     // cases, some optimizations are disabled such as deferred clears because the results need to be
336*8975f5c5SAndroid Build Coastguard Worker     // made externally available.
337*8975f5c5SAndroid Build Coastguard Worker     gl::DrawBufferMask mIsExternalColorAttachments;
338*8975f5c5SAndroid Build Coastguard Worker     gl::DrawBufferMask mAttachmentHasFrontBufferUsage;
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker     bool mIsCurrentFramebufferCached;
341*8975f5c5SAndroid Build Coastguard Worker     bool mIsYUVResolve;
342*8975f5c5SAndroid Build Coastguard Worker 
343*8975f5c5SAndroid Build Coastguard Worker     gl::FoveationState mFoveationState;
344*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper mFragmentShadingRateImage;
345*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper mFragmentShadingRateImageView;
346*8975f5c5SAndroid Build Coastguard Worker 
347*8975f5c5SAndroid Build Coastguard Worker     // Serial of the render pass this framebuffer has opened, if any.
348*8975f5c5SAndroid Build Coastguard Worker     QueueSerial mLastRenderPassQueueSerial;
349*8975f5c5SAndroid Build Coastguard Worker };
350*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
351*8975f5c5SAndroid Build Coastguard Worker 
352*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_FRAMEBUFFERVK_H_
353