Files
2026-05-18 00:03:06 +03:00

76 lines
2.0 KiB
C++

#pragma once
#include <vulkan/vulkan.h>
#include <cstdint>
#include <iostream>
#include <optional>
#include <string>
#include <vector>
struct SDL_Window;
struct QueueFamilyIndices
{
std::optional<uint32_t> graphicsFamily;
std::optional<uint32_t> presentFamily;
bool isComplete() const
{
return graphicsFamily.has_value() &&
presentFamily.has_value();
}
};
struct SwapchainSupportDetails
{
VkSurfaceCapabilitiesKHR capabilities;
std::vector<VkSurfaceFormatKHR> formats;
std::vector<VkPresentModeKHR> presentModes;
};
QueueFamilyIndices findQueueFamilies(
VkPhysicalDevice device,
VkSurfaceKHR surface);
SwapchainSupportDetails querySwapchainSupport(
VkPhysicalDevice device,
VkSurfaceKHR surface);
class VulkanContext
{
public:
VulkanContext(
SDL_Window* window,
const char* appName,
uint32_t versionMajor,
uint32_t versionMinor,
uint32_t versionPatch);
~VulkanContext();
VulkanContext(const VulkanContext&) = delete;
VulkanContext& operator=(const VulkanContext&) = delete;
VkDevice device() const { return m_device; }
VkPhysicalDevice physicalDevice() const { return m_physicalDevice; }
VkInstance instance() const { return m_instance; }
VkSurfaceKHR surface() const { return m_surface; }
VkQueue graphicsQueue() const { return m_graphicsQueue; }
VkQueue presentQueue() const { return m_presentQueue; }
VkCommandPool commandPool() const { return m_commandPool; }
const QueueFamilyIndices& queueIndices() const { return m_queueIndices; }
void release();
private:
VkInstance m_instance = VK_NULL_HANDLE;
VkSurfaceKHR m_surface = VK_NULL_HANDLE;
VkPhysicalDevice m_physicalDevice = VK_NULL_HANDLE;
VkDevice m_device = VK_NULL_HANDLE;
VkQueue m_graphicsQueue = VK_NULL_HANDLE;
VkQueue m_presentQueue = VK_NULL_HANDLE;
VkCommandPool m_commandPool = VK_NULL_HANDLE;
QueueFamilyIndices m_queueIndices;
};