engine/engine/inc/uf/ext/vulkan/device.h
2020-10-21 00:00:00 -05:00

108 lines
3.1 KiB
C++

#pragma once
#include <uf/ext/vulkan.h>
#include <uf/ext/vulkan/buffer.h>
#include <uf/utils/window/window.h>
#include <uf/utils/thread/thread.h>
namespace ext {
namespace vulkan {
struct UF_API Device {
VkInstance instance;
VkDebugUtilsMessengerEXT debugMessenger;
VkSurfaceKHR surface;
VkPhysicalDevice physicalDevice;
VkDevice logicalDevice;
struct {
std::unordered_map<std::thread::id, VkCommandPool> graphics;
std::unordered_map<std::thread::id, VkCommandPool> compute;
std::unordered_map<std::thread::id, VkCommandPool> transfer;
} commandPool;
VkPhysicalDeviceProperties properties;
VkPhysicalDeviceFeatures features;
VkPhysicalDeviceFeatures enabledFeatures;
VkPhysicalDeviceMemoryProperties memoryProperties;
VkPhysicalDeviceProperties2 properties2;
VkPhysicalDeviceFeatures2 features2;
VkPhysicalDeviceFeatures2 enabledFeatures2;
VkPhysicalDeviceMemoryProperties2 memoryProperties2;
struct {
std::vector<VkExtensionProperties> instance;
std::vector<VkExtensionProperties> device;
} extensionProperties;
struct {
std::vector<std::string> instance;
std::vector<std::string> device;
} supportedExtensions;
VkPipelineCache pipelineCache;
std::vector<VkQueueFamilyProperties> queueFamilyProperties;
struct {
std::unordered_map<std::thread::id,VkQueue> graphics;
std::unordered_map<std::thread::id,VkQueue> present;
std::unordered_map<std::thread::id,VkQueue> compute;
std::unordered_map<std::thread::id,VkQueue> transfer;
} queues;
uf::Window* window;
struct {
VkFormat depth;
VkFormat color;
VkColorSpaceKHR space;
} formats;
struct QueueFamilyIndices {
uint32_t graphics;
uint32_t present;
uint32_t compute;
uint32_t transfer;
} queueFamilyIndices;
operator VkDevice() { return this->logicalDevice; };
// helpers
uint32_t getQueueFamilyIndex( VkQueueFlagBits queueFlags );
uint32_t getMemoryType( uint32_t typeBits, VkMemoryPropertyFlags properties, VkBool32 *memTypeFound = nullptr );
int rate( VkPhysicalDevice device );
VkCommandBuffer createCommandBuffer( VkCommandBufferLevel level, bool begin = false );
void flushCommandBuffer( VkCommandBuffer commandBuffer, bool free = true );
VkResult createBuffer(
VkBufferUsageFlags usageFlags,
VkMemoryPropertyFlags memoryPropertyFlags,
VkDeviceSize size,
VkBuffer* buffer,
VkDeviceMemory *memory,
void *data = nullptr
);
VkResult createBuffer(
VkBufferUsageFlags usageFlags,
VkMemoryPropertyFlags memoryPropertyFlags,
ext::vulkan::Buffer& buffer,
VkDeviceSize size,
void *data = nullptr
);
enum QueueEnum {
GRAPHICS,
PRESENT,
COMPUTE,
TRANSFER,
};
VkQueue& getQueue( QueueEnum );
VkCommandPool& getCommandPool( QueueEnum );
VkQueue& getQueue( QueueEnum, std::thread::id );
VkCommandPool& getCommandPool( QueueEnum, std::thread::id );
// RAII
void initialize();
void destroy();
};
}
}