From 3501186d387603deddaba91865d235b4b7a7f908 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 5 Mar 2018 14:07:15 +0100 Subject: [PATCH] [dxbc] Added tess level interface variables --- src/dxbc/dxbc_compiler.cpp | 32 ++++++++++++++++++++++++++++++-- src/dxbc/dxbc_compiler.h | 16 ++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index fef2fe29..0540b9a9 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -5001,7 +5001,8 @@ namespace dxvk { m_module.enableCapability(spv::CapabilityClipDistance); m_module.enableCapability(spv::CapabilityCullDistance); - // TODO implement + m_hs.builtinTessLevelOuter = emitBuiltinTessLevelOuter(spv::StorageClassOutput); + m_hs.builtinTessLevelInner = emitBuiltinTessLevelInner(spv::StorageClassOutput); } @@ -5010,7 +5011,8 @@ namespace dxvk { m_module.enableCapability(spv::CapabilityClipDistance); m_module.enableCapability(spv::CapabilityCullDistance); - // TODO implement + m_ds.builtinTessLevelOuter = emitBuiltinTessLevelOuter(spv::StorageClassInput); + m_ds.builtinTessLevelInner = emitBuiltinTessLevelInner(spv::StorageClassInput); } @@ -5263,6 +5265,32 @@ namespace dxvk { m_entryPointInterfaces.push_back(varId); return varId; } + + + uint32_t DxbcCompiler::emitBuiltinTessLevelOuter(spv::StorageClass storageClass) { + uint32_t id = emitNewBuiltinVariable( + DxbcRegisterInfo { + { DxbcScalarType::Float32, 0, 4 }, + storageClass }, + spv::BuiltInTessLevelOuter, + "bTessLevelOuter"); + + m_module.decorate(id, spv::DecorationPatch); + return id; + } + + + uint32_t DxbcCompiler::emitBuiltinTessLevelInner(spv::StorageClass storageClass) { + uint32_t id = emitNewBuiltinVariable( + DxbcRegisterInfo { + { DxbcScalarType::Float32, 0, 2 }, + storageClass }, + spv::BuiltInTessLevelInner, + "bTessLevelInner"); + + m_module.decorate(id, spv::DecorationPatch); + return id; + } DxbcCfgBlock* DxbcCompiler::cfgFindBlock( diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 01cf214c..1c74d305 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -199,8 +199,11 @@ namespace dxvk { DxbcCompilerHsPhase currPhaseType = DxbcCompilerHsPhase::None; size_t currPhaseId = 0; - uint32_t vertexCountIn = 0; - uint32_t vertexCountOut = 0; + uint32_t vertexCountIn = 0; + uint32_t vertexCountOut = 0; + + uint32_t builtinTessLevelOuter = 0; + uint32_t builtinTessLevelInner = 0; DxbcCompilerHsControlPointPhase cpPhase; std::vector forkPhases; @@ -213,6 +216,9 @@ namespace dxvk { */ struct DxbcCompilerDsPart { uint32_t functionId = 0; + + uint32_t builtinTessLevelOuter = 0; + uint32_t builtinTessLevelInner = 0; }; @@ -882,6 +888,12 @@ namespace dxvk { spv::BuiltIn builtIn, const char* name); + uint32_t emitBuiltinTessLevelOuter( + spv::StorageClass storageClass); + + uint32_t emitBuiltinTessLevelInner( + spv::StorageClass storageClass); + //////////////// // Misc methods DxbcCfgBlock* cfgFindBlock(