| /* | |
| * Copyright 2015 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef GrVkImage_DEFINED | |
| #define GrVkImage_DEFINED | |
| #include "GrVkResource.h" | |
| #include "GrTypesPriv.h" | |
| #include "SkTypes.h" | |
| #include "vk/GrVkDefines.h" | |
| #include "vk/GrVkTypes.h" | |
| class GrVkGpu; | |
| class GrVkImage : SkNoncopyable { | |
| private: | |
| class Resource; | |
| public: | |
| enum Wrapped { | |
| kNot_Wrapped, | |
| kAdopted_Wrapped, | |
| kBorrowed_Wrapped, | |
| }; | |
| GrVkImage(const GrVkImageInfo& info, Wrapped wrapped) | |
| : fInfo(info) | |
| , fIsBorrowed(kBorrowed_Wrapped == wrapped) { | |
| if (kBorrowed_Wrapped == wrapped) { | |
| fResource = new BorrowedResource(info.fImage, info.fAlloc, info.fImageTiling); | |
| } else { | |
| fResource = new Resource(info.fImage, info.fAlloc, info.fImageTiling); | |
| } | |
| } | |
| virtual ~GrVkImage(); | |
| VkImage image() const { return fInfo.fImage; } | |
| const GrVkAlloc& alloc() const { return fInfo.fAlloc; } | |
| VkFormat imageFormat() const { return fInfo.fFormat; } | |
| uint32_t mipLevels() const { return fInfo.fLevelCount; } | |
| const Resource* resource() const { return fResource; } | |
| bool isLinearTiled() const { | |
| return SkToBool(VK_IMAGE_TILING_LINEAR == fInfo.fImageTiling); | |
| } | |
| VkImageLayout currentLayout() const { return fInfo.fImageLayout; } | |
| void setImageLayout(const GrVkGpu* gpu, | |
| VkImageLayout newLayout, | |
| VkAccessFlags dstAccessMask, | |
| VkPipelineStageFlags dstStageMask, | |
| bool byRegion); | |
| struct ImageDesc { | |
| VkImageType fImageType; | |
| VkFormat fFormat; | |
| uint32_t fWidth; | |
| uint32_t fHeight; | |
| uint32_t fLevels; | |
| uint32_t fSamples; | |
| VkImageTiling fImageTiling; | |
| VkImageUsageFlags fUsageFlags; | |
| VkFlags fMemProps; | |
| ImageDesc() | |
| : fImageType(VK_IMAGE_TYPE_2D) | |
| , fFormat(VK_FORMAT_UNDEFINED) | |
| , fWidth(0) | |
| , fHeight(0) | |
| , fLevels(1) | |
| , fSamples(1) | |
| , fImageTiling(VK_IMAGE_TILING_OPTIMAL) | |
| , fUsageFlags(0) | |
| , fMemProps(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {} | |
| }; | |
| static bool InitImageInfo(const GrVkGpu* gpu, const ImageDesc& imageDesc, GrVkImageInfo*); | |
| // Destroys the internal VkImage and VkDeviceMemory in the GrVkImageInfo | |
| static void DestroyImageInfo(const GrVkGpu* gpu, GrVkImageInfo*); | |
| protected: | |
| void releaseImage(const GrVkGpu* gpu); | |
| void abandonImage(); | |
| void setNewResource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling); | |
| GrVkImageInfo fInfo; | |
| bool fIsBorrowed; | |
| private: | |
| class Resource : public GrVkResource { | |
| public: | |
| Resource() | |
| : INHERITED() | |
| , fImage(VK_NULL_HANDLE) { | |
| fAlloc.fMemory = VK_NULL_HANDLE; | |
| fAlloc.fOffset = 0; | |
| } | |
| Resource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling) | |
| : fImage(image), fAlloc(alloc), fImageTiling(tiling) {} | |
| ~Resource() override {} | |
| #ifdef SK_TRACE_VK_RESOURCES | |
| void dumpInfo() const override { | |
| SkDebugf("GrVkImage: %d (%d refs)\n", fImage, this->getRefCnt()); | |
| } | |
| #endif | |
| private: | |
| void freeGPUData(const GrVkGpu* gpu) const override; | |
| VkImage fImage; | |
| GrVkAlloc fAlloc; | |
| VkImageTiling fImageTiling; | |
| typedef GrVkResource INHERITED; | |
| }; | |
| // for wrapped textures | |
| class BorrowedResource : public Resource { | |
| public: | |
| BorrowedResource(VkImage image, const GrVkAlloc& alloc, VkImageTiling tiling) | |
| : Resource(image, alloc, tiling) { | |
| } | |
| private: | |
| void freeGPUData(const GrVkGpu* gpu) const override; | |
| }; | |
| const Resource* fResource; | |
| friend class GrVkRenderTarget; | |
| }; | |
| #endif |