1 /* 2 * Copyright 2022 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef skgpu_graphite_VulkanTexture_DEFINED 9 #define skgpu_graphite_VulkanTexture_DEFINED 10 11 #include "include/core/SkRefCnt.h" 12 #include "include/gpu/graphite/vk/VulkanGraphiteTypes.h" 13 #include "include/gpu/vk/VulkanTypes.h" 14 #include "include/private/base/SkTArray.h" 15 #include "src/gpu/graphite/Texture.h" 16 #include "src/gpu/graphite/TextureInfoPriv.h" 17 #include "src/gpu/graphite/vk/VulkanImageView.h" 18 19 #include <utility> 20 21 namespace skgpu { class MutableTextureState; } 22 23 namespace skgpu::graphite { 24 25 class Sampler; 26 class VulkanSharedContext; 27 class VulkanCommandBuffer; 28 class VulkanDescriptorSet; 29 class VulkanFramebuffer; 30 class VulkanResourceProvider; 31 struct RenderPassDesc; 32 33 class VulkanTexture : public Texture { 34 public: 35 struct CreatedImageInfo { 36 VkImage fImage = VK_NULL_HANDLE; 37 VulkanAlloc fMemoryAlloc; 38 sk_sp<MutableTextureState> fMutableState; 39 }; 40 41 static bool MakeVkImage(const VulkanSharedContext*, 42 SkISize dimensions, 43 const TextureInfo&, 44 CreatedImageInfo* outInfo); 45 46 static sk_sp<Texture> Make(const VulkanSharedContext*, 47 SkISize dimensions, 48 const TextureInfo&, 49 sk_sp<VulkanYcbcrConversion>); 50 51 static sk_sp<Texture> MakeWrapped(const VulkanSharedContext*, 52 SkISize dimensions, 53 const TextureInfo&, 54 sk_sp<MutableTextureState>, 55 VkImage, 56 const VulkanAlloc&, 57 sk_sp<VulkanYcbcrConversion>); 58 59 ~VulkanTexture() override; 60 vulkanTextureInfo()61 const VulkanTextureInfo& vulkanTextureInfo() const { 62 return TextureInfoPriv::Get<VulkanTextureInfo>(this->textureInfo()); 63 } vkImage()64 VkImage vkImage() const { return fImage; } 65 setImageLayout(VulkanCommandBuffer * buffer,VkImageLayout newLayout,VkAccessFlags dstAccessMask,VkPipelineStageFlags dstStageMask,bool byRegion)66 void setImageLayout(VulkanCommandBuffer* buffer, 67 VkImageLayout newLayout, 68 VkAccessFlags dstAccessMask, 69 VkPipelineStageFlags dstStageMask, 70 bool byRegion) const { 71 this->setImageLayoutAndQueueIndex(buffer, newLayout, dstAccessMask, dstStageMask, byRegion, 72 VK_QUEUE_FAMILY_IGNORED); 73 } 74 75 void setImageLayoutAndQueueIndex(VulkanCommandBuffer*, 76 VkImageLayout newLayout, 77 VkAccessFlags dstAccessMask, 78 VkPipelineStageFlags dstStageMask, 79 bool byRegion, 80 uint32_t newQueueFamilyIndex) const; 81 82 // This simply updates our internal tracking of the image layout and does not actually perform 83 // any gpu work. 84 void updateImageLayout(VkImageLayout); 85 86 VkImageLayout currentLayout() const; 87 uint32_t currentQueueFamilyIndex() const; 88 89 const VulkanImageView* getImageView(VulkanImageView::Usage) const; 90 91 // Helpers to use for setting the layout of the VkImage 92 static VkPipelineStageFlags LayoutToPipelineSrcStageFlags(const VkImageLayout layout); 93 static VkAccessFlags LayoutToSrcAccessMask(const VkImageLayout layout); 94 95 bool supportsInputAttachmentUsage() const; 96 97 sk_sp<VulkanDescriptorSet> getCachedSingleTextureDescriptorSet(const Sampler*) const; 98 void addCachedSingleTextureDescriptorSet(sk_sp<VulkanDescriptorSet>, 99 sk_sp<const Sampler>) const; 100 101 sk_sp<VulkanFramebuffer> getCachedFramebuffer(const RenderPassDesc& renderPassDesc, 102 const VulkanTexture* msaaTexture, 103 const VulkanTexture* depthStencilTexture) const; 104 void addCachedFramebuffer(sk_sp<VulkanFramebuffer>); 105 106 private: 107 VulkanTexture(const VulkanSharedContext* sharedContext, 108 SkISize dimensions, 109 const TextureInfo& info, 110 sk_sp<MutableTextureState>, 111 VkImage, 112 const VulkanAlloc&, 113 Ownership, 114 sk_sp<VulkanYcbcrConversion>); 115 116 void freeGpuData() override; 117 118 size_t onUpdateGpuMemorySize() override; 119 120 VkImage fImage; 121 VulkanAlloc fMemoryAlloc; 122 sk_sp<VulkanYcbcrConversion> fYcbcrConversion; 123 124 mutable skia_private::STArray<2, std::unique_ptr<const VulkanImageView>> fImageViews; 125 126 using CachedTextureDescSet = std::pair<sk_sp<const Sampler>, sk_sp<VulkanDescriptorSet>>; 127 mutable skia_private::STArray<3, CachedTextureDescSet> fCachedSingleTextureDescSets; 128 129 skia_private::STArray<3, sk_sp<VulkanFramebuffer>> fCachedFramebuffers; 130 }; 131 132 } // namespace skgpu::graphite 133 134 #endif // skgpu_graphite_VulkanTexture_DEFINED 135