From 4688b2cc5a6cb0f9dfc683cb6f39fd5c71c7818f Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 5 Mar 2018 16:14:46 +0100 Subject: [PATCH] [dxbc] Formatting fixes + Hull shader barriers --- src/dxbc/dxbc_compiler.cpp | 28 +++++++++++++++++++++------- src/dxbc/dxbc_compiler.h | 2 ++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 98bd425a..a054e837 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -372,11 +372,11 @@ namespace dxvk { // be stored in the second operand. const bool hasSv = ins.op == DxbcOpcode::DclInputSgv - || ins.op == DxbcOpcode::DclInputSiv - || ins.op == DxbcOpcode::DclInputPsSgv - || ins.op == DxbcOpcode::DclInputPsSiv - || ins.op == DxbcOpcode::DclOutputSgv - || ins.op == DxbcOpcode::DclOutputSiv; + || ins.op == DxbcOpcode::DclInputSiv + || ins.op == DxbcOpcode::DclInputPsSgv + || ins.op == DxbcOpcode::DclInputPsSiv + || ins.op == DxbcOpcode::DclOutputSgv + || ins.op == DxbcOpcode::DclOutputSiv; DxbcSystemValue sv = DxbcSystemValue::None; @@ -387,7 +387,7 @@ namespace dxvk { // interpolation mode that is part of the op token. const bool hasInterpolationMode = ins.op == DxbcOpcode::DclInputPs - || ins.op == DxbcOpcode::DclInputPsSiv; + || ins.op == DxbcOpcode::DclInputPsSiv; DxbcInterpolationMode im = DxbcInterpolationMode::Undefined; @@ -603,7 +603,6 @@ namespace dxvk { m_interfaceSlots.outputSlots |= 1u << regIdx; } - // Add a new system value mapping if needed if (sv != DxbcSystemValue::None) m_oMappings.push_back({ regIdx, regMask, sv }); @@ -5122,11 +5121,17 @@ namespace dxvk { void DxbcCompiler::emitHsFinalize() { this->emitHsControlPointPhase(m_hs.cpPhase); + if (m_hs.forkPhases.size() != 0 + || m_hs.joinPhases.size() != 0) + this->emitHsPhaseBarrier(); + for (const auto& phase : m_hs.forkPhases) this->emitHsForkJoinPhase(phase); for (const auto& phase : m_hs.joinPhases) this->emitHsForkJoinPhase(phase); + + // TODO set up output variables } @@ -5247,6 +5252,15 @@ namespace dxvk { } + void DxbcCompiler::emitHsPhaseBarrier() { + uint32_t exeScopeId = m_module.constu32(spv::ScopeWorkgroup); + uint32_t memScopeId = m_module.constu32(spv::ScopeInvocation); + uint32_t semanticId = m_module.constu32(spv::MemorySemanticsMaskNone); + + m_module.opControlBarrier(exeScopeId, memScopeId, semanticId); + } + + uint32_t DxbcCompiler::emitNewVariable(const DxbcRegisterInfo& info) { const uint32_t ptrTypeId = this->getPointerTypeId(info); return m_module.newVar(ptrTypeId, info.sclass); diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 1c74d305..6480cb94 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -867,6 +867,8 @@ namespace dxvk { void emitHsForkJoinPhase( const DxbcCompilerHsForkJoinPhase& phase); + void emitHsPhaseBarrier(); + ////////////// // Misc stuff void emitDclInputArray(