• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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