1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[dxvk] Bump state cache version to v9

Needed because the binding bit mask increased in size.
This commit is contained in:
Philip Rebohle 2020-10-07 16:19:17 +02:00
parent e98493fc24
commit d153d5c19a
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 68 additions and 36 deletions

View File

@ -40,13 +40,22 @@ namespace dxvk {
} }
template<typename T> template<typename T>
bool read(T& data) { bool read(T& data, uint32_t version) {
if (m_read + sizeof(T) > m_size) return read(data);
return false; }
std::memcpy(&data, &m_data[m_read], sizeof(T)); bool read(DxvkBindingMask& data, uint32_t version) {
m_read += sizeof(T); if (version < 9) {
return true; DxvkBindingMaskV8 v8;
if (!read(v8))
return false;
data = v8.convert();
return true;
}
return read(data);
} }
template<typename T> template<typename T>
@ -77,6 +86,16 @@ namespace dxvk {
size_t m_read = 0; size_t m_read = 0;
char m_data[MaxSize]; char m_data[MaxSize];
template<typename T>
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++) { for (uint32_t i = 0; i < 6; i++) {
if (stageMask & VkShaderStageFlagBits(1 << i)) if (stageMask & VkShaderStageFlagBits(1 << i))
data.read(keys[i]); data.read(keys[i], version);
else else
keys[i] = g_nullShaderKey; keys[i] = g_nullShaderKey;
} }
if (stageMask & VK_SHADER_STAGE_COMPUTE_BIT) { if (stageMask & VK_SHADER_STAGE_COMPUTE_BIT) {
if (!data.read(entry.cpState.bsBindingMask)) if (!data.read(entry.cpState.bsBindingMask, version))
return false; return false;
} else { } else {
// Read packed render pass format // Read packed render pass format
@ -533,9 +552,9 @@ namespace dxvk {
uint8_t imageFormat = 0; uint8_t imageFormat = 0;
uint8_t imageLayout = 0; uint8_t imageLayout = 0;
if (!data.read(sampleCount) if (!data.read(sampleCount, version)
|| !data.read(imageFormat) || !data.read(imageFormat, version)
|| !data.read(imageLayout)) || !data.read(imageLayout, version))
return false; return false;
entry.format.sampleCount = VkSampleCountFlagBits(sampleCount); entry.format.sampleCount = VkSampleCountFlagBits(sampleCount);
@ -543,8 +562,8 @@ namespace dxvk {
entry.format.depth.layout = unpackImageLayout(imageLayout); entry.format.depth.layout = unpackImageLayout(imageLayout);
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {
if (!data.read(imageFormat) if (!data.read(imageFormat, version)
|| !data.read(imageLayout)) || !data.read(imageLayout, version))
return false; return false;
entry.format.color[i].format = VkFormat(imageFormat); entry.format.color[i].format = VkFormat(imageFormat);
@ -555,15 +574,15 @@ namespace dxvk {
return false; return false;
// Read common pipeline state // Read common pipeline state
if (!data.read(entry.gpState.bsBindingMask) if (!data.read(entry.gpState.bsBindingMask, version)
|| !data.read(entry.gpState.ia) || !data.read(entry.gpState.ia, version)
|| !data.read(entry.gpState.il) || !data.read(entry.gpState.il, version)
|| !data.read(entry.gpState.rs) || !data.read(entry.gpState.rs, version)
|| !data.read(entry.gpState.ms) || !data.read(entry.gpState.ms, version)
|| !data.read(entry.gpState.ds) || !data.read(entry.gpState.ds, version)
|| !data.read(entry.gpState.om) || !data.read(entry.gpState.om, version)
|| !data.read(entry.gpState.dsFront) || !data.read(entry.gpState.dsFront, version)
|| !data.read(entry.gpState.dsBack)) || !data.read(entry.gpState.dsBack, version))
return false; return false;
if (entry.gpState.il.attributeCount() > MaxNumVertexAttributes if (entry.gpState.il.attributeCount() > MaxNumVertexAttributes
@ -572,25 +591,25 @@ namespace dxvk {
// Read render target swizzles // Read render target swizzles
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { 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; return false;
} }
// Read render target blend info // Read render target blend info
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) { 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; return false;
} }
// Read defined vertex attributes // Read defined vertex attributes
for (uint32_t i = 0; i < entry.gpState.il.attributeCount(); i++) { 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; return false;
} }
// Read defined vertex bindings // Read defined vertex bindings
for (uint32_t i = 0; i < entry.gpState.il.bindingCount(); i++) { 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; return false;
} }
} }
@ -602,12 +621,12 @@ namespace dxvk {
uint32_t specConstantMask = 0; uint32_t specConstantMask = 0;
if (!data.read(specConstantMask)) if (!data.read(specConstantMask, version))
return false; return false;
for (uint32_t i = 0; i < MaxNumSpecConstants; i++) { for (uint32_t i = 0; i < MaxNumSpecConstants; i++) {
if (specConstantMask & (1 << i)) { if (specConstantMask & (1 << i)) {
if (!data.read(sc.specConstants[i])) if (!data.read(sc.specConstants[i], version))
return false; return false;
} }
} }
@ -795,7 +814,7 @@ namespace dxvk {
if (in.shaders.cs.eq(g_nullShaderKey)) { if (in.shaders.cs.eq(g_nullShaderKey)) {
// Binding mask // Binding mask
out.gpState.bsBindingMask = in.gpState.bsBindingMask; out.gpState.bsBindingMask = in.gpState.bsBindingMask.convert();
// Graphics state // Graphics state
out.gpState.ia = DxvkIaInfo( out.gpState.ia = DxvkIaInfo(
@ -871,7 +890,7 @@ namespace dxvk {
out.cpState.sc.specConstants[i] = in.cpState.scSpecConstants[i]; out.cpState.sc.specConstants[i] = in.cpState.scSpecConstants[i];
} else { } else {
// Binding mask // 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++) for (uint32_t i = 0; i < 8 && i < MaxNumSpecConstants; i++)
out.gpState.sc.specConstants[i] = in.gpState.scSpecConstants[i]; out.gpState.sc.specConstants[i] = in.gpState.scSpecConstants[i];

View File

@ -52,18 +52,31 @@ namespace dxvk {
*/ */
struct DxvkStateCacheHeader { struct DxvkStateCacheHeader {
char magic[4] = { 'D', 'X', 'V', 'K' }; char magic[4] = { 'D', 'X', 'V', 'K' };
uint32_t version = 8; uint32_t version = 9;
uint32_t entrySize = 0; /* no longer meaningful */ uint32_t entrySize = 0; /* no longer meaningful */
}; };
static_assert(sizeof(DxvkStateCacheHeader) == 12); 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 * \brief Version 4 graphics pipeline state
*/ */
struct DxvkGraphicsPipelineStateInfoV4 { struct DxvkGraphicsPipelineStateInfoV4 {
DxvkBindingMask bsBindingMask; DxvkBindingMaskV8 bsBindingMask;
VkPrimitiveTopology iaPrimitiveTopology; VkPrimitiveTopology iaPrimitiveTopology;
VkBool32 iaPrimitiveRestart; VkBool32 iaPrimitiveRestart;
@ -107,7 +120,7 @@ namespace dxvk {
* \brief Version 6 graphics pipeline state * \brief Version 6 graphics pipeline state
*/ */
struct DxvkGraphicsPipelineStateInfoV6 { struct DxvkGraphicsPipelineStateInfoV6 {
DxvkBindingMask bsBindingMask; DxvkBindingMaskV8 bsBindingMask;
VkPrimitiveTopology iaPrimitiveTopology; VkPrimitiveTopology iaPrimitiveTopology;
VkBool32 iaPrimitiveRestart; VkBool32 iaPrimitiveRestart;
@ -152,7 +165,7 @@ namespace dxvk {
* \brief Version 5 compute pipeline state * \brief Version 5 compute pipeline state
*/ */
struct DxvkComputePipelineStateInfoV5 { struct DxvkComputePipelineStateInfoV5 {
DxvkBindingMask bsBindingMask; DxvkBindingMaskV8 bsBindingMask;
}; };
@ -160,7 +173,7 @@ namespace dxvk {
* \brief Version 6 compute pipeline state * \brief Version 6 compute pipeline state
*/ */
struct DxvkComputePipelineStateInfoV6 { struct DxvkComputePipelineStateInfoV6 {
DxvkBindingMask bsBindingMask; DxvkBindingMaskV8 bsBindingMask;
uint32_t scSpecConstants[8]; uint32_t scSpecConstants[8];
}; };