diff --git a/src/dxvk/dxvk_graphics_state.h b/src/dxvk/dxvk_graphics_state.h index 938a8384c..5357e0ce9 100644 --- a/src/dxvk/dxvk_graphics_state.h +++ b/src/dxvk/dxvk_graphics_state.h @@ -165,8 +165,7 @@ namespace dxvk { : m_binding (uint32_t(binding)), m_stride (uint32_t(stride)), m_inputRate (uint32_t(inputRate)), - m_reserved (0), - m_divisor (divisor) { } + m_divisor (uint32_t(divisor < (1u << 14) ? divisor : 0u)) { } uint32_t binding() const { return m_binding; @@ -201,8 +200,7 @@ namespace dxvk { uint32_t m_binding : 5; uint32_t m_stride : 12; uint32_t m_inputRate : 1; - uint32_t m_reserved : 14; - uint32_t m_divisor; + uint32_t m_divisor : 14; }; diff --git a/src/dxvk/dxvk_state_cache.cpp b/src/dxvk/dxvk_state_cache.cpp index 9c13ab11f..8f34c6bd1 100644 --- a/src/dxvk/dxvk_state_cache.cpp +++ b/src/dxvk/dxvk_state_cache.cpp @@ -58,6 +58,20 @@ namespace dxvk { return read(data); } + bool read(DxvkIlBinding& data, uint32_t version) { + if (version < 10) { + DxvkIlBindingV9 v9; + + if (!read(v9)) + return false; + + data = v9.convert(); + return true; + } + + return read(data); + } + template bool write(const T& data) { if (m_size + sizeof(T) > MaxSize) diff --git a/src/dxvk/dxvk_state_cache_types.h b/src/dxvk/dxvk_state_cache_types.h index 6f3c95ba9..41ff4d470 100644 --- a/src/dxvk/dxvk_state_cache_types.h +++ b/src/dxvk/dxvk_state_cache_types.h @@ -52,7 +52,7 @@ namespace dxvk { */ struct DxvkStateCacheHeader { char magic[4] = { 'D', 'X', 'V', 'K' }; - uint32_t version = 9; + uint32_t version = 10; uint32_t entrySize = 0; /* no longer meaningful */ }; @@ -72,6 +72,23 @@ namespace dxvk { }; + class DxvkIlBindingV9 { + + public: + + uint32_t m_binding : 5; + uint32_t m_stride : 12; + uint32_t m_inputRate : 1; + uint32_t m_reserved : 14; + uint32_t m_divisor; + + DxvkIlBinding convert() const { + return DxvkIlBinding(m_binding, m_stride, + VkVertexInputRate(m_inputRate), m_divisor); + } + + }; + /** * \brief Version 4 graphics pipeline state */