12#include <unordered_map>
15#define GLFW_INCLUDE_VULKAN
16#include <GLFW/glfw3.h>
138 VkBufferUsageFlags usage,
139 VkMemoryPropertyFlags properties,
141 VkDeviceMemory& bufferMemory);
148 void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size);
161 VkImageLayout oldLayout,
162 VkImageLayout newLayout,
163 std::uint32_t mipmapLevels);
171 void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height);
181 VkFormat imageFormat,
191 uint32_t
FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
215 return mCurrentFrame;
228 VkDescriptorSetLayout& descriptorSetLayout,
229 std::vector<char>& spvVertShaderCode,
230 std::vector<char>& spvFragShaderCode);
236 template <
typename T>
242 template <
typename T>
248 void CreateInstance();
249 bool CheckValidationLayerSupport();
250 std::vector<const char*> GetRequiredExtensions();
251 void PopulateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
252 static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(
253 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
254 VkDebugUtilsMessageTypeFlagsEXT messageType,
255 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
257 void SetupDebugMessenger();
258 VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
259 VkDebugUtilsMessengerCreateInfoEXT
const* pCreateInfo,
260 VkAllocationCallbacks
const* pAllocator,
261 VkDebugUtilsMessengerEXT* pDebugMessenger);
262 void DestroyDebugUtilsMessengerEXT(VkInstance instance,
263 VkDebugUtilsMessengerEXT debugMessenger,
264 const VkAllocationCallbacks* pAllocator);
265 void CreateSurface();
267 void PickPhysicalDevice();
268 bool IsDeviceSuitable(VkPhysicalDevice device);
270 bool CheckDeviceExtensionSupport(VkPhysicalDevice physicalDevice);
272 VkSampleCountFlagBits CheckMaxUsableSampleCount();
274 void CreateLogicalDevice();
276 void CreateSwapChain();
277 VkSurfaceFormatKHR ChooseSwapSurfaceFormat(std::vector<VkSurfaceFormatKHR>
const& availableFormats);
278 VkPresentModeKHR ChooseSwapPresentMode(std::vector<VkPresentModeKHR>
const& availablePresentModes);
279 VkExtent2D ChooseSwapExtent(VkSurfaceCapabilitiesKHR
const& capabilities);
280 void CleanupSwapChain();
281 void RecreateSwapChain();
283 void CreateImageViews();
284 VkImageView CreateImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags, std::uint32_t mipmapLevels);
286 void CreateRenderPass();
287 VkFormat FindDepthFormat();
288 VkFormat FindSupportedFormat(
const std::vector<VkFormat>& candidates, VkImageTiling tiling, VkFormatFeatureFlags features);
291 void CreateCommandPool();
293 void CreateColorResources();
295 void CreateVulkanImage(uint32_t width, uint32_t height, std::uint32_t mipmapLevels,
296 VkSampleCountFlagBits numSamples, VkFormat format, VkImageTiling tiling,
297 VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory);
299 void CreateDepthResources();
301 void CreateFramebuffers();
303 void CreateCommandBuffers();
305 void CreateFrameSyncObjects();
306 void CreateSwapchainSyncObjects();
308 VkShaderModule CreateShaderModule(std::vector<char>& code);
310 void RecordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex);
312 VkCommandBuffer BeginSingleTimeCommand();
313 bool HasStencilComponent(VkFormat format);
314 void EndSingleTimeCommand(VkCommandBuffer commandBuffer);
316 void ProcessDeferredDestruction();
320 size_t mCurrentFrame;
322 VkInstance mInstance;
323 VkSurfaceKHR mSurface;
324 std::vector<const char*>
const mValidationLayers = {
"VK_LAYER_KHRONOS_validation" };
325 VkDebugUtilsMessengerEXT mDebugMessenger;
326 std::vector<const char*>
const mDeviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
327 VkPhysicalDevice mPhysicalDevice = VK_NULL_HANDLE;
328 VkPhysicalDeviceProperties mPhysicalDeviceProperties;
329 VkPhysicalDeviceFeatures mPhysDevSupportedFeatures;
331 VkSampleCountFlagBits mMSAASamples;
333 VkDevice mLogicalDevice;
334 VkQueue mGraphicsQueue;
335 VkQueue mPresentQueue;
337 VkSwapchainKHR mSwapChain;
338 std::vector<VkImage> mSwapChainImages;
339 VkFormat mSwapChainImageFormat;
340 VkExtent2D mSwapChainExtent;
342 std::vector<VkImageView> mSwapChainImageViews;
343 std::vector<VkFramebuffer> mSwapChainFramebuffers;
345 VkRenderPass mRenderPass;
347 VkCommandPool mCommandPool;
348 std::vector<VkCommandBuffer> mCommandBuffers;
349 uint32_t mImageIndex = 0;
352 VkDeviceMemory mColorImageMemory;
353 VkImageView mColorImageView;
356 VkDeviceMemory mDepthImageMemory;
357 VkImageView mDepthImageView;
359 std::vector<VkSemaphore> mImageAvailableSemaphores;
360 std::vector<VkSemaphore> mRenderFinishedSemaphores;
361 std::vector<VkFence> mInFlightFences;
362 std::vector<VkFence> mImagesInFlight;
363 std::vector<IRendererObserver*> mObservers;
365 std::uint64_t mFrameSerial = 0;
366 std::deque<DeferredItem> mDeferredQueue;
368 glm::vec3 mDefaultColor = {0.0f, 0.0f, 0.0f};
Interface for backend-specific material GPU resources.
Interface for GPU mesh resource management.
Interface for rendering backend resource aggregation and submission.
Interface for observing renderer resource lifecycle events.
Defines an abstract interface for rendering backends.
Interface for backend-specific GPU texture resource management.
Abstract interface for platform-specific window management.
Represents a material instance with parameter values, texture bindings, and rendering configuration.
Vulkan-based implementation of the IRenderer interface.
bool BeginFrame() override
Begins frame rendering operations.
VulkanRenderer(IWindowSystem &windowSystem)
Constructs a VulkanRenderer bound to a specific window system.
ITextureRenderResources * ProvideTextureRenderResources() const override
Provides access to texture-related GPU resources.
VkPhysicalDeviceFeatures & GetPhysDevSupportedFeatures()
Returns reference to the physical device�s supported features.
void GenerateMipmaps(VkImage image, VkFormat imageFormat, int32_t texWidth, int32_t texHeight, uint32_t mipLevels)
Generates mipmaps for a given image resource.
void CopyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height)
Copies buffer data into an image (used for uploading texture data).
static std::vector< VkVertexInputAttributeDescription > GetAttributeDescriptions()
Returns vertex attribute descriptions for a specific vertex type.
VkDevice & GetLogicalDevice()
Returns reference to the logical Vulkan device.
VkDescriptorSetLayout CreateDescriptorSetLayout(Material *material)
Creates a descriptor set layout corresponding to a given material.
IRenderResources * ProvideRenderResources() const override
Provides access to the general rendering resource manager.
void InitializeRenderer() override
Initializes all rendering subsystems and GPU resources.
void BeginRenderPass() override
Begins the active render pass for the current frame.
IMeshRenderResources * ProvideMeshRenderResources() const override
Provides access to mesh-related GPU resources.
void CopyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size)
Copies data from one buffer to another using a temporary command buffer.
void EndRenderPass() override
Ends the active render pass.
void EndFrame() override
Completes the current frame rendering and presents the result.
VkPhysicalDevice & GetPhysicalDevice()
Returns reference to the physical device.
void CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer &buffer, VkDeviceMemory &bufferMemory)
Creates a new Vulkan buffer with the specified usage and memory properties.
void UnregisterObserver(IRendererObserver *notifier) override
Unregisters a previously registered observer.
void WaitIdle() override
Waits until the GPU has finished all pending rendering operations.
std::pair< VkPipelineLayout, VkPipeline > CreateGraphicsPipeline(Material *material, VkDescriptorSetLayout &descriptorSetLayout, std::vector< char > &spvVertShaderCode, std::vector< char > &spvFragShaderCode)
Creates a Vulkan graphics pipeline based on material and shader inputs.
void DrawFrame() override
Executes a full frame rendering cycle.
static VkVertexInputBindingDescription GetBindingDescription()
Returns a vertex input binding description for a specific vertex type.
void AddDeferredDestroy(DeferredItem deferredItem)
size_t GetCurrentFrame() const
Returns the index of the currently active frame in flight.
uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties)
Finds a suitable memory type for a given allocation.
void SetDefaultColor(float r, float g, float b) override
Sets the renderer clear color.
void TransitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout, std::uint32_t mipmapLevels)
Transitions the image layout for a given Vulkan image.
void RegisterObserver(IRendererObserver *notifier) override
Registers an observer for rendering events.
void ShutdownRenderer() override
Destroys and cleans up all rendering resources.
std::vector< VkCommandBuffer > GetComandBuffers()
Returns the collection of command buffers used for rendering.
IMaterialRenderResources * ProvideMaterialRenderResources() const override
Provides access to material-related GPU resources.
const int MAX_FRAMES_IN_FLIGHT
Number of frames that can be processed simultaneously (double buffering).
VkDescriptorPool descriptorPool
std::uint64_t retireFrame
VkPipelineLayout pipelineLayout
Holds indices of Vulkan queue families supporting required operations.
bool IsComplete()
Checks if both required queue families are available.
std::optional< uint32_t > presentFamily
std::optional< uint32_t > graphicsFamily
Describes capabilities and available configurations for a physical device's swap chain.
std::vector< VkPresentModeKHR > presentModes
std::vector< VkSurfaceFormatKHR > formats
VkSurfaceCapabilitiesKHR capabilities