From d153d5c19ab05a110077a9b31bf306b6a2771148 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 7 Oct 2020 16:19:17 +0200 Subject: [PATCH] [dxvk] Bump state cache version to v9 Needed because the binding bit mask increased in size. --- src/dxvk/dxvk_state_cache.cpp | 81 +++++++++++++++++++------------ src/dxvk/dxvk_state_cache_types.h | 23 +++++++-- 2 files changed, 68 insertions(+), 36 deletions(-) diff --git a/src/dxvk/dxvk_state_cache.cpp b/src/dxvk/dxvk_state_cache.cpp index 3c01fa9f1..9c13ab11f 100644 --- a/src/dxvk/dxvk_state_cache.cpp +++ b/src/dxvk/dxvk_state_cache.cpp @@ -40,13 +40,22 @@ namespace dxvk { } template - bool read(T& data) { - if (m_read + sizeof(T) > m_size) - return false; - - std::memcpy(&data, &m_data[m_read], sizeof(T)); - m_read += sizeof(T); - return true; + bool read(T& data, uint32_t version) { + return read(data); + } + + bool read(DxvkBindingMask& data, uint32_t version) { + if (version < 9) { + DxvkBindingMaskV8 v8; + + if (!read(v8)) + return false; + + data = v8.convert(); + return true; + } + + return read(data); } template @@ -77,6 +86,16 @@ namespace dxvk { size_t m_read = 0; char m_data[MaxSize]; + template + bool read(T& data) { + if (m_read + sizeof(T) > m_size) + return false; + + std::memcpy(&data, &m_data[m_read], sizeof(T)); + m_read += sizeof(T); + return true; + } + }; @@ -519,13 +538,13 @@ namespace dxvk { for (uint32_t i = 0; i < 6; i++) { if (stageMask & VkShaderStageFlagBits(1 << i)) - data.read(keys[i]); + data.read(keys[i], version); else keys[i] = g_nullShaderKey; } if (stageMask & VK_SHADER_STAGE_COMPUTE_BIT) { - if (!data.read(entry.cpState.bsBindingMask)) + if (!data.read(entry.cpState.bsBindingMask, version)) return false; } else { // Read packed render pass format @@ -533,9 +552,9 @@ namespace dxvk { uint8_t imageFormat = 0; uint8_t imageLayout = 0; - if (!data.read(sampleCount) - || !data.read(imageFormat) - || !data.read(imageLayout)) + if (!data.read(sampleCount, version) + || !data.read(imageFormat, version) + || !data.read(imageLayout, version)) return false; entry.format.sampleCount = VkSampleCountFlagBits(sampleCount); @@ -543,8 +562,8 @@ namespace dxvk { entry.format.depth.layout = unpackImageLayout(imageLayout); for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { - if (!data.read(imageFormat) - || !data.read(imageLayout)) + if (!data.read(imageFormat, version) + || !data.read(imageLayout, version)) return false; entry.format.color[i].format = VkFormat(imageFormat); @@ -555,15 +574,15 @@ namespace dxvk { return false; // Read common pipeline state - if (!data.read(entry.gpState.bsBindingMask) - || !data.read(entry.gpState.ia) - || !data.read(entry.gpState.il) - || !data.read(entry.gpState.rs) - || !data.read(entry.gpState.ms) - || !data.read(entry.gpState.ds) - || !data.read(entry.gpState.om) - || !data.read(entry.gpState.dsFront) - || !data.read(entry.gpState.dsBack)) + if (!data.read(entry.gpState.bsBindingMask, version) + || !data.read(entry.gpState.ia, version) + || !data.read(entry.gpState.il, version) + || !data.read(entry.gpState.rs, version) + || !data.read(entry.gpState.ms, version) + || !data.read(entry.gpState.ds, version) + || !data.read(entry.gpState.om, version) + || !data.read(entry.gpState.dsFront, version) + || !data.read(entry.gpState.dsBack, version)) return false; if (entry.gpState.il.attributeCount() > MaxNumVertexAttributes @@ -572,25 +591,25 @@ namespace dxvk { // Read render target swizzles for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { - if (!data.read(entry.gpState.omSwizzle[i])) + if (!data.read(entry.gpState.omSwizzle[i], version)) return false; } // Read render target blend info for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { - if (!data.read(entry.gpState.omBlend[i])) + if (!data.read(entry.gpState.omBlend[i], version)) return false; } // Read defined vertex attributes for (uint32_t i = 0; i < entry.gpState.il.attributeCount(); i++) { - if (!data.read(entry.gpState.ilAttributes[i])) + if (!data.read(entry.gpState.ilAttributes[i], version)) return false; } // Read defined vertex bindings for (uint32_t i = 0; i < entry.gpState.il.bindingCount(); i++) { - if (!data.read(entry.gpState.ilBindings[i])) + if (!data.read(entry.gpState.ilBindings[i], version)) return false; } } @@ -602,12 +621,12 @@ namespace dxvk { uint32_t specConstantMask = 0; - if (!data.read(specConstantMask)) + if (!data.read(specConstantMask, version)) return false; for (uint32_t i = 0; i < MaxNumSpecConstants; i++) { if (specConstantMask & (1 << i)) { - if (!data.read(sc.specConstants[i])) + if (!data.read(sc.specConstants[i], version)) return false; } } @@ -795,7 +814,7 @@ namespace dxvk { if (in.shaders.cs.eq(g_nullShaderKey)) { // Binding mask - out.gpState.bsBindingMask = in.gpState.bsBindingMask; + out.gpState.bsBindingMask = in.gpState.bsBindingMask.convert(); // Graphics state out.gpState.ia = DxvkIaInfo( @@ -871,7 +890,7 @@ namespace dxvk { out.cpState.sc.specConstants[i] = in.cpState.scSpecConstants[i]; } else { // Binding mask - out.cpState.bsBindingMask = in.cpState.bsBindingMask; + out.cpState.bsBindingMask = in.cpState.bsBindingMask.convert(); for (uint32_t i = 0; i < 8 && i < MaxNumSpecConstants; i++) out.gpState.sc.specConstants[i] = in.gpState.scSpecConstants[i]; diff --git a/src/dxvk/dxvk_state_cache_types.h b/src/dxvk/dxvk_state_cache_types.h index d5cfbdc9a..6f3c95ba9 100644 --- a/src/dxvk/dxvk_state_cache_types.h +++ b/src/dxvk/dxvk_state_cache_types.h @@ -52,18 +52,31 @@ namespace dxvk { */ struct DxvkStateCacheHeader { char magic[4] = { 'D', 'X', 'V', 'K' }; - uint32_t version = 8; + uint32_t version = 9; uint32_t entrySize = 0; /* no longer meaningful */ }; static_assert(sizeof(DxvkStateCacheHeader) == 12); + class DxvkBindingMaskV8 : DxvkBindingSet<128> { + + public: + + DxvkBindingMask convert() const { + DxvkBindingMask result = { }; + for (uint32_t i = 0; i < 128; i++) + result.set(i, test(i)); + return result; + } + + }; + /** * \brief Version 4 graphics pipeline state */ struct DxvkGraphicsPipelineStateInfoV4 { - DxvkBindingMask bsBindingMask; + DxvkBindingMaskV8 bsBindingMask; VkPrimitiveTopology iaPrimitiveTopology; VkBool32 iaPrimitiveRestart; @@ -107,7 +120,7 @@ namespace dxvk { * \brief Version 6 graphics pipeline state */ struct DxvkGraphicsPipelineStateInfoV6 { - DxvkBindingMask bsBindingMask; + DxvkBindingMaskV8 bsBindingMask; VkPrimitiveTopology iaPrimitiveTopology; VkBool32 iaPrimitiveRestart; @@ -152,7 +165,7 @@ namespace dxvk { * \brief Version 5 compute pipeline state */ struct DxvkComputePipelineStateInfoV5 { - DxvkBindingMask bsBindingMask; + DxvkBindingMaskV8 bsBindingMask; }; @@ -160,7 +173,7 @@ namespace dxvk { * \brief Version 6 compute pipeline state */ struct DxvkComputePipelineStateInfoV6 { - DxvkBindingMask bsBindingMask; + DxvkBindingMaskV8 bsBindingMask; uint32_t scSpecConstants[8]; };