From 4ce64bd8865bbb25baa25d622437c9258126c4d2 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 24 Mar 2018 00:32:22 +0100 Subject: [PATCH] [dxbc] Do not emit per-vertex input block Instead, we can let the normal input registers do their thing. --- src/dxbc/dxbc_compiler.cpp | 61 ++++++-------------------------------- src/dxbc/dxbc_compiler.h | 5 ---- 2 files changed, 9 insertions(+), 57 deletions(-) diff --git a/src/dxbc/dxbc_compiler.cpp b/src/dxbc/dxbc_compiler.cpp index a8ddbbdb..d835c6cd 100644 --- a/src/dxbc/dxbc_compiler.cpp +++ b/src/dxbc/dxbc_compiler.cpp @@ -585,7 +585,12 @@ namespace dxvk { m_interfaceSlots.inputSlots |= 1u << regIdx; } else if (sv != DxbcSystemValue::None) { // Add a new system value mapping if needed - m_vMappings.push_back({ regIdx, regMask, sv }); + bool skipSv = sv == DxbcSystemValue::Position + || sv == DxbcSystemValue::ClipDistance + || sv == DxbcSystemValue::CullDistance; + + if (!skipSv || m_version.type() == DxbcProgramType::PixelShader) + m_vMappings.push_back({ regIdx, regMask, sv }); } } @@ -1071,11 +1076,7 @@ namespace dxvk { m_gs.inputPrimitive = ins.controls.primitive; m_module.setExecutionMode(m_entryPointId, mode); - const uint32_t vertexCount - = primitiveVertexCount(m_gs.inputPrimitive); - - emitDclInputArray(vertexCount); - emitDclInputPerVertex(vertexCount, "gs_vertex_in"); + emitDclInputArray(primitiveVertexCount(m_gs.inputPrimitive)); } @@ -4919,33 +4920,8 @@ namespace dxvk { DxbcSystemValue sv, DxbcRegMask mask, uint32_t vertexId) { - switch (sv) { - case DxbcSystemValue::Position: { - const std::array indices = { - m_module.consti32(vertexId), - m_module.consti32(PerVertex_Position), - }; - - DxbcRegisterPointer ptrIn; - ptrIn.type.ctype = DxbcScalarType::Float32; - ptrIn.type.ccount = 4; - - ptrIn.id = m_module.opAccessChain( - m_module.defPointerType( - getVectorTypeId(ptrIn.type), - spv::StorageClassInput), - m_perVertexIn, - indices.size(), - indices.data()); - - return emitRegisterExtract( - emitValueLoad(ptrIn), mask); - } break; - - default: - throw DxvkError(str::format( - "DxbcCompiler: Unhandled GS SV input: ", sv)); - } + throw DxvkError(str::format( + "DxbcCompiler: Unhandled GS SV input: ", sv)); } @@ -5538,25 +5514,6 @@ namespace dxvk { } - void DxbcCompiler::emitDclInputPerVertex( - uint32_t vertexCount, - const char* varName) { - uint32_t typeId = getPerVertexBlockId(); - - if (vertexCount != 0) { - typeId = m_module.defArrayType(typeId, - m_module.constu32(vertexCount)); - } - - const uint32_t ptrTypeId = m_module.defPointerType( - typeId, spv::StorageClassInput); - - m_perVertexIn = m_module.newVar( - ptrTypeId, spv::StorageClassInput); - m_module.setDebugName(m_perVertexIn, varName); - } - - DxbcCompilerHsControlPointPhase DxbcCompiler::emitNewHullShaderControlPointPhase() { uint32_t funTypeId = m_module.defFunctionType( m_module.defVoidType(), 0, nullptr); diff --git a/src/dxbc/dxbc_compiler.h b/src/dxbc/dxbc_compiler.h index 45fabccd..27fcdee5 100644 --- a/src/dxbc/dxbc_compiler.h +++ b/src/dxbc/dxbc_compiler.h @@ -390,7 +390,6 @@ namespace dxvk { //////////////////////////////////////////////////// // Per-vertex input and output blocks. Depending on // the shader stage, these may be declared as arrays. - uint32_t m_perVertexIn = 0; uint32_t m_perVertexOut = 0; ////////////////////////////////////////////////// @@ -931,10 +930,6 @@ namespace dxvk { void emitDclInputArray( uint32_t vertexCount); - void emitDclInputPerVertex( - uint32_t vertexCount, - const char* varName); - DxbcCompilerHsControlPointPhase emitNewHullShaderControlPointPhase(); DxbcCompilerHsControlPointPhase emitNewHullShaderPassthroughPhase();