From 798425ce10647a6cfe3a1055aac0af47cd22faed Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 27 Feb 2020 23:12:29 +0100 Subject: [PATCH] Some work on render pipelines --- examples/VulkanTest/main.cpp | 32 ++---------- include/Nazara/Renderer/RenderStates.hpp | 1 + include/Nazara/Utility/Enums.hpp | 2 + include/Nazara/VulkanRenderer/Utils.hpp | 3 ++ include/Nazara/VulkanRenderer/Utils.inl | 43 ++++++++++++++++ .../VulkanRenderer/VulkanRenderPipeline.hpp | 3 ++ .../VulkanRenderer/VulkanRenderPipeline.cpp | 50 +++++++++++++++++-- 7 files changed, 104 insertions(+), 30 deletions(-) diff --git a/examples/VulkanTest/main.cpp b/examples/VulkanTest/main.cpp index 907bc43a0..e91a42ccc 100644 --- a/examples/VulkanTest/main.cpp +++ b/examples/VulkanTest/main.cpp @@ -347,39 +347,19 @@ int main() attributeDescription.data() // const VkVertexInputAttributeDescription *pVertexAttributeDescriptions }; - VkPipelineInputAssemblyStateCreateInfo input_assembly_state_create_info = { - VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, // VkStructureType sType - nullptr, // const void *pNext - 0, // VkPipelineInputAssemblyStateCreateFlags flags - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, // VkPrimitiveTopology topology - VK_FALSE // VkBool32 primitiveRestartEnable - }; - VkPipelineViewportStateCreateInfo viewport_state_create_info = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext 0, // VkPipelineViewportStateCreateFlags flags 1, // uint32_t viewportCount - nullptr, // const VkViewport *pViewports + nullptr, // const VkViewport *pViewports 1, // uint32_t scissorCount - nullptr // const VkRect2D *pScissors + nullptr // const VkRect2D *pScissors }; - VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = { - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, // VkStructureType sType - nullptr, // const void *pNext - 0, // VkPipelineRasterizationStateCreateFlags flags - VK_FALSE, // VkBool32 depthClampEnable - VK_FALSE, // VkBool32 rasterizerDiscardEnable - VK_POLYGON_MODE_FILL, // VkPolygonMode polygonMode - VK_CULL_MODE_NONE, // VkCullModeFlags cullMode - VK_FRONT_FACE_COUNTER_CLOCKWISE, // VkFrontFace frontFace - VK_FALSE, // VkBool32 depthBiasEnable - 0.0f, // float depthBiasConstantFactor - 0.0f, // float depthBiasClamp - 0.0f, // float depthBiasSlopeFactor - 1.0f // float lineWidth - }; + VkPipelineInputAssemblyStateCreateInfo input_assembly_state_create_info = Nz::VulkanRenderPipeline::BuildInputAssemblyInfo(pipelineInfo); + VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = Nz::VulkanRenderPipeline::BuildRasterizationInfo(pipelineInfo); + VkPipelineDepthStencilStateCreateInfo depthStencilInfo = Nz::VulkanRenderPipeline::BuildDepthStencilInfo(pipelineInfo); VkPipelineMultisampleStateCreateInfo multisample_state_create_info = { VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, // VkStructureType sType @@ -429,8 +409,6 @@ int main() dynamicStates.data() // const VkDynamicState* pDynamicStates; }; - VkPipelineDepthStencilStateCreateInfo depthStencilInfo = Nz::VulkanRenderPipeline::BuildDepthStencilInfo(pipelineInfo); - VkGraphicsPipelineCreateInfo pipeline_create_info = { VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, // VkStructureType sType nullptr, // const void *pNext diff --git a/include/Nazara/Renderer/RenderStates.hpp b/include/Nazara/Renderer/RenderStates.hpp index 5fec08981..d31b37be0 100644 --- a/include/Nazara/Renderer/RenderStates.hpp +++ b/include/Nazara/Renderer/RenderStates.hpp @@ -19,6 +19,7 @@ namespace Nz FaceFilling faceFilling = FaceFilling_Fill; FaceSide cullingSide = FaceSide_Back; RendererComparison depthCompare = RendererComparison_Less; + PrimitiveMode primitiveMode = PrimitiveMode_TriangleList; struct { diff --git a/include/Nazara/Utility/Enums.hpp b/include/Nazara/Utility/Enums.hpp index c77fed662..cc7413844 100644 --- a/include/Nazara/Utility/Enums.hpp +++ b/include/Nazara/Utility/Enums.hpp @@ -123,6 +123,8 @@ namespace Nz enum FaceSide { + FaceSide_None, + FaceSide_Back, FaceSide_Front, FaceSide_FrontAndBack, diff --git a/include/Nazara/VulkanRenderer/Utils.hpp b/include/Nazara/VulkanRenderer/Utils.hpp index bd4ea0563..b80a3c3fd 100644 --- a/include/Nazara/VulkanRenderer/Utils.hpp +++ b/include/Nazara/VulkanRenderer/Utils.hpp @@ -14,6 +14,9 @@ namespace Nz { + inline VkCullModeFlagBits ToVulkan(FaceSide faceSide); + inline VkPolygonMode ToVulkan(FaceFilling faceFilling); + inline VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode); inline VkCompareOp ToVulkan(RendererComparison comparison); inline VkStencilOp ToVulkan(StencilOperation stencilOp); NAZARA_VULKANRENDERER_API String TranslateVulkanError(VkResult code); diff --git a/include/Nazara/VulkanRenderer/Utils.inl b/include/Nazara/VulkanRenderer/Utils.inl index dfc13cd1f..4abbe1d0c 100644 --- a/include/Nazara/VulkanRenderer/Utils.inl +++ b/include/Nazara/VulkanRenderer/Utils.inl @@ -9,6 +9,49 @@ namespace Nz { + VkCullModeFlagBits ToVulkan(FaceSide faceSide) + { + switch (faceSide) + { + case FaceSide_None: return VK_CULL_MODE_NONE; + case FaceSide_Back: return VK_CULL_MODE_BACK_BIT; + case FaceSide_Front: return VK_CULL_MODE_FRONT_BIT; + case FaceSide_FrontAndBack: return VK_CULL_MODE_FRONT_AND_BACK; + } + + NazaraError("Unhandled FaceSide 0x" + String::Number(faceSide, 16)); + return VK_CULL_MODE_BACK_BIT; + } + + inline VkPolygonMode ToVulkan(FaceFilling faceFilling) + { + switch (faceFilling) + { + case FaceFilling_Fill: return VK_POLYGON_MODE_FILL; + case FaceFilling_Line: return VK_POLYGON_MODE_LINE; + case FaceFilling_Point: return VK_POLYGON_MODE_POINT; + } + + NazaraError("Unhandled FaceFilling 0x" + String::Number(faceFilling, 16)); + return VK_POLYGON_MODE_FILL; + } + + VkPrimitiveTopology ToVulkan(PrimitiveMode primitiveMode) + { + switch (primitiveMode) + { + case PrimitiveMode_LineList: return VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + case PrimitiveMode_LineStrip: return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP; + case PrimitiveMode_PointList: return VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + case PrimitiveMode_TriangleList: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + case PrimitiveMode_TriangleStrip: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + case PrimitiveMode_TriangleFan: return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN; + } + + NazaraError("Unhandled FaceFilling 0x" + String::Number(primitiveMode, 16)); + return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + } + inline VkCompareOp ToVulkan(RendererComparison comparison) { switch (comparison) diff --git a/include/Nazara/VulkanRenderer/VulkanRenderPipeline.hpp b/include/Nazara/VulkanRenderer/VulkanRenderPipeline.hpp index 34e39a990..76836708e 100644 --- a/include/Nazara/VulkanRenderer/VulkanRenderPipeline.hpp +++ b/include/Nazara/VulkanRenderer/VulkanRenderPipeline.hpp @@ -20,7 +20,10 @@ namespace Nz VulkanRenderPipeline(Vk::DeviceHandle device, RenderPipelineInfo pipelineInfo); ~VulkanRenderPipeline() = default; + static VkPipelineColorBlendAttachmentState BuildColorBlendState(const RenderPipelineInfo& pipelineInfo); static VkPipelineDepthStencilStateCreateInfo BuildDepthStencilInfo(const RenderPipelineInfo& pipelineInfo); + static VkPipelineInputAssemblyStateCreateInfo BuildInputAssemblyInfo(const RenderPipelineInfo& pipelineInfo); + static VkPipelineRasterizationStateCreateInfo BuildRasterizationInfo(const RenderPipelineInfo& pipelineInfo); static VkStencilOpState BuildStencilOp(const RenderPipelineInfo& pipelineInfo, bool front); private: diff --git a/src/Nazara/VulkanRenderer/VulkanRenderPipeline.cpp b/src/Nazara/VulkanRenderer/VulkanRenderPipeline.cpp index ad4b43a5a..71daf7eaa 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderPipeline.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderPipeline.cpp @@ -16,16 +16,39 @@ namespace Nz { } + VkPipelineColorBlendAttachmentState VulkanRenderPipeline::BuildColorBlendState(const RenderPipelineInfo& pipelineInfo) + { + VkPipelineColorBlendAttachmentState colorBlendStates; + colorBlendStates.blendEnable = pipelineInfo.blending; + colorBlendStates.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; //< TODO + + if (pipelineInfo.blending) + { + //TODO + /*switch (pipelineInfo.dstBlend) + { + blendState.dstAlphaBlendFactor + }*/ + } + else + { + colorBlendStates.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; + colorBlendStates.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; + colorBlendStates.colorBlendOp = VK_BLEND_OP_ADD; + colorBlendStates.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + colorBlendStates.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; + colorBlendStates.alphaBlendOp = VK_BLEND_OP_ADD; + } + return colorBlendStates; + } + VkPipelineDepthStencilStateCreateInfo VulkanRenderPipeline::BuildDepthStencilInfo(const RenderPipelineInfo& pipelineInfo) { VkPipelineDepthStencilStateCreateInfo createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - createInfo.pNext = nullptr; - createInfo.flags = 0U; createInfo.depthTestEnable = pipelineInfo.depthBuffer; createInfo.depthWriteEnable = pipelineInfo.depthWrite; createInfo.depthCompareOp = ToVulkan(pipelineInfo.depthCompare); - createInfo.depthBoundsTestEnable = VK_FALSE; createInfo.stencilTestEnable = pipelineInfo.stencilTest; createInfo.front = BuildStencilOp(pipelineInfo, true); createInfo.back = BuildStencilOp(pipelineInfo, false); @@ -33,6 +56,27 @@ namespace Nz return createInfo; } + VkPipelineInputAssemblyStateCreateInfo VulkanRenderPipeline::BuildInputAssemblyInfo(const RenderPipelineInfo& pipelineInfo) + { + VkPipelineInputAssemblyStateCreateInfo createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + createInfo.topology = ToVulkan(pipelineInfo.primitiveMode); + + return createInfo; + } + + VkPipelineRasterizationStateCreateInfo VulkanRenderPipeline::BuildRasterizationInfo(const RenderPipelineInfo& pipelineInfo) + { + VkPipelineRasterizationStateCreateInfo createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + createInfo.polygonMode = ToVulkan(pipelineInfo.faceFilling); + createInfo.cullMode = ToVulkan(pipelineInfo.cullingSide); + createInfo.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; //< TODO + createInfo.lineWidth = pipelineInfo.lineWidth; + + return createInfo; + } + VkStencilOpState VulkanRenderPipeline::BuildStencilOp(const RenderPipelineInfo& pipelineInfo, bool front) { const auto& pipelineStencil = (front) ? pipelineInfo.stencilFront : pipelineInfo.stencilBack;