summaryrefslogtreecommitdiff
path: root/engine/xe_device.hpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xengine/xe_device.hpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/engine/xe_device.hpp b/engine/xe_device.hpp
new file mode 100755
index 0000000..0906123
--- /dev/null
+++ b/engine/xe_device.hpp
@@ -0,0 +1,105 @@
+#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 XeDevice {
+ public:
+#ifdef NDEBUG
+ const bool enableValidationLayers = false;
+#else
+ const bool enableValidationLayers = true;
+#endif
+
+ XeDevice(XeWindow &window);
+ ~XeDevice();
+
+ XeDevice(const XeDevice &) = delete;
+ void operator=(const XeDevice &) = delete;
+ XeDevice(XeDevice &&) = delete;
+ XeDevice &operator=(XeDevice &&) = delete;
+
+ VkCommandPool getCommandPool() { return commandPool; }
+ VkDevice device() { return device_; }
+ VkSurfaceKHR surface() { return surface_; }
+ VkQueue graphicsQueue() { return graphicsQueue_; }
+ VkQueue presentQueue() { return presentQueue_; }
+
+ 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);
+
+ VkInstance instance;
+ VkDebugUtilsMessengerEXT debugMessenger;
+ VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
+ XeWindow &window;
+ VkCommandPool commandPool;
+
+ VkDevice device_;
+ VkSurfaceKHR surface_;
+ VkQueue graphicsQueue_;
+ VkQueue presentQueue_;
+
+ 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};
+};
+
+} \ No newline at end of file