Index: src/gpu/vk/GrVkImage.h |
diff --git a/src/gpu/vk/GrVkImage.h b/src/gpu/vk/GrVkImage.h |
index e73d314e5e82a8ab2d2a6ee49d8bd2680c20af6a..30b6b89a13ac5aa540a89b7a40be8743a1cc93b0 100644 |
--- a/src/gpu/vk/GrVkImage.h |
+++ b/src/gpu/vk/GrVkImage.h |
@@ -14,77 +14,41 @@ |
#include "SkTypes.h" |
#include "vk/GrVkDefines.h" |
+#include "vk/GrVkTypes.h" |
class GrVkGpu; |
class GrVkImage : SkNoncopyable { |
-public: |
- // unlike GrVkBuffer, this needs to be public so GrVkStencilAttachment can use it |
- class Resource : public GrVkResource { |
- public: |
- enum Flags { |
- kNo_Flags = 0, |
- kLinearTiling_Flag = 0x01, |
- kBorrowed_Flag = 0x02 |
- }; |
- |
- VkImage fImage; |
- VkDeviceMemory fAlloc; |
- VkFormat fFormat; |
- uint32_t fLevelCount; |
- uint32_t fFlags; |
- |
- Resource() |
- : INHERITED() |
- , fImage(VK_NULL_HANDLE) |
- , fAlloc(VK_NULL_HANDLE) |
- , fFormat(VK_FORMAT_UNDEFINED) |
- , fLevelCount(0) |
- , fFlags(kNo_Flags) {} |
- |
- Resource(VkImage image, VkDeviceMemory alloc, VkFormat format, uint32_t levelCount, |
- uint32_t flags) |
- : fImage(image), fAlloc(alloc), fFormat(format), fLevelCount(levelCount) |
- , fFlags(flags) {} |
- |
- ~Resource() override {} |
+private: |
+ class Resource; |
- private: |
- void freeGPUData(const GrVkGpu* gpu) const override; |
- |
- typedef GrVkResource INHERITED; |
- }; |
- |
- // for wrapped textures |
- class BorrowedResource : public Resource { |
- public: |
- BorrowedResource(VkImage image, VkDeviceMemory alloc, VkFormat format, uint32_t levelCount, |
- uint32_t flags) |
- : Resource(image, alloc, format, levelCount, (flags | kBorrowed_Flag)) { |
- } |
- private: |
- void freeGPUData(const GrVkGpu* gpu) const override; |
+public: |
+ enum Wrapped { |
+ kNot_Wrapped, |
+ kAdopted_Wrapped, |
+ kBorrowed_Wrapped, |
}; |
- GrVkImage(const Resource* imageResource) : fResource(imageResource) { |
- if (imageResource->fFlags & Resource::kLinearTiling_Flag) { |
- fCurrentLayout = VK_IMAGE_LAYOUT_PREINITIALIZED; |
+ GrVkImage(const GrVkImageInfo& info, Wrapped wrapped) |
+ : fInfo(info) |
+ , fIsBorrowed(kBorrowed_Wrapped == wrapped) { |
+ if (kBorrowed_Wrapped == wrapped) { |
+ fResource = new BorrowedResource(info.fImage, info.fAlloc); |
} else { |
- fCurrentLayout = VK_IMAGE_LAYOUT_UNDEFINED; |
+ fResource = new Resource(info.fImage, info.fAlloc); |
} |
- imageResource->ref(); |
} |
- |
virtual ~GrVkImage(); |
- VkImage textureImage() const { return fResource->fImage; } |
- VkDeviceMemory textureMemory() const { return fResource->fAlloc; } |
+ VkImage image() const { return fInfo.fImage; } |
+ VkDeviceMemory memory() const { return fInfo.fAlloc; } |
+ VkFormat imageFormat() const { return fInfo.fFormat; } |
const Resource* resource() const { return fResource; } |
bool isLinearTiled() const { |
- return SkToBool(fResource->fFlags & Resource::kLinearTiling_Flag); |
+ return SkToBool(VK_IMAGE_TILING_LINEAR == fInfo.fImageTiling); |
} |
- VkImageLayout currentLayout() const { return fCurrentLayout; } |
+ VkImageLayout currentLayout() const { return fInfo.fImageLayout; } |
void setImageLayout(const GrVkGpu* gpu, |
VkImageLayout newLayout, |
@@ -115,16 +79,54 @@ public: |
, fMemProps(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {} |
}; |
- static const Resource* CreateResource(const GrVkGpu* gpu, const ImageDesc& imageDesc); |
+ 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, VkDeviceMemory alloc); |
+ |
+ GrVkImageInfo fInfo; |
+ bool fIsBorrowed; |
+ |
+private: |
+ // unlike GrVkBuffer, this needs to be public so GrVkStencilAttachment can use it |
+ class Resource : public GrVkResource { |
+ public: |
+ Resource() |
+ : INHERITED() |
+ , fImage(VK_NULL_HANDLE) |
+ , fAlloc(VK_NULL_HANDLE) { |
+ } |
+ |
+ Resource(VkImage image, VkDeviceMemory alloc) : fImage(image), fAlloc(alloc) {} |
+ |
+ ~Resource() override {} |
+ |
+ private: |
+ void freeGPUData(const GrVkGpu* gpu) const override; |
+ |
+ VkImage fImage; |
+ VkDeviceMemory fAlloc; |
+ |
+ typedef GrVkResource INHERITED; |
+ }; |
+ |
+ // for wrapped textures |
+ class BorrowedResource : public Resource { |
+ public: |
+ BorrowedResource(VkImage image, VkDeviceMemory alloc) : Resource(image, alloc) { |
+ } |
+ private: |
+ void freeGPUData(const GrVkGpu* gpu) const override; |
+ }; |
+ |
const Resource* fResource; |
- VkImageLayout fCurrentLayout; |
+ friend class GrVkRenderTarget; |
}; |
#endif |