Skip to content

Commit 29c9d77

Browse files
committed
Fix NPE when uniform buffer is not bound
1 parent d9b2844 commit 29c9d77

3 files changed

Lines changed: 21 additions & 3 deletions

File tree

src/main/java/net/vulkanmod/render/engine/VkCommandEncoder.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,6 @@ public boolean trySetup(VkRenderPass renderPass) {
763763
return bindPipeline(renderPass.pipeline);
764764
}
765765

766-
// TODO
767766
public void setupUniforms(VkRenderPass renderPass) {
768767
RenderPipeline renderPipeline = renderPass.pipeline;
769768
EGlProgram glProgram = ExtendedRenderPipeline.of(renderPass.pipeline).getProgram();
@@ -774,6 +773,14 @@ public void setupUniforms(VkRenderPass renderPass) {
774773
Uniform uniform = glProgram.getUniform(uniformName);
775774

776775
GpuBufferSlice gpuBufferSlice = renderPass.uniforms.get(uniformName);
776+
777+
// In case uniform buffer is not set, ignore it
778+
if (gpuBufferSlice == null) {
779+
ubo.setUseGlobalBuffer(true);
780+
ubo.setUpdate(false);
781+
continue;
782+
}
783+
777784
VkGpuBuffer gpuBuffer = (VkGpuBuffer) gpuBufferSlice.buffer();
778785

779786
assert ubo != null;

src/main/java/net/vulkanmod/vulkan/shader/DescriptorSets.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ private void updateUniforms(UniformBuffer globalUB) {
7474
int alignedSize = UniformBuffer.getAlignedSize(ubo.getSize());
7575
globalUB.checkCapacity(alignedSize);
7676

77-
ubo.update(globalUB.getPointer());
77+
if (ubo.shouldUpdate()) {
78+
ubo.update(globalUB.getPointer());
79+
}
7880
globalUB.updateOffset(alignedSize);
7981

8082
BufferSlice bufferSlice = ubo.getBufferSlice();

src/main/java/net/vulkanmod/vulkan/shader/descriptor/UBO.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.vulkanmod.vulkan.shader.descriptor;
22

3-
import net.vulkanmod.vulkan.memory.buffer.Buffer;
43
import net.vulkanmod.vulkan.memory.buffer.BufferSlice;
54
import net.vulkanmod.vulkan.shader.layout.AlignedStruct;
65
import net.vulkanmod.vulkan.shader.layout.Uniform;
@@ -15,12 +14,14 @@ public class UBO extends AlignedStruct implements Descriptor {
1514
public final int stages;
1615
public final BufferSlice bufferSlice;
1716
private boolean useGlobalBuffer;
17+
private boolean update;
1818

1919
public UBO(String name, int binding, int stages, int size, List<Uniform.Info> infoList) {
2020
super(infoList, size);
2121
this.name = name;
2222
this.binding = binding;
2323
this.stages = stages;
24+
this.update = true;
2425

2526
this.bufferSlice = new BufferSlice();
2627
}
@@ -58,4 +59,12 @@ public boolean useGlobalBuffer() {
5859
public void setUseGlobalBuffer(boolean useGlobalBuffer) {
5960
this.useGlobalBuffer = useGlobalBuffer;
6061
}
62+
63+
public boolean shouldUpdate() {
64+
return update;
65+
}
66+
67+
public void setUpdate(boolean update) {
68+
this.update = update;
69+
}
6170
}

0 commit comments

Comments
 (0)