diff --git a/core/rend/vulkan/drawer.h b/core/rend/vulkan/drawer.h index 7ff92ef85..823a048d7 100644 --- a/core/rend/vulkan/drawer.h +++ b/core/rend/vulkan/drawer.h @@ -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; } diff --git a/core/rend/vulkan/oit/oit_pipeline.h b/core/rend/vulkan/oit/oit_pipeline.h index 67da23eb0..538b3f3f0 100644 --- a/core/rend/vulkan/oit/oit_pipeline.h +++ b/core/rend/vulkan/oit/oit_pipeline.h @@ -186,13 +186,13 @@ public: uniBufferInfo = vk::DescriptorBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) }; writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr); + size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment); + // light at index 0 is no light if (poly.lightModel != nullptr) - { - size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment); - lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head()) * size, sizeof(N2LightModel) }; - writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &lightBufferInfo, nullptr); - } - // TODO no light + 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); } getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr); diff --git a/core/rend/vulkan/pipeline.h b/core/rend/vulkan/pipeline.h index e0853652e..304d9e473 100644 --- a/core/rend/vulkan/pipeline.h +++ b/core/rend/vulkan/pipeline.h @@ -103,13 +103,13 @@ public: uniBufferInfo = vk::DescriptorBufferInfo{ buffer, uniformOffset + polyNumber * size, sizeof(N2VertexShaderUniforms) }; writeDescriptorSets.emplace_back(perPolyDescSet, 2, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &uniBufferInfo, nullptr); + size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment); + // light at index 0 is no light if (poly.lightModel != nullptr) - { - size = sizeof(N2LightModel) + align(sizeof(N2LightModel), uniformAlignment); - lightBufferInfo = vk::DescriptorBufferInfo{ buffer, lightOffset + (poly.lightModel - pvrrc.lightModels.head()) * size, sizeof(N2LightModel) }; - writeDescriptorSets.emplace_back(perPolyDescSet, 3, 0, 1, vk::DescriptorType::eUniformBuffer, nullptr, &lightBufferInfo, nullptr); - } - // TODO no light + 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); } getContext()->GetDevice().updateDescriptorSets(writeDescriptorSets, nullptr);