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:
parent
e98493fc24
commit
d153d5c19a
@ -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];
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user