From e253183bc2136374f7bb2d82c36528b75a4d503e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 21 Sep 2019 13:38:00 +0200 Subject: [PATCH] [dxvk] Apply spec constants to compute shaders as well --- src/dxvk/dxvk_compute.cpp | 21 +++++++++++++++++++++ src/dxvk/dxvk_compute.h | 10 +++++++++- src/dxvk/dxvk_context.cpp | 14 +++++++++++--- src/dxvk/dxvk_context.h | 2 ++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/dxvk/dxvk_compute.cpp b/src/dxvk/dxvk_compute.cpp index ad8c4507..d40639cc 100644 --- a/src/dxvk/dxvk_compute.cpp +++ b/src/dxvk/dxvk_compute.cpp @@ -9,6 +9,24 @@ namespace dxvk { + DxvkComputePipelineStateInfo::DxvkComputePipelineStateInfo() { + std::memset(this, 0, sizeof(*this)); + } + + + DxvkComputePipelineStateInfo::DxvkComputePipelineStateInfo( + const DxvkComputePipelineStateInfo& other) { + std::memcpy(this, &other, sizeof(*this)); + } + + + DxvkComputePipelineStateInfo& DxvkComputePipelineStateInfo::operator = ( + const DxvkComputePipelineStateInfo& other) { + std::memcpy(this, &other, sizeof(*this)); + return *this; + } + + bool DxvkComputePipelineStateInfo::operator == (const DxvkComputePipelineStateInfo& other) const { return std::memcmp(this, &other, sizeof(DxvkComputePipelineStateInfo)) == 0; } @@ -107,6 +125,9 @@ namespace dxvk { for (uint32_t i = 0; i < m_layout->bindingCount(); i++) specData.set(i, state.bsBindingMask.test(i), true); + for (uint32_t i = 0; i < MaxNumSpecConstants; i++) + specData.set(getSpecId(i), state.scSpecConstants[i], 0u); + VkSpecializationInfo specInfo = specData.getSpecInfo(); DxvkShaderModuleCreateInfo moduleInfo; diff --git a/src/dxvk/dxvk_compute.h b/src/dxvk/dxvk_compute.h index 5f7f6d2f..ca7c6616 100644 --- a/src/dxvk/dxvk_compute.h +++ b/src/dxvk/dxvk_compute.h @@ -27,10 +27,18 @@ namespace dxvk { * \brief Compute pipeline state info */ struct DxvkComputePipelineStateInfo { + DxvkComputePipelineStateInfo(); + DxvkComputePipelineStateInfo( + const DxvkComputePipelineStateInfo& other); + + DxvkComputePipelineStateInfo& operator = ( + const DxvkComputePipelineStateInfo& other); + bool operator == (const DxvkComputePipelineStateInfo& other) const; bool operator != (const DxvkComputePipelineStateInfo& other) const; - DxvkBindingMask bsBindingMask; + DxvkBindingMask bsBindingMask; + uint32_t scSpecConstants[MaxNumSpecConstants]; }; diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 8e16b40c..dd048b85 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -2344,11 +2344,19 @@ namespace dxvk { void DxvkContext::setSpecConstant( + VkPipelineBindPoint pipeline, uint32_t index, uint32_t value) { - if (m_state.gp.state.scSpecConstants[index] != value) { - m_state.gp.state.scSpecConstants[index] = value; - m_flags.set(DxvkContextFlag::GpDirtyPipelineState); + auto& specConst = pipeline == VK_PIPELINE_BIND_POINT_GRAPHICS + ? m_state.gp.state.scSpecConstants[index] + : m_state.cp.state.scSpecConstants[index]; + + if (specConst != value) { + specConst = value; + + m_flags.set(pipeline == VK_PIPELINE_BIND_POINT_GRAPHICS + ? DxvkContextFlag::GpDirtyPipelineState + : DxvkContextFlag::CpDirtyPipelineState); } } diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index a66baf81..21cc18b0 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -917,10 +917,12 @@ namespace dxvk { * Replaces current specialization constants with * the given list of constant entries. The specId * in the shader can be computed with \c getSpecId. + * \param [in] pipeline Graphics or Compute pipeline * \param [in] index Constant index * \param [in] value Constant value */ void setSpecConstant( + VkPipelineBindPoint pipeline, uint32_t index, uint32_t value);