Revert "[dxbc] Do not emit per-vertex input block"

This reverts commit 4ce64bd886.

Fixes a regression in Sniper: Ghost Warrior 2 and Dishonored 2.
This commit is contained in:
Philip Rebohle 2018-03-24 16:23:31 +01:00
parent 54382ae319
commit ac94c42380
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 56 additions and 6 deletions

View File

@ -588,9 +588,6 @@ namespace dxvk {
bool skipSv = sv == DxbcSystemValue::ClipDistance
|| sv == DxbcSystemValue::CullDistance;
if (m_version.type() != DxbcProgramType::PixelShader)
skipSv = skipSv || sv == DxbcSystemValue::Position;
if (!skipSv)
m_vMappings.push_back({ regIdx, regMask, sv });
}
@ -1083,7 +1080,11 @@ namespace dxvk {
m_gs.inputPrimitive = ins.controls.primitive;
m_module.setExecutionMode(m_entryPointId, mode);
emitDclInputArray(primitiveVertexCount(m_gs.inputPrimitive));
const uint32_t vertexCount
= primitiveVertexCount(m_gs.inputPrimitive);
emitDclInputArray(vertexCount);
emitDclInputPerVertex(vertexCount, "gs_vertex_in");
}
@ -4929,8 +4930,33 @@ namespace dxvk {
DxbcSystemValue sv,
DxbcRegMask mask,
uint32_t vertexId) {
throw DxvkError(str::format(
"DxbcCompiler: Unhandled GS SV input: ", sv));
switch (sv) {
case DxbcSystemValue::Position: {
const std::array<uint32_t, 2> 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));
}
}
@ -5672,6 +5698,25 @@ 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);
}
uint32_t DxbcCompiler::emitDclClipCullDistanceArray(
uint32_t length,
spv::BuiltIn builtIn,

View File

@ -390,6 +390,7 @@ 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;
uint32_t m_clipDistances = 0;
@ -943,6 +944,10 @@ namespace dxvk {
void emitDclInputArray(
uint32_t vertexCount);
void emitDclInputPerVertex(
uint32_t vertexCount,
const char* varName);
uint32_t emitDclClipCullDistanceArray(
uint32_t length,
spv::BuiltIn builtIn,