mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-11 19:24:11 +01:00
[dxbc] Set output topology for GS and TES correctly
This commit is contained in:
parent
5ece97f769
commit
a67c99943a
@ -257,6 +257,7 @@ namespace dxvk {
|
|||||||
info.outputMask = m_outputMask;
|
info.outputMask = m_outputMask;
|
||||||
info.uniformSize = m_immConstData.size();
|
info.uniformSize = m_immConstData.size();
|
||||||
info.uniformData = m_immConstData.data();
|
info.uniformData = m_immConstData.data();
|
||||||
|
info.outputTopology = m_outputTopology;
|
||||||
|
|
||||||
if (m_programInfo.type() == DxbcProgramType::HullShader)
|
if (m_programInfo.type() == DxbcProgramType::HullShader)
|
||||||
info.patchVertexCount = m_hs.vertexCountIn;
|
info.patchVertexCount = m_hs.vertexCountIn;
|
||||||
@ -1294,16 +1295,17 @@ namespace dxvk {
|
|||||||
// The input primitive topology is stored within in the
|
// The input primitive topology is stored within in the
|
||||||
// control bits of the opcode token. In SPIR-V, we have
|
// control bits of the opcode token. In SPIR-V, we have
|
||||||
// to define an execution mode.
|
// to define an execution mode.
|
||||||
const spv::ExecutionMode mode = [&] {
|
auto mode = [&] {
|
||||||
switch (ins.controls.primitiveTopology()) {
|
switch (ins.controls.primitiveTopology()) {
|
||||||
case DxbcPrimitiveTopology::PointList: return spv::ExecutionModeOutputPoints;
|
case DxbcPrimitiveTopology::PointList: return std::make_pair(VK_PRIMITIVE_TOPOLOGY_POINT_LIST, spv::ExecutionModeOutputPoints);
|
||||||
case DxbcPrimitiveTopology::LineStrip: return spv::ExecutionModeOutputLineStrip;
|
case DxbcPrimitiveTopology::LineStrip: return std::make_pair(VK_PRIMITIVE_TOPOLOGY_LINE_LIST, spv::ExecutionModeOutputLineStrip);
|
||||||
case DxbcPrimitiveTopology::TriangleStrip: return spv::ExecutionModeOutputTriangleStrip;
|
case DxbcPrimitiveTopology::TriangleStrip: return std::make_pair(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, spv::ExecutionModeOutputTriangleStrip);
|
||||||
default: throw DxvkError("DxbcCompiler: Unsupported primitive topology");
|
default: throw DxvkError("DxbcCompiler: Unsupported primitive topology");
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
|
||||||
m_module.setExecutionMode(m_entryPointId, mode);
|
m_outputTopology = mode.first;
|
||||||
|
m_module.setExecutionMode(m_entryPointId, mode.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1350,16 +1352,17 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
void DxbcCompiler::emitDclTessDomain(const DxbcShaderInstruction& ins) {
|
void DxbcCompiler::emitDclTessDomain(const DxbcShaderInstruction& ins) {
|
||||||
const spv::ExecutionMode executionMode = [&] {
|
auto mode = [&] {
|
||||||
switch (ins.controls.tessDomain()) {
|
switch (ins.controls.tessDomain()) {
|
||||||
case DxbcTessDomain::Isolines: return spv::ExecutionModeIsolines;
|
case DxbcTessDomain::Isolines: return std::make_pair(VK_PRIMITIVE_TOPOLOGY_LINE_LIST, spv::ExecutionModeIsolines);
|
||||||
case DxbcTessDomain::Triangles: return spv::ExecutionModeTriangles;
|
case DxbcTessDomain::Triangles: return std::make_pair(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, spv::ExecutionModeTriangles);
|
||||||
case DxbcTessDomain::Quads: return spv::ExecutionModeQuads;
|
case DxbcTessDomain::Quads: return std::make_pair(VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, spv::ExecutionModeQuads);
|
||||||
default: throw DxvkError("Dxbc: Invalid tess domain");
|
default: throw DxvkError("Dxbc: Invalid tess domain");
|
||||||
}
|
}
|
||||||
}();
|
}();
|
||||||
|
|
||||||
m_module.setExecutionMode(m_entryPointId, executionMode);
|
m_outputTopology = mode.first;
|
||||||
|
m_module.setExecutionMode(m_entryPointId, mode.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -535,6 +535,8 @@ namespace dxvk {
|
|||||||
DxbcOpcode m_lastOp = DxbcOpcode::Nop;
|
DxbcOpcode m_lastOp = DxbcOpcode::Nop;
|
||||||
DxbcOpcode m_currOp = DxbcOpcode::Nop;
|
DxbcOpcode m_currOp = DxbcOpcode::Nop;
|
||||||
|
|
||||||
|
VkPrimitiveTopology m_outputTopology = VK_PRIMITIVE_TOPOLOGY_MAX_ENUM;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
// Shader interface and metadata declaration methods
|
// Shader interface and metadata declaration methods
|
||||||
void emitDcl(
|
void emitDcl(
|
||||||
|
Loading…
Reference in New Issue
Block a user