1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-02 01:24:11 +01:00

[dxvk] Use packed input assembly state

This commit is contained in:
Philip Rebohle 2019-10-07 11:30:46 +02:00
parent 8d09aa12da
commit c0ae4e38eb
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 55 additions and 12 deletions

View File

@ -2240,9 +2240,10 @@ namespace dxvk {
void DxvkContext::setInputAssemblyState(const DxvkInputAssemblyState& ia) {
m_state.gp.state.iaPrimitiveTopology = ia.primitiveTopology;
m_state.gp.state.iaPrimitiveRestart = ia.primitiveRestart;
m_state.gp.state.iaPatchVertexCount = ia.patchVertexCount;
m_state.gp.state.ia = DxvkIaInfo(
ia.primitiveTopology,
ia.primitiveRestart,
ia.patchVertexCount);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);
}

View File

@ -288,14 +288,14 @@ namespace dxvk {
iaInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
iaInfo.pNext = nullptr;
iaInfo.flags = 0;
iaInfo.topology = state.iaPrimitiveTopology;
iaInfo.primitiveRestartEnable = state.iaPrimitiveRestart;
iaInfo.topology = state.ia.primitiveTopology();
iaInfo.primitiveRestartEnable = state.ia.primitiveRestart();
VkPipelineTessellationStateCreateInfo tsInfo;
tsInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
tsInfo.pNext = nullptr;
tsInfo.flags = 0;
tsInfo.patchControlPoints = state.iaPatchVertexCount;
tsInfo.patchControlPoints = state.ia.patchVertexCount();
VkPipelineViewportStateCreateInfo vpInfo;
vpInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
@ -461,12 +461,12 @@ namespace dxvk {
// If there are no tessellation shaders, we
// obviously cannot use tessellation patches.
if ((state.iaPrimitiveTopology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)
if ((state.ia.primitiveTopology() == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)
&& (m_shaders.tcs == nullptr || m_shaders.tes == nullptr))
return false;
// Filter out undefined primitive topologies
if (state.iaPrimitiveTopology == VK_PRIMITIVE_TOPOLOGY_MAX_ENUM)
if (state.ia.primitiveTopology() == VK_PRIMITIVE_TOPOLOGY_MAX_ENUM)
return false;
// Prevent unintended out-of-bounds access to the IL arrays

View File

@ -6,6 +6,51 @@
namespace dxvk {
/**
* \brief Packed input assembly state
*
* Stores the primitive topology
* and primitive restart info.
*/
class DxvkIaInfo {
public:
DxvkIaInfo() = default;
DxvkIaInfo(
VkPrimitiveTopology primitiveTopology,
VkBool32 primitiveRestart,
uint32_t patchVertexCount)
: m_primitiveTopology (uint16_t(primitiveTopology)),
m_primitiveRestart (uint16_t(primitiveRestart)),
m_patchVertexCount (uint16_t(patchVertexCount)),
m_reserved (0) { }
VkPrimitiveTopology primitiveTopology() const {
return m_primitiveTopology <= VK_PRIMITIVE_TOPOLOGY_PATCH_LIST
? VkPrimitiveTopology(m_primitiveTopology)
: VK_PRIMITIVE_TOPOLOGY_MAX_ENUM;
}
VkBool32 primitiveRestart() const {
return VkBool32(m_primitiveRestart);
}
uint32_t patchVertexCount() const {
return m_patchVertexCount;
}
private:
uint16_t m_primitiveTopology : 4;
uint16_t m_primitiveRestart : 1;
uint16_t m_patchVertexCount : 6;
uint16_t m_reserved : 5;
};
/**
* \brief Packed graphics pipeline state
*
@ -62,10 +107,7 @@ namespace dxvk {
}
DxvkBindingMask bsBindingMask;
VkPrimitiveTopology iaPrimitiveTopology;
VkBool32 iaPrimitiveRestart;
uint32_t iaPatchVertexCount;
DxvkIaInfo ia;
uint32_t ilAttributeCount;
uint32_t ilBindingCount;