Skip to content

Commit 16f36a2

Browse files
committed
Improve immediate buffers compatibility
1 parent 0bd2928 commit 16f36a2

5 files changed

Lines changed: 89 additions & 2 deletions

File tree

src/main/java/net/vulkanmod/mixin/render/RenderTypeM.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ public void draw(MeshData meshData) {
106106
VRenderSystem.applyModelViewMatrix(RenderSystem.getModelViewMatrix());
107107
VRenderSystem.calculateMVP();
108108

109-
renderPass.setIndexBuffer(gpuBuffer2, indexType);
110-
// renderPass.drawIndexed(0, 0, meshData.drawState().indexCount(), 1);
109+
// renderPass.setIndexBuffer(gpuBuffer2, indexType);
110+
// renderPass.drawIndexed(0, 0, meshData.drawState().indexCount(), 1);
111111

112112
VkCommandEncoder commandEncoder = (VkCommandEncoder) RenderSystem.getDevice().createCommandEncoder();
113113
commandEncoder.trySetup((VkRenderPass) renderPass);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.vulkanmod.mixin.render.buffer;
2+
3+
import com.mojang.blaze3d.buffers.GpuBuffer;
4+
import com.mojang.blaze3d.vertex.VertexFormat;
5+
import net.vulkanmod.vulkan.Renderer;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Overwrite;
8+
9+
import java.nio.ByteBuffer;
10+
11+
@Mixin(VertexFormat.class)
12+
public class VertexFormatMixin {
13+
14+
@Overwrite
15+
public GpuBuffer uploadImmediateVertexBuffer(ByteBuffer byteBuffer) {
16+
var buffer = Renderer.getDrawer().getGpuBuffers().getVertexBuffer();
17+
buffer.getBuffer().copyBuffer(byteBuffer, byteBuffer.remaining());
18+
int currentOffset = Math.toIntExact(buffer.getBuffer().getOffset());
19+
20+
buffer.setOffset(currentOffset);
21+
return buffer;
22+
}
23+
24+
@Overwrite
25+
public GpuBuffer uploadImmediateIndexBuffer(ByteBuffer byteBuffer) {
26+
var buffer = Renderer.getDrawer().getGpuBuffers().getIndexBuffer();
27+
buffer.getBuffer().copyBuffer(byteBuffer, byteBuffer.remaining());
28+
int currentOffset = Math.toIntExact(buffer.getBuffer().getOffset());
29+
30+
buffer.setOffset(currentOffset);
31+
return buffer;
32+
}
33+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public class VkGpuBuffer extends GpuBuffer {
2121

2222
Buffer buffer;
2323

24+
int offset;
25+
2426
protected VkGpuBuffer(VkDebugLabel debugLabel, @Nullable Supplier<String> supplier, int usage, long size) {
2527
super(usage, size);
2628
this.label = supplier;
@@ -55,6 +57,13 @@ protected VkGpuBuffer(VkDebugLabel debugLabel, @Nullable Supplier<String> suppli
5557
this.buffer.createBuffer(this.size());
5658
}
5759

60+
protected VkGpuBuffer(Buffer buffer) {
61+
super(buffer.usage, buffer.getBufferSize());
62+
63+
this.label = null;
64+
this.buffer = buffer;
65+
}
66+
5867
@Override
5968
public boolean isClosed() {
6069
return this.closed;
@@ -73,6 +82,10 @@ public Buffer getBuffer() {
7382
return buffer;
7483
}
7584

85+
public void setOffset(int offset) {
86+
this.offset = offset;
87+
}
88+
7689
public static int bufferUsageToGlEnum(int i) {
7790
boolean stream = (i & 4) != 0;
7891
// Draw
@@ -87,6 +100,10 @@ else if ((i & 1) != 0) {
87100
}
88101
}
89102

103+
public static VkGpuBuffer from(Buffer buffer) {
104+
return new VkGpuBuffer(buffer);
105+
}
106+
90107
@Environment(EnvType.CLIENT)
91108
public static class MappedView implements GpuBuffer.MappedView {
92109
private final int target;

src/main/java/net/vulkanmod/vulkan/Drawer.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.vulkanmod.vulkan;
22

33
import com.mojang.blaze3d.vertex.VertexFormat;
4+
import net.vulkanmod.render.engine.VkGpuBuffer;
45
import net.vulkanmod.vulkan.memory.*;
56
import net.vulkanmod.vulkan.memory.buffer.Buffer;
67
import net.vulkanmod.vulkan.memory.buffer.IndexBuffer;
@@ -31,6 +32,8 @@ public class Drawer {
3132
private VertexBuffer[] vertexBuffers;
3233
private IndexBuffer[] indexBuffers;
3334

35+
private final GpuBuffers gpuBuffers = new GpuBuffers();
36+
3437
private final AutoIndexBuffer quadsIndexBuffer;
3538
private final AutoIndexBuffer quadsIntIndexBuffer;
3639
private final AutoIndexBuffer linesIndexBuffer;
@@ -82,6 +85,8 @@ public void createResources(int framesNum) {
8285
}
8386
this.uniformBuffers = new UniformBuffer[framesNum];
8487
Arrays.setAll(this.uniformBuffers, i -> new UniformBuffer(INITIAL_UB_SIZE, MemoryTypes.HOST_MEM));
88+
89+
this.getGpuBuffers().createBuffers(this.vertexBuffers, this.indexBuffers);
8590
}
8691

8792
public void resetBuffers(int currentFrame) {
@@ -212,4 +217,35 @@ public AutoIndexBuffer getAutoIndexBuffer(VertexFormat.Mode mode, int vertexCoun
212217
case TRIANGLES, DEBUG_LINES -> null;
213218
};
214219
}
220+
221+
public GpuBuffers getGpuBuffers() {
222+
return gpuBuffers;
223+
}
224+
225+
public class GpuBuffers {
226+
VkGpuBuffer[] vertexBuffers;
227+
VkGpuBuffer[] indexBuffers;
228+
229+
public void createBuffers(VertexBuffer[] vertexBuffers, IndexBuffer[] indexBuffers) {
230+
this.vertexBuffers = new VkGpuBuffer[vertexBuffers.length];
231+
232+
for (int i = 0; i < vertexBuffers.length; i++) {
233+
this.vertexBuffers[i] = VkGpuBuffer.from(vertexBuffers[i]);
234+
}
235+
236+
this.indexBuffers = new VkGpuBuffer[indexBuffers.length];
237+
238+
for (int i = 0; i < vertexBuffers.length; i++) {
239+
this.indexBuffers[i] = VkGpuBuffer.from(indexBuffers[i]);
240+
}
241+
}
242+
243+
public VkGpuBuffer getVertexBuffer() {
244+
return vertexBuffers[Drawer.this.currentFrame];
245+
}
246+
247+
public VkGpuBuffer getIndexBuffer() {
248+
return indexBuffers[Drawer.this.currentFrame];
249+
}
250+
}
215251
}

src/main/resources/vulkanmod.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"render.RenderTypeM",
5252
"render.biome.BiomeManagerM",
5353
"render.block.BakedQuadM",
54+
"render.buffer.VertexFormatMixin",
5455
"render.clouds.LevelRendererM",
5556
"render.color.BlockColorsM",
5657
"render.entity.EntityRendererM",

0 commit comments

Comments
 (0)