1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-28 07:54:14 +01:00

[d3d11] Simplify ApplyPrimitiveTopology code

This commit is contained in:
Philip Rebohle 2019-07-17 15:52:42 +02:00
parent 3f30fbd098
commit af8e1a3d47
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -2970,52 +2970,31 @@ namespace dxvk {
void D3D11DeviceContext::ApplyPrimitiveTopology() { void D3D11DeviceContext::ApplyPrimitiveTopology() {
if (m_state.ia.primitiveTopology == D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED) D3D11_PRIMITIVE_TOPOLOGY topology = m_state.ia.primitiveTopology;
return; DxvkInputAssemblyState iaState = { };
const DxvkInputAssemblyState iaState = if (topology <= D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ) {
[Topology = m_state.ia.primitiveTopology] () -> DxvkInputAssemblyState { static const std::array<DxvkInputAssemblyState, 14> s_iaStates = {{
if (Topology >= D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST { }, // D3D_PRIMITIVE_TOPOLOGY_UNDEFINED
&& Topology <= D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST) { { VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_FALSE, 0 },
// Tessellation patch. The number of control points per { VK_PRIMITIVE_TOPOLOGY_LINE_LIST, VK_FALSE, 0 },
// patch can be inferred from the enum value in D3D11. { VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_TRUE, 0 },
return { VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE, { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_FALSE, 0 },
uint32_t(Topology - D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + 1) }; { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, VK_TRUE, 0 },
} else { { }, { }, { }, { }, // Random gap that exists for no reason
switch (Topology) { { VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_FALSE, 0 },
case D3D11_PRIMITIVE_TOPOLOGY_POINTLIST: { VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, VK_TRUE, 0 },
return { VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_FALSE, 0 }; { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, VK_FALSE, 0 },
{ VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY, VK_TRUE, 0 },
}};
case D3D11_PRIMITIVE_TOPOLOGY_LINELIST: iaState = s_iaStates[uint32_t(topology)];
return { VK_PRIMITIVE_TOPOLOGY_LINE_LIST, VK_FALSE, 0 }; } else if (topology >= D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST
&& topology <= D3D11_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST) {
case D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP: // The number of control points per patch can be inferred from the enum value in D3D11
return { VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_TRUE, 0 }; uint32_t vertexCount = uint32_t(topology - D3D11_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + 1);
iaState = { VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE, vertexCount };
case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST: }
return { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_FALSE, 0 };
case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP:
return { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, VK_TRUE, 0 };
case D3D11_PRIMITIVE_TOPOLOGY_LINELIST_ADJ:
return { VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_FALSE, 0 };
case D3D11_PRIMITIVE_TOPOLOGY_LINESTRIP_ADJ:
return { VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, VK_TRUE, 0 };
case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST_ADJ:
return { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, VK_FALSE, 0 };
case D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP_ADJ:
return { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY, VK_TRUE, 0 };
default:
Logger::err(str::format("D3D11: Invalid primitive topology: ", Topology));
return { };
}
}
}();
EmitCs([iaState] (DxvkContext* ctx) { EmitCs([iaState] (DxvkContext* ctx) {
ctx->setInputAssemblyState(iaState); ctx->setInputAssemblyState(iaState);