xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/RenderTargetVk.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 // RenderTargetVk:
7*8975f5c5SAndroid Build Coastguard Worker //   Wrapper around a Vulkan renderable resource, using an ImageView.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_RENDERTARGETVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_RENDERTARGETVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/vulkan/vk_headers.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/FramebufferAttachment.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/renderer_utils.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker namespace rx
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker namespace vk
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker class FramebufferHelper;
23*8975f5c5SAndroid Build Coastguard Worker class ImageHelper;
24*8975f5c5SAndroid Build Coastguard Worker class ImageView;
25*8975f5c5SAndroid Build Coastguard Worker class Resource;
26*8975f5c5SAndroid Build Coastguard Worker class RenderPassDesc;
27*8975f5c5SAndroid Build Coastguard Worker }  // namespace vk
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker class ContextVk;
30*8975f5c5SAndroid Build Coastguard Worker class TextureVk;
31*8975f5c5SAndroid Build Coastguard Worker 
32*8975f5c5SAndroid Build Coastguard Worker enum class RenderTargetTransience
33*8975f5c5SAndroid Build Coastguard Worker {
34*8975f5c5SAndroid Build Coastguard Worker     // Regular render targets that load and store from the image.
35*8975f5c5SAndroid Build Coastguard Worker     Default,
36*8975f5c5SAndroid Build Coastguard Worker     // Multisampled-render-to-texture textures, where the implicit multisampled image is transient,
37*8975f5c5SAndroid Build Coastguard Worker     // but the resolved image is persistent.
38*8975f5c5SAndroid Build Coastguard Worker     MultisampledTransient,
39*8975f5c5SAndroid Build Coastguard Worker     // Renderable YUV textures, where the color attachment (if it exists at all) is transient,
40*8975f5c5SAndroid Build Coastguard Worker     // but the resolved image is persistent.
41*8975f5c5SAndroid Build Coastguard Worker     YuvResolveTransient,
42*8975f5c5SAndroid Build Coastguard Worker     // Multisampled-render-to-texture depth/stencil textures.
43*8975f5c5SAndroid Build Coastguard Worker     EntirelyTransient,
44*8975f5c5SAndroid Build Coastguard Worker };
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker // This is a very light-weight class that does not own to the resources it points to.
47*8975f5c5SAndroid Build Coastguard Worker // It's meant only to copy across some information from a FramebufferAttachment to the
48*8975f5c5SAndroid Build Coastguard Worker // business rendering logic. It stores Images and ImageViews by pointer for performance.
49*8975f5c5SAndroid Build Coastguard Worker class RenderTargetVk final : public FramebufferAttachmentRenderTarget
50*8975f5c5SAndroid Build Coastguard Worker {
51*8975f5c5SAndroid Build Coastguard Worker   public:
52*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk();
53*8975f5c5SAndroid Build Coastguard Worker     ~RenderTargetVk() override;
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker     // Used in std::vector initialization.
56*8975f5c5SAndroid Build Coastguard Worker     RenderTargetVk(RenderTargetVk &&other);
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker     void init(vk::ImageHelper *image,
59*8975f5c5SAndroid Build Coastguard Worker               vk::ImageViewHelper *imageViews,
60*8975f5c5SAndroid Build Coastguard Worker               vk::ImageHelper *resolveImage,
61*8975f5c5SAndroid Build Coastguard Worker               vk::ImageViewHelper *resolveImageViews,
62*8975f5c5SAndroid Build Coastguard Worker               UniqueSerial imageSiblingSerial,
63*8975f5c5SAndroid Build Coastguard Worker               gl::LevelIndex levelIndexGL,
64*8975f5c5SAndroid Build Coastguard Worker               uint32_t layerIndex,
65*8975f5c5SAndroid Build Coastguard Worker               uint32_t layerCount,
66*8975f5c5SAndroid Build Coastguard Worker               RenderTargetTransience transience);
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getDrawSubresourceSerial() const;
69*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getResolveSubresourceSerial() const;
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     // Note: RenderTargets should be called in order, with the depth/stencil onRender last.
72*8975f5c5SAndroid Build Coastguard Worker     void onColorDraw(ContextVk *contextVk,
73*8975f5c5SAndroid Build Coastguard Worker                      uint32_t framebufferLayerCount,
74*8975f5c5SAndroid Build Coastguard Worker                      vk::PackedAttachmentIndex index);
75*8975f5c5SAndroid Build Coastguard Worker     void onColorResolve(ContextVk *contextVk,
76*8975f5c5SAndroid Build Coastguard Worker                         uint32_t framebufferLayerCount,
77*8975f5c5SAndroid Build Coastguard Worker                         size_t readColorIndexGL,
78*8975f5c5SAndroid Build Coastguard Worker                         const vk::ImageView &view);
79*8975f5c5SAndroid Build Coastguard Worker     void onDepthStencilDraw(ContextVk *contextVk, uint32_t framebufferLayerCount);
80*8975f5c5SAndroid Build Coastguard Worker     void onDepthStencilResolve(ContextVk *contextVk,
81*8975f5c5SAndroid Build Coastguard Worker                                uint32_t framebufferLayerCount,
82*8975f5c5SAndroid Build Coastguard Worker                                VkImageAspectFlags aspects,
83*8975f5c5SAndroid Build Coastguard Worker                                const vk::ImageView &view);
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper &getImageForRenderPass();
86*8975f5c5SAndroid Build Coastguard Worker     const vk::ImageHelper &getImageForRenderPass() const;
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper &getResolveImageForRenderPass();
89*8975f5c5SAndroid Build Coastguard Worker     const vk::ImageHelper &getResolveImageForRenderPass() const;
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper &getImageForCopy() const;
92*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper &getImageForWrite() const;
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker     // For cube maps we use single-level single-layer 2D array views.
95*8975f5c5SAndroid Build Coastguard Worker     angle::Result getImageView(vk::Context *context, const vk::ImageView **imageViewOut) const;
96*8975f5c5SAndroid Build Coastguard Worker     angle::Result getImageViewWithColorspace(vk::Context *context,
97*8975f5c5SAndroid Build Coastguard Worker                                              gl::SrgbWriteControlMode srgbWriteContrlMode,
98*8975f5c5SAndroid Build Coastguard Worker                                              const vk::ImageView **imageViewOut) const;
99*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResolveImageView(vk::Context *context,
100*8975f5c5SAndroid Build Coastguard Worker                                       const vk::ImageView **imageViewOut) const;
101*8975f5c5SAndroid Build Coastguard Worker     angle::Result getDepthOrStencilImageView(vk::Context *context,
102*8975f5c5SAndroid Build Coastguard Worker                                              VkImageAspectFlagBits aspect,
103*8975f5c5SAndroid Build Coastguard Worker                                              const vk::ImageView **imageViewOut) const;
104*8975f5c5SAndroid Build Coastguard Worker     angle::Result getDepthOrStencilImageViewForCopy(vk::Context *context,
105*8975f5c5SAndroid Build Coastguard Worker                                                     VkImageAspectFlagBits aspect,
106*8975f5c5SAndroid Build Coastguard Worker                                                     const vk::ImageView **imageViewOut) const;
107*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResolveDepthOrStencilImageView(vk::Context *context,
108*8975f5c5SAndroid Build Coastguard Worker                                                     VkImageAspectFlagBits aspect,
109*8975f5c5SAndroid Build Coastguard Worker                                                     const vk::ImageView **imageViewOut) const;
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker     // For 3D textures, the 2D view created for render target is invalid to read from.  The
112*8975f5c5SAndroid Build Coastguard Worker     // following will return a view to the whole image (for all types, including 3D and 2DArray).
113*8975f5c5SAndroid Build Coastguard Worker     angle::Result getCopyImageView(vk::Context *context, const vk::ImageView **imageViewOut) const;
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     angle::FormatID getImageActualFormatID() const;
116*8975f5c5SAndroid Build Coastguard Worker     const angle::Format &getImageActualFormat() const;
117*8975f5c5SAndroid Build Coastguard Worker     angle::FormatID getImageIntendedFormatID() const;
118*8975f5c5SAndroid Build Coastguard Worker     const angle::Format &getImageIntendedFormat() const;
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     gl::Extents getExtents() const;
121*8975f5c5SAndroid Build Coastguard Worker     gl::Extents getRotatedExtents() const;
getLevelIndex()122*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex getLevelIndex() const { return mLevelIndexGL; }
123*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex getLevelIndexForImage(const vk::ImageHelper &image) const;
getLayerIndex()124*8975f5c5SAndroid Build Coastguard Worker     uint32_t getLayerIndex() const { return mLayerIndex; }
getLayerCount()125*8975f5c5SAndroid Build Coastguard Worker     uint32_t getLayerCount() const { return mLayerCount; }
is3DImage()126*8975f5c5SAndroid Build Coastguard Worker     bool is3DImage() const { return getOwnerOfData()->getType() == VK_IMAGE_TYPE_3D; }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     gl::ImageIndex getImageIndexForClear(uint32_t layerCount) const;
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     // Special mutator for Surface RenderTargets. Allows the Framebuffer to keep a single
131*8975f5c5SAndroid Build Coastguard Worker     // RenderTargetVk pointer.
132*8975f5c5SAndroid Build Coastguard Worker     void updateSwapchainImage(vk::ImageHelper *image,
133*8975f5c5SAndroid Build Coastguard Worker                               vk::ImageViewHelper *imageViews,
134*8975f5c5SAndroid Build Coastguard Worker                               vk::ImageHelper *resolveImage,
135*8975f5c5SAndroid Build Coastguard Worker                               vk::ImageViewHelper *resolveImageViews);
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker     angle::Result flushStagedUpdates(ContextVk *contextVk,
138*8975f5c5SAndroid Build Coastguard Worker                                      vk::ClearValuesArray *deferredClears,
139*8975f5c5SAndroid Build Coastguard Worker                                      uint32_t deferredClearIndex,
140*8975f5c5SAndroid Build Coastguard Worker                                      uint32_t framebufferLayerCount);
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     bool hasDefinedContent() const;
143*8975f5c5SAndroid Build Coastguard Worker     bool hasDefinedStencilContent() const;
144*8975f5c5SAndroid Build Coastguard Worker     // Mark content as undefined so that certain optimizations are possible such as using DONT_CARE
145*8975f5c5SAndroid Build Coastguard Worker     // as loadOp of the render target in the next renderpass.  If |preferToKeepContentsDefinedOut|
146*8975f5c5SAndroid Build Coastguard Worker     // is set to true, it's preferred to ignore the invalidation due to image format and device
147*8975f5c5SAndroid Build Coastguard Worker     // architecture properties.
148*8975f5c5SAndroid Build Coastguard Worker     void invalidateEntireContent(ContextVk *contextVk, bool *preferToKeepContentsDefinedOut);
149*8975f5c5SAndroid Build Coastguard Worker     void invalidateEntireStencilContent(ContextVk *contextVk, bool *preferToKeepContentsDefinedOut);
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker     // See the description of mTransience for details of how the following two can interact.
hasResolveAttachment()152*8975f5c5SAndroid Build Coastguard Worker     bool hasResolveAttachment() const { return mResolveImage != nullptr && !isEntirelyTransient(); }
isImageTransient()153*8975f5c5SAndroid Build Coastguard Worker     bool isImageTransient() const { return mTransience != RenderTargetTransience::Default; }
isEntirelyTransient()154*8975f5c5SAndroid Build Coastguard Worker     bool isEntirelyTransient() const
155*8975f5c5SAndroid Build Coastguard Worker     {
156*8975f5c5SAndroid Build Coastguard Worker         return mTransience == RenderTargetTransience::EntirelyTransient;
157*8975f5c5SAndroid Build Coastguard Worker     }
isYuvResolve()158*8975f5c5SAndroid Build Coastguard Worker     bool isYuvResolve() const
159*8975f5c5SAndroid Build Coastguard Worker     {
160*8975f5c5SAndroid Build Coastguard Worker         return mResolveImage != nullptr ? mResolveImage->isYuvResolve() : false;
161*8975f5c5SAndroid Build Coastguard Worker     }
162*8975f5c5SAndroid Build Coastguard Worker 
onNewFramebuffer(const vk::SharedFramebufferCacheKey & sharedFramebufferCacheKey)163*8975f5c5SAndroid Build Coastguard Worker     void onNewFramebuffer(const vk::SharedFramebufferCacheKey &sharedFramebufferCacheKey)
164*8975f5c5SAndroid Build Coastguard Worker     {
165*8975f5c5SAndroid Build Coastguard Worker         mFramebufferCacheManager.addKey(sharedFramebufferCacheKey);
166*8975f5c5SAndroid Build Coastguard Worker     }
releaseFramebuffers(ContextVk * contextVk)167*8975f5c5SAndroid Build Coastguard Worker     void releaseFramebuffers(ContextVk *contextVk)
168*8975f5c5SAndroid Build Coastguard Worker     {
169*8975f5c5SAndroid Build Coastguard Worker         mFramebufferCacheManager.releaseKeys(contextVk);
170*8975f5c5SAndroid Build Coastguard Worker     }
171*8975f5c5SAndroid Build Coastguard Worker     // Releases framebuffers and resets Image and ImageView pointers, while keeping other
172*8975f5c5SAndroid Build Coastguard Worker     // members intact, in order to allow |updateSwapchainImage| call later.
releaseImageAndViews(ContextVk * contextVk)173*8975f5c5SAndroid Build Coastguard Worker     void releaseImageAndViews(ContextVk *contextVk)
174*8975f5c5SAndroid Build Coastguard Worker     {
175*8975f5c5SAndroid Build Coastguard Worker         releaseFramebuffers(contextVk);
176*8975f5c5SAndroid Build Coastguard Worker         invalidateImageAndViews();
177*8975f5c5SAndroid Build Coastguard Worker     }
178*8975f5c5SAndroid Build Coastguard Worker     // Releases framebuffers and resets all members to the initial state.
destroy(vk::Renderer * renderer)179*8975f5c5SAndroid Build Coastguard Worker     void destroy(vk::Renderer *renderer)
180*8975f5c5SAndroid Build Coastguard Worker     {
181*8975f5c5SAndroid Build Coastguard Worker         mFramebufferCacheManager.destroyKeys(renderer);
182*8975f5c5SAndroid Build Coastguard Worker         reset();
183*8975f5c5SAndroid Build Coastguard Worker     }
184*8975f5c5SAndroid Build Coastguard Worker 
185*8975f5c5SAndroid Build Coastguard Worker     // Helpers to update rendertarget colorspace
updateWriteColorspace(gl::SrgbWriteControlMode srgbWriteControlMode)186*8975f5c5SAndroid Build Coastguard Worker     void updateWriteColorspace(gl::SrgbWriteControlMode srgbWriteControlMode)
187*8975f5c5SAndroid Build Coastguard Worker     {
188*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage && mImage->valid() && mImageViews);
189*8975f5c5SAndroid Build Coastguard Worker         mImageViews->updateSrgbWiteControlMode(*mImage, srgbWriteControlMode);
190*8975f5c5SAndroid Build Coastguard Worker     }
hasColorspaceOverrideForRead()191*8975f5c5SAndroid Build Coastguard Worker     bool hasColorspaceOverrideForRead() const
192*8975f5c5SAndroid Build Coastguard Worker     {
193*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage && mImage->valid() && mImageViews);
194*8975f5c5SAndroid Build Coastguard Worker         return mImageViews->hasColorspaceOverrideForRead(*mImage);
195*8975f5c5SAndroid Build Coastguard Worker     }
hasColorspaceOverrideForWrite()196*8975f5c5SAndroid Build Coastguard Worker     bool hasColorspaceOverrideForWrite() const
197*8975f5c5SAndroid Build Coastguard Worker     {
198*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage && mImage->valid() && mImageViews);
199*8975f5c5SAndroid Build Coastguard Worker         return mImageViews->hasColorspaceOverrideForWrite(*mImage);
200*8975f5c5SAndroid Build Coastguard Worker     }
getColorspaceOverrideFormatForWrite(angle::FormatID format)201*8975f5c5SAndroid Build Coastguard Worker     angle::FormatID getColorspaceOverrideFormatForWrite(angle::FormatID format) const
202*8975f5c5SAndroid Build Coastguard Worker     {
203*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mImage && mImage->valid() && mImageViews);
204*8975f5c5SAndroid Build Coastguard Worker         return mImageViews->getColorspaceOverrideFormatForWrite(format);
205*8975f5c5SAndroid Build Coastguard Worker     }
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker   private:
208*8975f5c5SAndroid Build Coastguard Worker     void invalidateImageAndViews();
209*8975f5c5SAndroid Build Coastguard Worker     void reset();
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     angle::Result getImageViewImpl(vk::Context *context,
212*8975f5c5SAndroid Build Coastguard Worker                                    const vk::ImageHelper &image,
213*8975f5c5SAndroid Build Coastguard Worker                                    vk::ImageViewHelper *imageViews,
214*8975f5c5SAndroid Build Coastguard Worker                                    const vk::ImageView **imageViewOut) const;
215*8975f5c5SAndroid Build Coastguard Worker     angle::Result getDepthOrStencilImageViewImpl(vk::Context *context,
216*8975f5c5SAndroid Build Coastguard Worker                                                  const vk::ImageHelper &image,
217*8975f5c5SAndroid Build Coastguard Worker                                                  vk::ImageViewHelper *imageViews,
218*8975f5c5SAndroid Build Coastguard Worker                                                  VkImageAspectFlagBits aspect,
219*8975f5c5SAndroid Build Coastguard Worker                                                  const vk::ImageView **imageViewOut) const;
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     vk::ImageOrBufferViewSubresourceSerial getSubresourceSerialImpl(
222*8975f5c5SAndroid Build Coastguard Worker         vk::ImageViewHelper *imageViews) const;
223*8975f5c5SAndroid Build Coastguard Worker 
224*8975f5c5SAndroid Build Coastguard Worker     bool isResolveImageOwnerOfData() const;
225*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper *getOwnerOfData() const;
226*8975f5c5SAndroid Build Coastguard Worker 
227*8975f5c5SAndroid Build Coastguard Worker     // The color or depth/stencil attachment of the framebuffer and its view.
228*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper *mImage;
229*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper *mImageViews;
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker     // If present, this is the corresponding resolve attachment and its view.  This is used to
232*8975f5c5SAndroid Build Coastguard Worker     // implement GL_EXT_multisampled_render_to_texture, so while the rendering is done on mImage
233*8975f5c5SAndroid Build Coastguard Worker     // during the renderpass, the resolved image is the one that actually holds the data.  This
234*8975f5c5SAndroid Build Coastguard Worker     // means that data uploads and blit are done on this image, copies are done out of this image
235*8975f5c5SAndroid Build Coastguard Worker     // etc.  This means that if there is no clear, and hasDefined*Content(), the contents of
236*8975f5c5SAndroid Build Coastguard Worker     // mResolveImage must be copied to mImage since the loadOp of the attachment must be set to
237*8975f5c5SAndroid Build Coastguard Worker     // LOAD.
238*8975f5c5SAndroid Build Coastguard Worker     vk::ImageHelper *mResolveImage;
239*8975f5c5SAndroid Build Coastguard Worker     vk::ImageViewHelper *mResolveImageViews;
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker     UniqueSerial mImageSiblingSerial;
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker     // Which subresource of the image is used as render target.
244*8975f5c5SAndroid Build Coastguard Worker     //
245*8975f5c5SAndroid Build Coastguard Worker     // |mLevelIndexGL| applies to the level index of mImage unless there is a resolve attachment,
246*8975f5c5SAndroid Build Coastguard Worker     // in which case |mLevelIndexGL| applies to the mResolveImage since mImage is always
247*8975f5c5SAndroid Build Coastguard Worker     // single-level.
248*8975f5c5SAndroid Build Coastguard Worker     //
249*8975f5c5SAndroid Build Coastguard Worker     // For single-layer render targets, |mLayerIndex| will contain the layer index and |mLayerCount|
250*8975f5c5SAndroid Build Coastguard Worker     // will be 1.  For layered render targets, |mLayerIndex| will be 0 and |mLayerCount| will be the
251*8975f5c5SAndroid Build Coastguard Worker     // number of layers in the image (or level depth, if image is 3D).  Note that blit and other
252*8975f5c5SAndroid Build Coastguard Worker     // functions that read or write to the render target always use layer 0, so this works out for
253*8975f5c5SAndroid Build Coastguard Worker     // users of |getLayerIndex()|.
254*8975f5c5SAndroid Build Coastguard Worker     gl::LevelIndex mLevelIndexGL;
255*8975f5c5SAndroid Build Coastguard Worker     uint32_t mLayerIndex;
256*8975f5c5SAndroid Build Coastguard Worker     uint32_t mLayerCount;
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker     // If resolve attachment exists, |mTransience| could be *Transient if the multisampled results
259*8975f5c5SAndroid Build Coastguard Worker     // need to be discarded.
260*8975f5c5SAndroid Build Coastguard Worker     //
261*8975f5c5SAndroid Build Coastguard Worker     // - GL_EXT_multisampled_render_to_texture[2]: this is |MultisampledTransient| for render
262*8975f5c5SAndroid Build Coastguard Worker     //   targets created from color textures, as well as color or depth/stencil renderbuffers.
263*8975f5c5SAndroid Build Coastguard Worker     // - GL_EXT_multisampled_render_to_texture2: this is |EntirelyTransient| for depth/stencil
264*8975f5c5SAndroid Build Coastguard Worker     //   textures per this extension, even though a resolve attachment is not even provided.
265*8975f5c5SAndroid Build Coastguard Worker     //
266*8975f5c5SAndroid Build Coastguard Worker     // Based on the above, we have:
267*8975f5c5SAndroid Build Coastguard Worker     //
268*8975f5c5SAndroid Build Coastguard Worker     //                     mResolveImage == nullptr
269*8975f5c5SAndroid Build Coastguard Worker     //                        Normal rendering
270*8975f5c5SAndroid Build Coastguard Worker     // Default                   No resolve
271*8975f5c5SAndroid Build Coastguard Worker     //                         storeOp = STORE
272*8975f5c5SAndroid Build Coastguard Worker     //                      Owner of data: mImage
273*8975f5c5SAndroid Build Coastguard Worker     //
274*8975f5c5SAndroid Build Coastguard Worker     //      ---------------------------------------------
275*8975f5c5SAndroid Build Coastguard Worker     //
276*8975f5c5SAndroid Build Coastguard Worker     //                     mResolveImage != nullptr
277*8975f5c5SAndroid Build Coastguard Worker     //               GL_EXT_multisampled_render_to_texture
278*8975f5c5SAndroid Build Coastguard Worker     // Multisampled               Resolve
279*8975f5c5SAndroid Build Coastguard Worker     // Transient             storeOp = DONT_CARE
280*8975f5c5SAndroid Build Coastguard Worker     //                     resolve storeOp = STORE
281*8975f5c5SAndroid Build Coastguard Worker     //                   Owner of data: mResolveImage
282*8975f5c5SAndroid Build Coastguard Worker     //
283*8975f5c5SAndroid Build Coastguard Worker     //      ---------------------------------------------
284*8975f5c5SAndroid Build Coastguard Worker     //
285*8975f5c5SAndroid Build Coastguard Worker     //                     mResolveImage != nullptr
286*8975f5c5SAndroid Build Coastguard Worker     //               GL_EXT_multisampled_render_to_texture2
287*8975f5c5SAndroid Build Coastguard Worker     // Entirely                  No Resolve
288*8975f5c5SAndroid Build Coastguard Worker     // Transient             storeOp = DONT_CARE
289*8975f5c5SAndroid Build Coastguard Worker     //                   Owner of data: mResolveImage
290*8975f5c5SAndroid Build Coastguard Worker     //
291*8975f5c5SAndroid Build Coastguard Worker     // In the above, storeOp of the resolve attachment is always STORE.  If |Default|, storeOp is
292*8975f5c5SAndroid Build Coastguard Worker     // affected by a framebuffer invalidate call.  Note that even though |EntirelyTransient| has a
293*8975f5c5SAndroid Build Coastguard Worker     // resolve attachment, it is not used.  The only purpose of |mResolveImage| is to store deferred
294*8975f5c5SAndroid Build Coastguard Worker     // clears.
295*8975f5c5SAndroid Build Coastguard Worker     RenderTargetTransience mTransience;
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker     // Track references to the cached Framebuffer object that created out of this object
298*8975f5c5SAndroid Build Coastguard Worker     vk::FramebufferCacheManager mFramebufferCacheManager;
299*8975f5c5SAndroid Build Coastguard Worker };
300*8975f5c5SAndroid Build Coastguard Worker 
301*8975f5c5SAndroid Build Coastguard Worker // A vector of rendertargets
302*8975f5c5SAndroid Build Coastguard Worker using RenderTargetVector = std::vector<RenderTargetVk>;
303*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_RENDERTARGETVK_H_
306