diff --git a/engine/include/nova/render/render_driver.h b/engine/include/nova/render/render_driver.h index ab844a7..5ed9e03 100644 --- a/engine/include/nova/render/render_driver.h +++ b/engine/include/nova/render/render_driver.h @@ -38,7 +38,7 @@ namespace Nova { virtual void resize_swapchain(SwapchainID swapchain) = 0; virtual void destroy_swapchain(SwapchainID swapchain) = 0; - [[nodiscard]] virtual ShaderID create_shader(const std::span bytes) = 0; + [[nodiscard]] virtual ShaderID create_shader(const std::span bytes, ShaderStage stage) = 0; virtual void destroy_shader(ShaderID shader) = 0; [[nodiscard]] virtual PipelineID create_pipeline(GraphicsPipelineParams& params) = 0; diff --git a/engine/include/nova/render/render_params.h b/engine/include/nova/render/render_params.h index b862cf8..2777b06 100644 --- a/engine/include/nova/render/render_params.h +++ b/engine/include/nova/render/render_params.h @@ -9,7 +9,6 @@ #include #include -#include #include namespace Nova { @@ -27,7 +26,7 @@ namespace Nova { }; struct GraphicsPipelineParams { - std::unordered_map shaders; + std::vector shaders; std::vector bindings; std::vector attributes; PrimitiveTopology topology = PrimitiveTopology::TRIANGLE_LIST; diff --git a/engine/src/drivers/vulkan/render_driver.cpp b/engine/src/drivers/vulkan/render_driver.cpp index 4fcc053..08541ce 100644 --- a/engine/src/drivers/vulkan/render_driver.cpp +++ b/engine/src/drivers/vulkan/render_driver.cpp @@ -553,11 +553,13 @@ void VulkanRenderDriver::destroy_swapchain(SwapchainID p_swapchain) { delete p_swapchain; } -ShaderID VulkanRenderDriver::create_shader(const std::span p_bytes) { +ShaderID VulkanRenderDriver::create_shader(const std::span p_bytes, ShaderStage p_stage) { NOVA_AUTO_TRACE(); NOVA_ASSERT(!p_bytes.empty()); Shader* shader = new Shader(); + shader->stage = p_stage; // TODO: Get from shader code + shader->name = "main"; // TODO: Get from shader code VkShaderModuleCreateInfo create {}; create.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; @@ -587,12 +589,12 @@ PipelineID VulkanRenderDriver::create_pipeline(GraphicsPipelineParams& p_params) NOVA_ASSERT(p_params.render_pass); std::vector shader_stages; - for (const auto& [stage, shader] : p_params.shaders) { + for (const auto& shader : p_params.shaders) { VkPipelineShaderStageCreateInfo stage_create {}; stage_create.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - stage_create.stage = VK_SHADER_STAGE_MAP[static_cast(stage)]; + stage_create.stage = VK_SHADER_STAGE_MAP[static_cast(shader->stage)]; stage_create.module = shader->handle; - stage_create.pName = "main"; // TODO: Get from shader + stage_create.pName = shader->name.c_str(); // TODO: Get specialization info from shader shader_stages.push_back(stage_create); } diff --git a/engine/src/drivers/vulkan/render_driver.h b/engine/src/drivers/vulkan/render_driver.h index d7e8df9..1877bce 100644 --- a/engine/src/drivers/vulkan/render_driver.h +++ b/engine/src/drivers/vulkan/render_driver.h @@ -26,6 +26,8 @@ namespace Nova { struct Shader { VkShaderModule handle = VK_NULL_HANDLE; + ShaderStage stage = ShaderStage::VERTEX; + std::string name; }; struct Surface { @@ -67,7 +69,7 @@ namespace Nova { void resize_swapchain(SwapchainID swapchain) override; void destroy_swapchain(SwapchainID swapchain) override; - [[nodiscard]] ShaderID create_shader(const std::span bytes) override; + [[nodiscard]] ShaderID create_shader(const std::span bytes, ShaderStage stage) override; void destroy_shader(ShaderID shader) override; [[nodiscard]] PipelineID create_pipeline(GraphicsPipelineParams& params) override;