From a27e440272e32e923faf0b5aedee6ba128f10020 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 24 Jul 2018 18:19:52 +0200 Subject: [PATCH] [dxvk] Detect Xfb and set rasterized stream index --- src/dxbc/dxbc_compiler.cpp | 6 +++++- src/dxvk/dxvk_graphics.cpp | 20 ++++++++++++++++++-- src/dxvk/dxvk_graphics.h | 19 +++++++++++++++++++ src/dxvk/dxvk_shader.h | 2 ++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 9c2fc70a..18586c31 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -232,9 +232,13 @@ namespace dxvk { DxvkShaderOptions shaderOptions = { }; - if (m_moduleInfo.xfb != nullptr) + if (m_moduleInfo.xfb != nullptr) { shaderOptions.rasterizedStream = m_moduleInfo.xfb->rasterizedStream; + for (uint32_t i = 0; i < 4; i++) + shaderOptions.xfbStrides[i] = m_moduleInfo.xfb->strides[i]; + } + // Create the shader module object return new DxvkShader( m_programInfo.shaderStage(), diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index 14cf9a9d..86b476b5 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -69,6 +69,9 @@ namespace dxvk { m_vsIn = vs != nullptr ? vs->interfaceSlots().inputSlots : 0; m_fsOut = fs != nullptr ? fs->interfaceSlots().outputSlots : 0; + + if (gs != nullptr && gs->hasCapability(spv::CapabilityTransformFeedback)) + m_flags.set(DxvkGraphicsPipelineFlag::HasTransformFeedback); m_common.msSampleShadingEnable = fs != nullptr && fs->hasCapability(spv::CapabilitySampleRateShading); m_common.msSampleShadingFactor = 1.0f; @@ -226,7 +229,11 @@ namespace dxvk { viDivisorDesc[id].divisor = state.ilDivisors[i]; } } - + + int32_t rasterizedStream = m_gs != nullptr + ? m_gs->shader()->shaderOptions().rasterizedStream + : 0; + VkPipelineVertexInputDivisorStateCreateInfoEXT viDivisorInfo; viDivisorInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT; viDivisorInfo.pNext = nullptr; @@ -271,12 +278,18 @@ namespace dxvk { vpInfo.scissorCount = state.rsViewportCount; vpInfo.pScissors = nullptr; + VkPipelineRasterizationStateStreamCreateInfoEXT xfbStreamInfo; + xfbStreamInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT; + xfbStreamInfo.pNext = nullptr; + xfbStreamInfo.flags = 0; + xfbStreamInfo.rasterizationStream = uint32_t(rasterizedStream); + VkPipelineRasterizationStateCreateInfo rsInfo; rsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rsInfo.pNext = nullptr; rsInfo.flags = 0; rsInfo.depthClampEnable = state.rsDepthClampEnable; - rsInfo.rasterizerDiscardEnable= VK_FALSE; + rsInfo.rasterizerDiscardEnable = rasterizedStream < 0; rsInfo.polygonMode = state.rsPolygonMode; rsInfo.cullMode = state.rsCullMode; rsInfo.frontFace = state.rsFrontFace; @@ -286,6 +299,9 @@ namespace dxvk { rsInfo.depthBiasSlopeFactor = 0.0f; rsInfo.lineWidth = 1.0f; + if (rasterizedStream > 0) + rsInfo.pNext = &xfbStreamInfo; + VkPipelineMultisampleStateCreateInfo msInfo; msInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; msInfo.pNext = nullptr; diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index 3d5277f2..c02d5722 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -15,6 +15,16 @@ namespace dxvk { class DxvkDevice; class DxvkPipelineManager; + + /** + * \brief Flags that describe pipeline properties + */ + enum class DxvkGraphicsPipelineFlag { + HasTransformFeedback, + }; + + using DxvkGraphicsCommonPipelineFlags = Flags; + /** * \brief Graphics pipeline state info @@ -156,6 +166,14 @@ namespace dxvk { const Rc& fs); ~DxvkGraphicsPipeline(); + /** + * \brief Returns graphics pipeline flags + * \returns Graphics pipeline property flags + */ + DxvkGraphicsCommonPipelineFlags flags() const { + return m_flags; + } + /** * \brief Pipeline layout * @@ -213,6 +231,7 @@ namespace dxvk { uint32_t m_vsIn = 0; uint32_t m_fsOut = 0; + DxvkGraphicsCommonPipelineFlags m_flags; DxvkGraphicsCommonPipelineStateInfo m_common; // List of pipeline instances, shared between threads diff --git a/src/dxvk/dxvk_shader.h b/src/dxvk/dxvk_shader.h index a86ccd8c..7f6620a8 100644 --- a/src/dxvk/dxvk_shader.h +++ b/src/dxvk/dxvk_shader.h @@ -59,6 +59,8 @@ namespace dxvk { struct DxvkShaderOptions { /// Rasterized stream, or -1 int32_t rasterizedStream; + /// Xfb vertex strides + uint32_t xfbStrides[MaxNumXfbBuffers]; };