| |
| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrVkTypes_DEFINED |
| #define GrVkTypes_DEFINED |
| |
| #include <functional> |
| #include "GrTypes.h" |
| #include "GrVkDefines.h" |
| |
| typedef intptr_t GrVkBackendMemory; |
| |
| /** |
| * Types for interacting with Vulkan resources created externally to Skia. GrBackendObjects for |
| * Vulkan textures are really const GrVkImageInfo* |
| */ |
| struct GrVkAlloc { |
| GrVkAlloc() |
| : fMemory(VK_NULL_HANDLE) |
| , fOffset(0) |
| , fSize(0) |
| , fFlags(0) |
| , fBackendMemory(0) |
| , fUsesSystemHeap(false) {} |
| |
| GrVkAlloc(VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, uint32_t flags) |
| : fMemory(memory) |
| , fOffset(offset) |
| , fSize(size) |
| , fFlags(flags) |
| , fBackendMemory(0) |
| , fUsesSystemHeap(false) {} |
| |
| VkDeviceMemory fMemory; // can be VK_NULL_HANDLE iff is an RT and is borrowed |
| VkDeviceSize fOffset; |
| VkDeviceSize fSize; // this can be indeterminate iff Tex uses borrow semantics |
| uint32_t fFlags; |
| GrVkBackendMemory fBackendMemory; // handle to memory allocated via GrVkMemoryAllocator. |
| |
| enum Flag { |
| kNoncoherent_Flag = 0x1, // memory must be flushed to device after mapping |
| kMappable_Flag = 0x2, // memory is able to be mapped. |
| }; |
| |
| bool operator==(const GrVkAlloc& that) const { |
| return fMemory == that.fMemory && fOffset == that.fOffset && fSize == that.fSize && |
| fFlags == that.fFlags && fUsesSystemHeap == that.fUsesSystemHeap; |
| } |
| |
| private: |
| friend class GrVkHeap; // For access to usesSystemHeap |
| bool fUsesSystemHeap; |
| }; |
| struct GrVkImageInfo { |
| VkImage fImage; |
| GrVkAlloc fAlloc; |
| VkImageTiling fImageTiling; |
| VkImageLayout fImageLayout; |
| VkFormat fFormat; |
| uint32_t fLevelCount; |
| |
| GrVkImageInfo() |
| : fImage(VK_NULL_HANDLE) |
| , fAlloc() |
| , fImageTiling(VK_IMAGE_TILING_OPTIMAL) |
| , fImageLayout(VK_IMAGE_LAYOUT_UNDEFINED) |
| , fFormat(VK_FORMAT_UNDEFINED) |
| , fLevelCount(0) {} |
| |
| GrVkImageInfo(VkImage image, GrVkAlloc alloc, VkImageTiling imageTiling, VkImageLayout layout, |
| VkFormat format, uint32_t levelCount) |
| : fImage(image) |
| , fAlloc(alloc) |
| , fImageTiling(imageTiling) |
| , fImageLayout(layout) |
| , fFormat(format) |
| , fLevelCount(levelCount) {} |
| |
| GrVkImageInfo(const GrVkImageInfo& info, VkImageLayout layout) |
| : fImage(info.fImage) |
| , fAlloc(info.fAlloc) |
| , fImageTiling(info.fImageTiling) |
| , fImageLayout(layout) |
| , fFormat(info.fFormat) |
| , fLevelCount(info.fLevelCount) {} |
| |
| // This gives a way for a client to update the layout of the Image if they change the layout |
| // while we're still holding onto the wrapped texture. They will first need to get a handle |
| // to our internal GrVkImageInfo by calling getTextureHandle on a GrVkTexture. |
| void updateImageLayout(VkImageLayout layout) { fImageLayout = layout; } |
| |
| bool operator==(const GrVkImageInfo& that) const { |
| return fImage == that.fImage && fAlloc == that.fAlloc && |
| fImageTiling == that.fImageTiling && fImageLayout == that.fImageLayout && |
| fFormat == that.fFormat && fLevelCount == that.fLevelCount; |
| } |
| }; |
| |
| using GrVkGetProc = std::function<PFN_vkVoidFunction( |
| const char*, // function name |
| VkInstance, // instance or VK_NULL_HANDLE |
| VkDevice // device or VK_NULL_HANDLE |
| )>; |
| |
| |
| #endif |