Files
SDL3CPlusPlus/src/services/impl/vulkan_device_service.hpp
johndoe6345789 be181b177f feat: Implement Vulkan debug messenger and validation layers
- Added Vulkan debug callback and messenger setup to VulkanDeviceService.
- Integrated validation layers into Vulkan instance creation.
- Enhanced VulkanGraphicsBackend with methods to recreate swapchain and wait for GPU idle.
- Updated VulkanGuiService to include render pass in resize method.
- Removed deprecated VulkanGraphicsBackend_old.cpp file.
- Refactored interfaces to support new methods for swapchain management and rendering.
2026-01-05 20:13:58 +00:00

86 lines
3.0 KiB
C++

#pragma once
#include "../interfaces/i_vulkan_device_service.hpp"
#include "../interfaces/i_logger.hpp"
#include "../../di/lifecycle.hpp"
#include <vector>
#include <optional>
#include <memory>
namespace sdl3cpp::services::impl {
/**
* @brief Vulkan device service implementation.
*
* Small, focused service (~300 lines) for Vulkan device initialization.
* Handles instance, physical device, logical device, and queue management.
*/
class VulkanDeviceService : public IVulkanDeviceService,
public di::IShutdownable {
public:
explicit VulkanDeviceService(std::shared_ptr<ILogger> logger);
~VulkanDeviceService() override;
// IVulkanDeviceService interface
void Initialize(const std::vector<const char*>& deviceExtensions,
bool enableValidationLayers = false) override;
void CreateSurface(SDL_Window* window) override;
void CreateLogicalDevice() override;
void Shutdown() noexcept override;
void WaitIdle() override;
VkInstance GetInstance() const override {
logger_->Trace("VulkanDeviceService", "GetInstance");
return instance_;
}
VkSurfaceKHR GetSurface() const override {
logger_->Trace("VulkanDeviceService", "GetSurface");
return surface_;
}
VkPhysicalDevice GetPhysicalDevice() const override {
logger_->Trace("VulkanDeviceService", "GetPhysicalDevice");
return physicalDevice_;
}
VkDevice GetDevice() const override {
logger_->Trace("VulkanDeviceService", "GetDevice");
return device_;
}
VkQueue GetGraphicsQueue() const override {
logger_->Trace("VulkanDeviceService", "GetGraphicsQueue");
return graphicsQueue_;
}
VkQueue GetPresentQueue() const override {
logger_->Trace("VulkanDeviceService", "GetPresentQueue");
return presentQueue_;
}
QueueFamilyIndices GetQueueFamilies() const override;
uint32_t FindMemoryType(uint32_t typeFilter,
VkMemoryPropertyFlags properties) const override;
private:
std::shared_ptr<ILogger> logger_;
VkInstance instance_ = VK_NULL_HANDLE;
VkSurfaceKHR surface_ = VK_NULL_HANDLE;
VkPhysicalDevice physicalDevice_ = VK_NULL_HANDLE;
VkDevice device_ = VK_NULL_HANDLE;
VkQueue graphicsQueue_ = VK_NULL_HANDLE;
VkQueue presentQueue_ = VK_NULL_HANDLE;
VkDebugUtilsMessengerEXT debugMessenger_ = VK_NULL_HANDLE;
std::vector<const char*> deviceExtensions_;
bool validationLayersEnabled_ = false;
// Helper methods
void CreateInstance(const std::vector<const char*>& requiredExtensions);
void SetupDebugMessenger();
void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo) const;
void PickPhysicalDevice();
bool IsDeviceSuitable(VkPhysicalDevice device) const;
QueueFamilyIndices FindQueueFamilies(VkPhysicalDevice device) const;
bool CheckDeviceExtensionSupport(VkPhysicalDevice device) const;
};
} // namespace sdl3cpp::services::impl