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/vk/VulkanTypes.h" 13 #include "include/private/base/SkTArray.h" 14 #include "src/gpu/graphite/Texture.h" 15 #include "src/gpu/graphite/vk/VulkanImageView.h" 16 17 #include <utility> 18 19 namespace skgpu { class MutableTextureState; } 20 21 namespace skgpu::graphite { 22 23 class VulkanSharedContext; 24 class VulkanCommandBuffer; 25 class VulkanResourceProvider; 26 27 class VulkanTexture : public Texture { 28 public: 29 struct CreatedImageInfo { 30 VkImage fImage = VK_NULL_HANDLE; 31 VulkanAlloc fMemoryAlloc; 32 sk_sp<MutableTextureState> fMutableState; 33 }; 34 35 static bool MakeVkImage(const VulkanSharedContext*, 36 SkISize dimensions, 37 const TextureInfo&, 38 CreatedImageInfo* outInfo); 39 40 static sk_sp<Texture> Make(const VulkanSharedContext*, 41 SkISize dimensions, 42 const TextureInfo&, 43 skgpu::Budgeted, 44 sk_sp<VulkanYcbcrConversion>); 45 46 static sk_sp<Texture> MakeWrapped(const VulkanSharedContext*, 47 SkISize dimensions, 48 const TextureInfo&, 49 sk_sp<MutableTextureState>, 50 VkImage, 51 const VulkanAlloc&, 52 sk_sp<VulkanYcbcrConversion>); 53 ~VulkanTexture()54 ~VulkanTexture() override {} 55 vkImage()56 VkImage vkImage() const { return fImage; } 57 setImageLayout(VulkanCommandBuffer * buffer,VkImageLayout newLayout,VkAccessFlags dstAccessMask,VkPipelineStageFlags dstStageMask,bool byRegion)58 void setImageLayout(VulkanCommandBuffer* buffer, 59 VkImageLayout newLayout, 60 VkAccessFlags dstAccessMask, 61 VkPipelineStageFlags dstStageMask, 62 bool byRegion) const { 63 this->setImageLayoutAndQueueIndex(buffer, newLayout, dstAccessMask, dstStageMask, byRegion, 64 VK_QUEUE_FAMILY_IGNORED); 65 } 66 67 void setImageLayoutAndQueueIndex(VulkanCommandBuffer*, 68 VkImageLayout newLayout, 69 VkAccessFlags dstAccessMask, 70 VkPipelineStageFlags dstStageMask, 71 bool byRegion, 72 uint32_t newQueueFamilyIndex) const; 73 74 // This simply updates our internal tracking of the image layout and does not actually perform 75 // any gpu work. 76 void updateImageLayout(VkImageLayout); 77 78 VkImageLayout currentLayout() const; 79 uint32_t currentQueueFamilyIndex() const; 80 81 const VulkanImageView* getImageView(VulkanImageView::Usage) const; 82 83 // Helpers to use for setting the layout of the VkImage 84 static VkPipelineStageFlags LayoutToPipelineSrcStageFlags(const VkImageLayout layout); 85 static VkAccessFlags LayoutToSrcAccessMask(const VkImageLayout layout); 86 87 bool supportsInputAttachmentUsage() const; 88 89 private: 90 VulkanTexture(const VulkanSharedContext* sharedContext, 91 SkISize dimensions, 92 const TextureInfo& info, 93 sk_sp<MutableTextureState>, 94 VkImage, 95 const VulkanAlloc&, 96 Ownership, 97 skgpu::Budgeted, 98 sk_sp<VulkanYcbcrConversion>); 99 100 void freeGpuData() override; 101 102 VkImage fImage; 103 VulkanAlloc fMemoryAlloc; 104 sk_sp<VulkanYcbcrConversion> fYcbcrConversion; 105 106 mutable skia_private::STArray<2, std::unique_ptr<const VulkanImageView>> fImageViews; 107 }; 108 109 } // namespace skgpu::graphite 110 111 #endif // skgpu_graphite_VulkanTexture_DEFINED 112 113