1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-02 04:29:14 +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>
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<typename T>
@ -77,6 +86,16 @@ namespace dxvk {
size_t m_read = 0;
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++) {
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];

View File

@ -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];
};