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