From a520c5160e23cf56d67a4eeb0a6accbde1b46f30 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 6 Mar 2021 16:56:47 +0100 Subject: [PATCH] [dxvk] Pack vertex binding divisor into reserved 14-bit field Technically an illegal optimization since it limits the maximum divisor to 16383, but there are no known applications relying on very large divisors. Reduces state vector size by 128 bytes, or roughly 20%. This also bumps the state cache version to v10. --- src/dxvk/dxvk_graphics_state.h | 6 ++---- src/dxvk/dxvk_state_cache.cpp | 14 ++++++++++++++ src/dxvk/dxvk_state_cache_types.h | 19 ++++++++++++++++++- 3 files changed, 34 insertions(+), 5 deletions(-) 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 */