diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index 272f2a1c..483c1c82 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -5283,7 +5283,7 @@ namespace dxvk { { DxbcScalarType::Uint32, 1, 0 }, spv::StorageClassInput }, spv::BuiltInLayer, - "ps_layer"); + "v_layer"); } DxbcRegisterPointer ptr; @@ -5294,6 +5294,25 @@ namespace dxvk { return emitValueLoad(ptr); } break; + case DxbcSystemValue::ViewportId: { + if (m_ps.builtinViewportId == 0) { + m_module.enableCapability(spv::CapabilityMultiViewport); + + m_ps.builtinViewportId = emitNewBuiltinVariable({ + { DxbcScalarType::Uint32, 1, 0 }, + spv::StorageClassInput }, + spv::BuiltInViewportIndex, + "v_viewport"); + } + + DxbcRegisterPointer ptr; + ptr.type.ctype = DxbcScalarType::Uint32; + ptr.type.ccount = 1; + ptr.id = m_ps.builtinViewportId; + + return emitValueLoad(ptr); + } break; + default: throw DxvkError(str::format( "DxbcCompiler: Unhandled PS SV input: ", sv)); @@ -5338,6 +5357,8 @@ namespace dxvk { enableShaderViewportIndexLayer(); if (m_gs.builtinLayer == 0) { + m_module.enableCapability(spv::CapabilityGeometry); + m_gs.builtinLayer = emitNewBuiltinVariable({ { DxbcScalarType::Uint32, 1, 0 }, spv::StorageClassOutput }, diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 7cc678da..6b0a1b8b 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -165,6 +165,7 @@ namespace dxvk { uint32_t builtinSampleMaskIn = 0; uint32_t builtinSampleMaskOut = 0; uint32_t builtinLayer = 0; + uint32_t builtinViewportId = 0; uint32_t killState = 0; };