111 lines
No EOL
3.5 KiB
C++
Executable file
111 lines
No EOL
3.5 KiB
C++
Executable file
#pragma once
|
|
|
|
#include "xe_window.hpp"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace xe {
|
|
|
|
struct SwapChainSupportDetails {
|
|
VkSurfaceCapabilitiesKHR capabilities;
|
|
std::vector<VkSurfaceFormatKHR> formats;
|
|
std::vector<VkPresentModeKHR> presentModes;
|
|
};
|
|
|
|
struct QueueFamilyIndices {
|
|
uint32_t graphicsFamily;
|
|
uint32_t presentFamily;
|
|
bool graphicsFamilyHasValue = false;
|
|
bool presentFamilyHasValue = false;
|
|
bool isComplete() { return graphicsFamilyHasValue && presentFamilyHasValue; }
|
|
};
|
|
|
|
class Device {
|
|
public:
|
|
#ifdef NDEBUG
|
|
const bool enableValidationLayers = false;
|
|
#else
|
|
const bool enableValidationLayers = true;
|
|
#endif
|
|
|
|
Device(Window &window);
|
|
~Device();
|
|
|
|
Device(const Device &) = delete;
|
|
void operator=(const Device &) = delete;
|
|
Device(Device &&) = delete;
|
|
Device &operator=(Device &&) = delete;
|
|
|
|
VkCommandPool getCommandPool() { return commandPool; }
|
|
VkDevice device() { return device_; }
|
|
VkSurfaceKHR surface() { return surface_; }
|
|
VkQueue graphicsQueue() { return graphicsQueue_; }
|
|
VkQueue presentQueue() { return presentQueue_; }
|
|
VkSampleCountFlagBits getSamples() { return msaaSamples; }
|
|
float getAnisotropy() { return samplerAnisotropy; }
|
|
|
|
SwapChainSupportDetails getSwapChainSupport() { return querySwapChainSupport(physicalDevice); }
|
|
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
|
|
QueueFamilyIndices findPhysicalQueueFamilies() { return findQueueFamilies(physicalDevice); }
|
|
VkFormat findSupportedFormat(
|
|
const std::vector<VkFormat> &candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
|
|
|
|
|
|
void createBuffer(
|
|
VkDeviceSize size,
|
|
VkBufferUsageFlags usage,
|
|
VkMemoryPropertyFlags properties,
|
|
VkBuffer &buffer,
|
|
VkDeviceMemory &bufferMemory);
|
|
|
|
VkCommandBuffer beginSingleTimeCommands();
|
|
void endSingleTimeCommands(VkCommandBuffer commandBuffer);
|
|
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
|
|
void copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height, uint32_t layerCount);
|
|
|
|
void createImageWithInfo(
|
|
const VkImageCreateInfo &imageInfo,
|
|
VkMemoryPropertyFlags properties,
|
|
VkImage &image,
|
|
VkDeviceMemory &imageMemory);
|
|
|
|
VkPhysicalDeviceProperties properties;
|
|
|
|
private:
|
|
void createInstance();
|
|
void setupDebugMessenger();
|
|
void createSurface();
|
|
void pickPhysicalDevice();
|
|
void createLogicalDevice();
|
|
void createCommandPool();
|
|
|
|
bool isDeviceSuitable(VkPhysicalDevice device);
|
|
std::vector<const char *> getRequiredExtensions();
|
|
bool checkValidationLayerSupport();
|
|
QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device);
|
|
void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT &createInfo);
|
|
void hasGflwRequiredInstanceExtensions();
|
|
bool checkDeviceExtensionSupport(VkPhysicalDevice device);
|
|
SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice device);
|
|
VkSampleCountFlagBits getMaxUsableSampleCount();
|
|
|
|
VkInstance instance;
|
|
VkDebugUtilsMessengerEXT debugMessenger;
|
|
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
|
|
Window &window;
|
|
VkCommandPool commandPool;
|
|
|
|
VkDevice device_;
|
|
VkSurfaceKHR surface_;
|
|
VkQueue graphicsQueue_;
|
|
VkQueue presentQueue_;
|
|
|
|
VkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT;
|
|
float samplerAnisotropy = 1;
|
|
|
|
const std::vector<const char *> validationLayers = {"VK_LAYER_KHRONOS_validation"};
|
|
const std::vector<const char *> deviceExtensions = {VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_MAINTENANCE1_EXTENSION_NAME};
|
|
};
|
|
|
|
} |