mirror of https://github.com/alibaba/MNN.git
178 lines
11 KiB
C++
178 lines
11 KiB
C++
//
|
|
// VulkanDevice.hpp
|
|
// MNN
|
|
//
|
|
// Created by MNN on 2019/01/31.
|
|
// Copyright © 2018, Alibaba Group Holding Limited
|
|
//
|
|
|
|
#ifndef VulkanDevice_hpp
|
|
#define VulkanDevice_hpp
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
#include "core/NonCopyable.hpp"
|
|
#include "backend/vulkan/component/VulkanInstance.hpp"
|
|
#include "backend/vulkan/vulkan/vulkan_wrapper.h"
|
|
|
|
namespace MNN {
|
|
class VulkanDevice : public NonCopyable {
|
|
public:
|
|
explicit VulkanDevice(std::shared_ptr<VulkanInstance> instance,
|
|
const std::vector<const char*>& device_extensions = {});
|
|
explicit VulkanDevice(std::shared_ptr<VulkanInstance> instance, VkPhysicalDevice physicalDevice, VkDevice device,
|
|
uint32_t queueFamilyIndex, VkQueue queue);
|
|
virtual ~VulkanDevice();
|
|
|
|
const VkDevice get() const {
|
|
return mDevice;
|
|
}
|
|
|
|
void getDeviceQueue(const uint32_t familyIndex, const uint32_t queueIndex, VkQueue& queue);
|
|
const VkQueue acquireDefaultDevQueue() const;
|
|
|
|
// VkBuffer/VkDeviceMemory
|
|
const VkResult createBuffer(VkBuffer& buffer, const size_t size, const VkBufferUsageFlags usage,
|
|
const VkSharingMode shared, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void getBufferMemoryRequirements(const VkBuffer buffer, VkMemoryRequirements& memoryRequirements) const;
|
|
const VkResult allocMemory(VkDeviceMemory& memory, const VkMemoryAllocateInfo& allocateInfo,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void freeMemory(const VkDeviceMemory& memory, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult mapMemory(const VkDeviceMemory memory, const VkDeviceSize offset, const VkDeviceSize size,
|
|
const VkMemoryMapFlags flags, void** ppData) const;
|
|
const void unmapMemory(const VkDeviceMemory memory) const;
|
|
const VkResult bindBufferMemory(const VkBuffer buffer, const VkDeviceMemory memory,
|
|
const VkDeviceSize memoryOffset = 0) const;
|
|
const void destroyBuffer(const VkBuffer buffer, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult flushMappedMemoryRanges(const VkMappedMemoryRange* memoryRanges,
|
|
const uint32_t memoryRangeCount = 1) const;
|
|
const VkResult invalidateMappedMemoryRanges(const VkMappedMemoryRange* memoryRanges,
|
|
const uint32_t memoryRangeCount = 1) const;
|
|
|
|
const void getPhysicalDeviceMemoryProperties(VkPhysicalDeviceMemoryProperties& memoryProperties) const;
|
|
|
|
// VkCommand*
|
|
const VkResult createCommandPool(
|
|
VkCommandPool& cmdPool, const VkCommandPoolCreateFlags flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroyCommandPool(const VkCommandPool& cmdPool, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult allocateCommandBuffers(const VkCommandPool& cmdPool, VkCommandBuffer* cmdBuffers,
|
|
const uint32_t cmdBufferCount = 1,
|
|
const VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY) const;
|
|
const void freeCommandBuffers(const VkCommandPool& cmdPool, const VkCommandBuffer* cmdBuffers,
|
|
const uint32_t cmdBufferCount = 1) const;
|
|
const VkResult allocateCommandBuffer(const VkCommandPool& cmdPool, VkCommandBuffer& cmdBuffer,
|
|
const VkCommandBufferLevel level = VK_COMMAND_BUFFER_LEVEL_PRIMARY) const;
|
|
const void freeCommandBuffer(const VkCommandPool& cmdPool, const VkCommandBuffer& cmdBuffer) const;
|
|
|
|
// VkFence
|
|
const VkResult createFence(VkFence& fence, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult waitForFence(const VkFence& fence, const uint64_t timeout) const;
|
|
const VkResult waitForFences(const uint32_t fenceCount, const VkFence* fences, const VkBool32 waitAll,
|
|
const uint64_t timeout) const;
|
|
void destroyFence(const VkFence& fence, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult resetFences(const uint32_t fenceCount, const VkFence* fences) const;
|
|
const VkResult resetFence(const VkFence& fence) const;
|
|
|
|
// VkSemaphore
|
|
const VkResult createSemaphore(VkSemaphore& semaphore, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroySemaphore(const VkSemaphore& semaphore, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
// VkImage/VkSampler
|
|
const VkResult createImage(VkImage& image, const VkImageType imageType, const uint32_t width, const uint32_t height,
|
|
const uint32_t depth, const VkFormat format,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroyImage(const VkImage& image, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const void getImageMemoryRequirements(const VkImage& image, VkMemoryRequirements& memoryRequirements) const;
|
|
|
|
const void bindImageMemory(const VkImage& image, const VkDeviceMemory& memory,
|
|
const VkDeviceSize& memoryOffset = 0) const;
|
|
|
|
const VkResult createImageView(VkImageView& view, const VkImage& image, const VkImageViewType& viewType,
|
|
const VkFormat& format, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroyImageView(const VkImageView& imageView, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const VkResult createSampler(VkSampler& sampler, const VkFilter& filter = VK_FILTER_NEAREST,
|
|
const VkSamplerAddressMode& mode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const void destroySampler(const VkSampler& sampler, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
// VkPipeline
|
|
const VkResult createPipelineCache(VkPipelineCache& pipelineCache,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroyPipelineCache(const VkPipelineCache& pipelineCache,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const VkResult createShaderModule(VkShaderModule& shaderModule, const size_t codeSize, const uint32_t* pCode,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroyShaderModule(const VkShaderModule& shaderModule,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const void updateDescriptorSets(uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites,
|
|
uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies) const;
|
|
const void updateWriteDescriptorSet(const VkWriteDescriptorSet& descriptorWrite) const;
|
|
|
|
const VkResult createDescriptorSetLayout(VkDescriptorSetLayout& setLayout, const uint32_t bindingCount,
|
|
const VkDescriptorSetLayoutBinding* bindings,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult createPipelineLayout(VkPipelineLayout& pipelineLayout, const VkDescriptorSetLayout& setLayout,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const void destroyPipelineLayout(const VkPipelineLayout& pipelineLayout,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult createComputePipelines(VkPipeline* pipelines, const VkComputePipelineCreateInfo* createInfos,
|
|
const uint32_t createInfoCount, const VkPipelineCache& pipelineCache,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
const VkResult createComputePipeline(VkPipeline& pipeline, const VkShaderModule& shaderMoule,
|
|
const VkPipelineLayout& pipelineLayout, const VkPipelineCache& pipelineCache,
|
|
const VkSpecializationInfo* pSpecializationInfo = nullptr,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const void destroyDescriptorSetLayout(const VkDescriptorSetLayout& descriptorSetLayout,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const void destroyPipeline(const VkPipeline& pipeline, const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const VkResult createDescriptorPool(VkDescriptorPool& descriptorPool, const uint32_t poolSizeCount,
|
|
const VkDescriptorPoolSize* pPoolSizes,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const VkResult allocateDescriptorSets(VkDescriptorSet* pDescriptorSets,
|
|
const VkDescriptorSetAllocateInfo* allocateInfo) const;
|
|
|
|
const VkResult allocateDescriptorSet(VkDescriptorSet& pDescriptorSet,
|
|
const VkDescriptorSetAllocateInfo& allocateInfo) const;
|
|
const VkResult allocateDescriptorSet(VkDescriptorSet& pDescriptorSet, const VkDescriptorPool& descPool,
|
|
const VkDescriptorSetLayout& setLayout) const;
|
|
|
|
const VkResult freeDescriptorSets(const VkDescriptorPool& descriptorPool, const uint32_t descriptorSetCount,
|
|
const VkDescriptorSet* pDescriptorSets) const;
|
|
|
|
const void destroyDescriptorPool(const VkDescriptorPool& descriptorPool,
|
|
const VkAllocationCallbacks* allocator = nullptr) const;
|
|
|
|
const VkPhysicalDeviceProperties& proty() const {
|
|
return mDeviceProty;
|
|
}
|
|
|
|
const bool success() const {
|
|
return (VK_NULL_HANDLE != mDevice);
|
|
}
|
|
|
|
private:
|
|
const VkResult enumerateDeviceExtensionProperties(const VkPhysicalDevice& dev,
|
|
std::vector<VkExtensionProperties>& exts_props) const;
|
|
|
|
private:
|
|
bool mOwner;
|
|
std::shared_ptr<VulkanInstance> mInstance; ///< refer to Instance object used to create device
|
|
uint32_t mQueueFamilyIndex;
|
|
VkPhysicalDevice mPhysicalDevice;
|
|
VkDevice mDevice;
|
|
VkPhysicalDeviceProperties mDeviceProty;
|
|
VkQueue mQueue;
|
|
};
|
|
} // namespace MNN
|
|
#endif /* VulkanDevice_hpp */
|