#pragma once #include "../interfaces/i_buffer_service.hpp" #include "../interfaces/i_vulkan_device_service.hpp" #include "../interfaces/i_logger.hpp" #include "../../di/lifecycle.hpp" #include namespace sdl3cpp::services::impl { /** * @brief Buffer service implementation. * * Small, focused service (~150 lines) for Vulkan buffer management. * Handles vertex and index buffer creation and memory management. */ class BufferService : public IBufferService, public di::IShutdownable { public: explicit BufferService(std::shared_ptr deviceService, std::shared_ptr logger); ~BufferService() override; // IBufferService interface void UploadVertexData(const std::vector& vertices) override; void UploadIndexData(const std::vector& indices) override; void Cleanup() override; VkBuffer GetVertexBuffer() const override { logger_->Trace("BufferService", "GetVertexBuffer"); return vertexBuffer_; } VkBuffer GetIndexBuffer() const override { logger_->Trace("BufferService", "GetIndexBuffer"); return indexBuffer_; } size_t GetVertexCount() const override { logger_->Trace("BufferService", "GetVertexCount"); return vertexCount_; } size_t GetIndexCount() const override { logger_->Trace("BufferService", "GetIndexCount"); return indexCount_; } // Public buffer creation utility void CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) override; // IShutdownable interface void Shutdown() noexcept override; private: std::shared_ptr deviceService_; std::shared_ptr logger_; VkBuffer vertexBuffer_ = VK_NULL_HANDLE; VkDeviceMemory vertexBufferMemory_ = VK_NULL_HANDLE; VkBuffer indexBuffer_ = VK_NULL_HANDLE; VkDeviceMemory indexBufferMemory_ = VK_NULL_HANDLE; size_t vertexCount_ = 0; size_t indexCount_ = 0; // Helper methods void CleanupBuffers(); }; } // namespace sdl3cpp::services::impl