From 28880d0fa899bb8dcc9ba644f3f3a315e04ba9ab Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 10 Mar 2018 15:02:27 +0100 Subject: [PATCH] [dxbc] Implemented DclHsMaxTessFactor --- src/dxbc/dxbc_compiler.cpp | 16 +++++++++++++++- src/dxbc/dxbc_compiler.h | 5 +++++ src/dxbc/dxbc_decoder.h | 5 ++++- src/dxbc/dxbc_defs.cpp | 8 +++++--- src/dxbc/dxbc_util.cpp | 5 +++-- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 858f5202..060ac0ca 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -247,6 +247,9 @@ namespace dxvk { case DxbcOpcode::DclOutputControlPointCount: return this->emitDclOutputControlPointCount(ins); + case DxbcOpcode::DclHsMaxTessFactor: + return this->emitDclHsMaxTessFactor(ins); + case DxbcOpcode::DclTessDomain: return this->emitDclTessDomain(ins); @@ -1109,6 +1112,11 @@ namespace dxvk { } + void DxbcCompiler::emitDclHsMaxTessFactor(const DxbcShaderInstruction& ins) { + m_hs.maxTessFactor = ins.imm[0].f32; + } + + void DxbcCompiler::emitDclTessDomain(const DxbcShaderInstruction& ins) { const spv::ExecutionMode executionMode = [&] { switch (ins.controls.tessDomain) { @@ -5033,6 +5041,12 @@ namespace dxvk { const uint32_t tessFactorArrayIndex = m_module.constu32(tessFactor.index); + // Apply global tess factor limit + DxbcRegisterValue tessValue = emitRegisterExtract(value, mask); + tessValue.id = m_module.opFClamp(getVectorTypeId(tessValue.type), + tessValue.id, m_module.constf32(0.0f), + m_module.constf32(m_hs.maxTessFactor)); + DxbcRegisterPointer ptr; ptr.type.ctype = DxbcScalarType::Float32; ptr.type.ccount = 1; @@ -5043,7 +5057,7 @@ namespace dxvk { tessFactor.array, 1, &tessFactorArrayIndex); - emitValueStore(ptr, emitRegisterExtract(value, mask), + emitValueStore(ptr, tessValue, DxbcRegMask(true, false, false, false)); } else { Logger::warn(str::format( diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 2d969601..b7e901c4 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -200,6 +200,8 @@ namespace dxvk { DxbcCompilerHsPhase currPhaseType = DxbcCompilerHsPhase::None; size_t currPhaseId = 0; + float maxTessFactor = 64.0f; + uint32_t vertexCountIn = 0; uint32_t vertexCountOut = 0; @@ -484,6 +486,9 @@ namespace dxvk { void emitDclOutputControlPointCount( const DxbcShaderInstruction& ins); + void emitDclHsMaxTessFactor( + const DxbcShaderInstruction& ins); + void emitDclTessDomain( const DxbcShaderInstruction& ins); diff --git a/src/dxbc/dxbc_decoder.h b/src/dxbc/dxbc_decoder.h index 00d4d125..d3d3fdf1 100644 --- a/src/dxbc/dxbc_decoder.h +++ b/src/dxbc/dxbc_decoder.h @@ -273,9 +273,12 @@ namespace dxvk { * \brief Immediate value * * Immediate argument represented either - * as a 32-bit or 64-bit unsigned integer. + * as a 32-bit or 64-bit unsigned integer, + * or a 32-bit or 32-bit floating point number. */ union DxbcImmediate { + float f32; + double f64; uint32_t u32; uint64_t u64; }; diff --git a/src/dxbc/dxbc_defs.cpp b/src/dxbc/dxbc_defs.cpp index 5d93c4f5..f5ca554b 100644 --- a/src/dxbc/dxbc_defs.cpp +++ b/src/dxbc/dxbc_defs.cpp @@ -726,14 +726,16 @@ namespace dxvk { /* DclTessOutputPrimitive */ { 0, DxbcInstClass::Declaration }, /* DclHsMaxTessFactor */ - { }, + { 1, DxbcInstClass::Declaration, { + { DxbcOperandKind::Imm32, DxbcScalarType::Float32 }, + } }, /* DclHsForkPhaseInstanceCount */ { 1, DxbcInstClass::HullShaderInstCnt, { - { DxbcOperandKind::Imm32, DxbcScalarType::Uint32 }, + { DxbcOperandKind::Imm32, DxbcScalarType::Uint32 }, } }, /* DclHsJoinPhaseInstanceCount */ { 1, DxbcInstClass::HullShaderInstCnt, { - { DxbcOperandKind::Imm32, DxbcScalarType::Uint32 }, + { DxbcOperandKind::Imm32, DxbcScalarType::Uint32 }, } }, /* DclThreadGroup */ { 3, DxbcInstClass::Declaration, { diff --git a/src/dxbc/dxbc_util.cpp b/src/dxbc/dxbc_util.cpp index 5bb25d1a..1c42e0bf 100644 --- a/src/dxbc/dxbc_util.cpp +++ b/src/dxbc/dxbc_util.cpp @@ -23,8 +23,9 @@ namespace dxvk { } } else { // Global resource slots - // 0 - 7: Uniform access views - // 8 - 11: Stream output buffers + // 0 - 7: Unordered access views + // 8 - 15: UAV counter buffers + // 16 - 19: Stream output buffers // Per-stage resource slots: // 0 - 13: Constant buffers // 14 - 29: Samplers