diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-04-14 18:04:53 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-04-14 18:04:53 +0000 |
| commit | a509e890a55eade6b10a36563f35219b61bf2707 (patch) | |
| tree | 33da45d394e57b9afbeae90e78bcedbafdd320c3 /Graphics/GraphicsEngineVulkan | |
| parent | Implemented input vertex layout conversion in Vulkan (diff) | |
| download | DiligentCore-a509e890a55eade6b10a36563f35219b61bf2707.tar.gz DiligentCore-a509e890a55eade6b10a36563f35219b61bf2707.zip | |
Moved primitive topology from draw attribs to pipeline state desc
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
3 files changed, 43 insertions, 39 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/VulkanTypeConversions.h b/Graphics/GraphicsEngineVulkan/include/VulkanTypeConversions.h index b8da039e..f5b2859c 100644 --- a/Graphics/GraphicsEngineVulkan/include/VulkanTypeConversions.h +++ b/Graphics/GraphicsEngineVulkan/include/VulkanTypeConversions.h @@ -48,6 +48,10 @@ void InputLayoutDesc_To_VkVertexInputStateCI(const InputLayoutDesc& LayoutDesc, std::array<VkVertexInputBindingDescription, iMaxLayoutElements>& BindingDescriptions, std::array<VkVertexInputAttributeDescription, iMaxLayoutElements>& AttributeDescription); +void PrimitiveTopology_To_VkPrimitiveTopologyAndPatchCPCount(PRIMITIVE_TOPOLOGY PrimTopology, + VkPrimitiveTopology &VkPrimTopology, + uint32_t &PatchControlPoints); + #if 0 D3D12_COMPARISON_FUNC ComparisonFuncToD3D12ComparisonFunc(COMPARISON_FUNCTION Func); D3D12_FILTER FilterTypeToD3D12Filter(FILTER_TYPE MinFilter, FILTER_TYPE MagFilter, FILTER_TYPE MipFilter); diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp index ab7d01f3..8751616d 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineStateVkImpl.cpp @@ -35,33 +35,6 @@ namespace Diligent { /* -Vk_PRIMITIVE_TOPOLOGY_TYPE PrimitiveTopologyType_To_Vk_PRIMITIVE_TOPOLOGY_TYPE( PRIMITIVE_TOPOLOGY_TYPE TopologyType ) -{ - static bool bIsInit = false; - static Vk_PRIMITIVE_TOPOLOGY_TYPE VkTopologyType[PRIMITIVE_TOPOLOGY_TYPE_NUM_TYPES] = {}; - if( !bIsInit ) - { - VkTopologyType[ PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED] = Vk_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED; - VkTopologyType[ PRIMITIVE_TOPOLOGY_TYPE_POINT ] = Vk_PRIMITIVE_TOPOLOGY_TYPE_POINT; - VkTopologyType[ PRIMITIVE_TOPOLOGY_TYPE_LINE ] = Vk_PRIMITIVE_TOPOLOGY_TYPE_LINE; - VkTopologyType[ PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE ] = Vk_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; - VkTopologyType[ PRIMITIVE_TOPOLOGY_TYPE_PATCH ] = Vk_PRIMITIVE_TOPOLOGY_TYPE_PATCH; - - bIsInit = true; - } - - if( TopologyType >= PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED && TopologyType < PRIMITIVE_TOPOLOGY_TYPE_NUM_TYPES ) - { - auto VkTopType = VkTopologyType[TopologyType]; - return VkTopType; - } - else - { - UNEXPECTED( "Incorrect topology type operation (", TopologyType, ")" ); - return static_cast<Vk_PRIMITIVE_TOPOLOGY_TYPE>(0); - } -} - void PipelineStateVkImpl::ParseShaderResourceLayout(IShader *pShader) { VERIFY_EXPR(pShader); @@ -266,23 +239,17 @@ PipelineStateVkImpl :: PipelineStateVkImpl(IReferenceCounters *pRefCounters, Ren VkPipelineInputAssemblyStateCreateInfo InputAssemblyCI = {}; InputAssemblyCI.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; InputAssemblyCI.pNext = nullptr; - InputAssemblyCI.flags; - InputAssemblyCI.topology; + InputAssemblyCI.flags = 0; // reserved for future use InputAssemblyCI.primitiveRestartEnable = VK_FALSE; PipelineCI.pInputAssemblyState = &InputAssemblyCI; VkPipelineTessellationStateCreateInfo TessStateCI = {}; - if(GraphicsPipeline.pHS != nullptr && GraphicsPipeline.pDS) - { - TessStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; - TessStateCI.pNext = nullptr; - TessStateCI.flags; - TessStateCI.patchControlPoints; + TessStateCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO; + TessStateCI.pNext = nullptr; + TessStateCI.flags = 0; // reserved for future use + PipelineCI.pTessellationState = &TessStateCI; - PipelineCI.pTessellationState = &TessStateCI; - } - else - PipelineCI.pTessellationState = nullptr; + PrimitiveTopology_To_VkPrimitiveTopologyAndPatchCPCount(GraphicsPipeline.PrimitiveTopology, InputAssemblyCI.topology, TessStateCI.patchControlPoints); VkPipelineViewportStateCreateInfo ViewPortStateCI = {}; diff --git a/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp b/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp index 943e520e..a9a7392d 100644 --- a/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp +++ b/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp @@ -967,6 +967,39 @@ void InputLayoutDesc_To_VkVertexInputStateCI(const InputLayoutDesc& LayoutDesc, } +void PrimitiveTopology_To_VkPrimitiveTopologyAndPatchCPCount(PRIMITIVE_TOPOLOGY PrimTopology, + VkPrimitiveTopology &VkPrimTopology, + uint32_t &PatchControlPoints) +{ + PatchControlPoints = 0; + switch(PrimTopology) + { + case PRIMITIVE_TOPOLOGY_UNDEFINED: + UNEXPECTED("Undefined primitive topology"); + VkPrimTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + return; + + case PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: + VkPrimTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + return; + + case PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP: + VkPrimTopology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP; + return; + + case PRIMITIVE_TOPOLOGY_POINT_LIST: + VkPrimTopology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; + return; + + case PRIMITIVE_TOPOLOGY_LINE_LIST: + VkPrimTopology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + return; + } + + VERIFY_EXPR(PrimTopology >= PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST && PrimTopology < PRIMITIVE_TOPOLOGY_NUM_TOPOLOGIES); + VkPrimTopology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST; + PatchControlPoints = static_cast<uint32_t>(VkPrimTopology) - static_cast<uint32_t>(PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST) + 1; +} #if 0 D3D12_COMPARISON_FUNC ComparisonFuncToD3D12ComparisonFunc(COMPARISON_FUNCTION Func) |
