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