diff --git a/src/Engine.Graphics.Vulkan/VulkanPipeline.cs b/src/Engine.Graphics.Vulkan/VulkanPipeline.cs index 5de566b..5448e95 100644 --- a/src/Engine.Graphics.Vulkan/VulkanPipeline.cs +++ b/src/Engine.Graphics.Vulkan/VulkanPipeline.cs @@ -150,24 +150,11 @@ internal sealed unsafe class VulkanPipeline : IDisposable pDynamicStates = dynamicStates, }; - var pushConstantRanges = stackalloc VkPushConstantRange[3]; - pushConstantRanges[0] = new VkPushConstantRange - { - stageFlags = VkShaderStageFlags.Vertex, - offset = 0, - size = 64, - }; - pushConstantRanges[1] = new VkPushConstantRange - { - stageFlags = VkShaderStageFlags.Fragment, - offset = 64, - size = 32, - }; - pushConstantRanges[2] = new VkPushConstantRange + var pushConstantRange = new VkPushConstantRange { stageFlags = VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, - offset = 96, - size = 64, + offset = 0, + size = 160, }; var descLayout = DescriptorSetLayout; @@ -176,8 +163,8 @@ internal sealed unsafe class VulkanPipeline : IDisposable sType = VkStructureType.PipelineLayoutCreateInfo, setLayoutCount = 1, pSetLayouts = &descLayout, - pushConstantRangeCount = 3, - pPushConstantRanges = (nint)pushConstantRanges, + pushConstantRangeCount = 1, + pPushConstantRanges = (nint)(&pushConstantRange), }; fixed (VkPipelineLayout* layoutPtr = &PipelineLayout) diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index 449ea08..6632983 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -235,6 +235,22 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen if (!dc.castShadow) continue; var vertexBuf = dc.vertexBuf; + ulong offset = 0; + Vk.vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuf, &offset); + Vk.vkCmdBindIndexBuffer(cmd, dc.indexBuf, 0, 1); + + // Pack all push constants for shadow pass + var pcData = stackalloc byte[160]; + var modelCopy = dc.model; + System.Buffer.MemoryCopy(&modelCopy, pcData, 64, 64); + var lpCopy = lightPos; + System.Buffer.MemoryCopy(&lpCopy, pcData + 64, 16, 16); + var lcCopy = lightColor; + System.Buffer.MemoryCopy(&lcCopy, pcData + 80, 16, 16); + var lvpCopy = lightViewProj; + System.Buffer.MemoryCopy(&lvpCopy, pcData + 96, 64, 64); + + Vk.vkCmdPushConstants(cmd, _shadowMap.PipelineLayout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, 0, 160, pcData); Vk.vkCmdDrawIndexed(cmd, dc.indexCount, 1, 0, 0, 0); } @@ -332,18 +348,18 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen Vk.vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuf, &offset); Vk.vkCmdBindIndexBuffer(cmd, dc.indexBuf, 0, 1); - var model = dc.model; - Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex, 0, 64, &model); - - // Light data as push constants at offset 64 (fragment stage) + // Pack all push constants: model(64) + lightPos(16) + lightColor(16) + lightViewProj(64) = 160 + var pcData = stackalloc byte[160]; + var modelCopy = dc.model; + System.Buffer.MemoryCopy(&modelCopy, pcData, 64, 64); var lpCopy = lightPos; - Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Fragment, 64, 16, &lpCopy); + System.Buffer.MemoryCopy(&lpCopy, pcData + 64, 16, 16); var lcCopy = lightColor; - Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Fragment, 80, 16, &lcCopy); - - // Light view-proj at offset 96 (vertex + fragment) + System.Buffer.MemoryCopy(&lcCopy, pcData + 80, 16, 16); var lvpCopy = lightViewProj; - Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, 96, 64, &lvpCopy); + System.Buffer.MemoryCopy(&lvpCopy, pcData + 96, 64, 64); + + Vk.vkCmdPushConstants(cmd, _pipeline.PipelineLayout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, 0, 160, pcData); Vk.vkCmdDrawIndexed(cmd, dc.indexCount, 1, 0, 0, 0); } diff --git a/src/Engine.Graphics.Vulkan/VulkanShadowMap.cs b/src/Engine.Graphics.Vulkan/VulkanShadowMap.cs index a87c40e..a42f55e 100644 --- a/src/Engine.Graphics.Vulkan/VulkanShadowMap.cs +++ b/src/Engine.Graphics.Vulkan/VulkanShadowMap.cs @@ -205,16 +205,14 @@ internal sealed unsafe class VulkanShadowMap : IDisposable pDynamicStates = dynamicStates, }; - var pushConstantRanges = stackalloc VkPushConstantRange[2]; - pushConstantRanges[0] = new VkPushConstantRange { stageFlags = VkShaderStageFlags.Vertex, offset = 0, size = 64 }; - pushConstantRanges[1] = new VkPushConstantRange { stageFlags = VkShaderStageFlags.Fragment, offset = 64, size = 96 }; + var pushConstantRange = new VkPushConstantRange { stageFlags = VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, offset = 0, size = 160 }; var layoutInfo = new VkPipelineLayoutCreateInfo { sType = VkStructureType.PipelineLayoutCreateInfo, setLayoutCount = 0, - pushConstantRangeCount = 2, - pPushConstantRanges = (nint)pushConstantRanges, + pushConstantRangeCount = 1, + pPushConstantRanges = (nint)(&pushConstantRange), }; var pl = VkPipelineLayout.Null;