vk: naomi2 crash when lightModel is null

fixes crash at end of tutorial in kingrt66
This commit is contained in:
Flyinghead 2022-05-17 16:36:34 +02:00
parent 221060cc70
commit 62522e4eb3
3 changed files with 22 additions and 19 deletions

View File

@ -143,17 +143,20 @@ protected:
vk::DeviceSize packNaomi2Lights(BufferPacker& packer)
{
constexpr static N2LightModel noLight{};
vk::DeviceSize offset = packer.addUniform(&noLight, sizeof(noLight));
size_t n2LightSize = sizeof(N2LightModel) + align(sizeof(N2LightModel), GetContext()->GetUniformBufferAlignment());
if (n2LightSize == sizeof(N2LightModel))
return packer.addUniform(pvrrc.lightModels.head(), pvrrc.lightModels.bytes());
vk::DeviceSize offset = (vk::DeviceSize)-1;
for (const N2LightModel& model : pvrrc.lightModels)
{
vk::DeviceSize o = packer.addUniform(&model, sizeof(N2LightModel));
if (offset == (vk::DeviceSize)-1)
offset = o;
packer.addUniform(pvrrc.lightModels.head(), pvrrc.lightModels.bytes());
}
else
{
for (const N2LightModel& model : pvrrc.lightModels)
packer.addUniform(&model, sizeof(N2LightModel));
}
return offset;
}

View File

@ -186,14 +186,14 @@ public:
uniBufferInfo = vk::DescriptorBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) };
writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr);
if (poly.lightModel != nullptr)
{
size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment);
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head()) * size, sizeof(N2LightModel) };
// light at index 0 is no light
if (poly.lightModel != nullptr)
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head() + 1) * size, sizeof(N2LightModel) };
else
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset, sizeof(N2LightModel) };
writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &lightBufferInfo, nullptr);
}
// TODO no light
}
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
perPolyDescSets[&poly] = perPolyDescSet;

View File

@ -103,14 +103,14 @@ public:
uniBufferInfo = vk::DescriptorBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) };
writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr);
if (poly.lightModel != nullptr)
{
size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment);
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head()) * size, sizeof(N2LightModel) };
// light at index 0 is no light
if (poly.lightModel != nullptr)
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head() + 1) * size, sizeof(N2LightModel) };
else
lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset, sizeof(N2LightModel) };
writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &lightBufferInfo, nullptr);
}
// TODO no light
}
getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);
perPolyDescSets[&poly] = perPolyDescSet;