Skip to content

Commit 5921d83

Browse files
committed
Use sorted index buffer on immediate rendering if needed
1 parent 41c3d58 commit 5921d83

4 files changed

Lines changed: 75 additions & 49 deletions

File tree

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ public static void drawWithShader(MeshData meshData) {
5656
renderer.bindGraphicsPipeline(pipeline);
5757
VTextureSelector.bindShaderTextures(pipeline);
5858
renderer.uploadAndBindUBOs(pipeline);
59-
Renderer.getDrawer().draw(meshData.vertexBuffer(), parameters.mode(), parameters.format(), parameters.vertexCount());
59+
60+
Renderer.getDrawer().draw(meshData.vertexBuffer(), meshData.indexBuffer(), parameters.mode(), parameters.format(), parameters.vertexCount());
6061
}
6162

6263
meshData.close();
@@ -74,7 +75,7 @@ public static void draw(MeshData meshData) {
7475
Pipeline pipeline = renderer.getBoundPipeline();
7576
renderer.uploadAndBindUBOs(pipeline);
7677

77-
Renderer.getDrawer().draw(meshData.vertexBuffer(), parameters.mode(), parameters.format(), parameters.vertexCount());
78+
Renderer.getDrawer().draw(meshData.vertexBuffer(), null, parameters.mode(), parameters.format(), parameters.vertexCount());
7879
}
7980

8081
meshData.close();

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@ public abstract class RenderSystemMixin {
2929
@Shadow @Final private static Matrix4fStack modelViewStack;
3030
@Shadow private static Matrix4f modelViewMatrix;
3131
@Shadow private static Matrix4f textureMatrix;
32+
3233
@Shadow @Final private static int[] shaderTextures;
3334
@Shadow @Final private static float[] shaderColor;
3435
@Shadow @Final private static Vector3f[] shaderLightDirections;
35-
3636
@Shadow @Final private static float[] shaderFogColor;
3737

3838
@Shadow private static @Nullable Thread renderThread;
3939

40+
@Shadow public static VertexSorting vertexSorting;
41+
@Shadow private static VertexSorting savedVertexSorting;
42+
4043
@Shadow
4144
public static void assertOnRenderThread() {
4245
}
@@ -372,12 +375,14 @@ public static void setProjectionMatrix(Matrix4f projectionMatrix, VertexSorting
372375
if (!isOnRenderThread()) {
373376
recordRenderCall(() -> {
374377
RenderSystemMixin.projectionMatrix = matrix4f;
378+
RenderSystem.vertexSorting = vertexSorting;
375379

376380
VRenderSystem.applyProjectionMatrix(matrix4f);
377381
VRenderSystem.calculateMVP();
378382
});
379383
} else {
380384
RenderSystemMixin.projectionMatrix = matrix4f;
385+
RenderSystem.vertexSorting = vertexSorting;
381386

382387
VRenderSystem.applyProjectionMatrix(matrix4f);
383388
VRenderSystem.calculateMVP();
@@ -443,6 +448,7 @@ public static void applyModelViewMatrix() {
443448
@Overwrite(remap = false)
444449
private static void _restoreProjectionMatrix() {
445450
projectionMatrix = savedProjectionMatrix;
451+
vertexSorting = savedVertexSorting;
446452

447453
VRenderSystem.applyProjectionMatrix(projectionMatrix);
448454
VRenderSystem.calculateMVP();

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

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ public class Drawer {
2323

2424
private int framesNum;
2525
private VertexBuffer[] vertexBuffers;
26+
private IndexBuffer[] indexBuffers;
27+
2628
private final AutoIndexBuffer quadsIndexBuffer;
2729
private final AutoIndexBuffer quadsIntIndexBuffer;
2830
private final AutoIndexBuffer linesIndexBuffer;
2931
private final AutoIndexBuffer debugLineStripIndexBuffer;
3032
private final AutoIndexBuffer triangleFanIndexBuffer;
3133
private final AutoIndexBuffer triangleStripIndexBuffer;
34+
3235
private UniformBuffer[] uniformBuffers;
3336

3437
private int currentFrame;
@@ -58,6 +61,14 @@ public void createResources(int framesNum) {
5861
this.vertexBuffers = new VertexBuffer[framesNum];
5962
Arrays.setAll(this.vertexBuffers, i -> new VertexBuffer(INITIAL_VB_SIZE, MemoryTypes.HOST_MEM));
6063

64+
if (this.indexBuffers != null) {
65+
Arrays.stream(this.indexBuffers).iterator().forEachRemaining(
66+
Buffer::freeBuffer
67+
);
68+
}
69+
this.indexBuffers = new IndexBuffer[framesNum];
70+
Arrays.setAll(this.indexBuffers, i -> new IndexBuffer(INITIAL_UB_SIZE, MemoryTypes.HOST_MEM));
71+
6172
if (this.uniformBuffers != null) {
6273
Arrays.stream(this.uniformBuffers).iterator().forEachRemaining(
6374
Buffer::freeBuffer
@@ -69,54 +80,38 @@ public void createResources(int framesNum) {
6980

7081
public void resetBuffers(int currentFrame) {
7182
this.vertexBuffers[currentFrame].reset();
83+
this.indexBuffers[currentFrame].reset();
7284
this.uniformBuffers[currentFrame].reset();
7385
}
7486

75-
public void draw(ByteBuffer buffer, VertexFormat.Mode mode, VertexFormat vertexFormat, int vertexCount) {
76-
AutoIndexBuffer autoIndexBuffer;
77-
int indexCount;
87+
public void draw(ByteBuffer vertexData, VertexFormat.Mode mode, VertexFormat vertexFormat, int vertexCount) {
88+
draw(vertexData, null, mode, vertexFormat, vertexCount);
89+
}
7890

91+
public void draw(ByteBuffer vertexData, ByteBuffer indexData, VertexFormat.Mode mode, VertexFormat vertexFormat, int vertexCount) {
7992
VertexBuffer vertexBuffer = this.vertexBuffers[this.currentFrame];
80-
vertexBuffer.copyToVertexBuffer(vertexFormat.getVertexSize(), vertexCount, buffer);
93+
vertexBuffer.copyToVertexBuffer(vertexFormat.getVertexSize(), vertexCount, vertexData);
8194

82-
switch (mode) {
83-
case QUADS -> {
84-
indexCount = vertexCount * 3 / 2;
95+
if (indexData != null) {
96+
IndexBuffer indexBuffer = this.indexBuffers[this.currentFrame];
97+
indexBuffer.copyBuffer(indexData);
8598

86-
autoIndexBuffer = indexCount > AutoIndexBuffer.U16_MAX_INDEX_COUNT
87-
? this.quadsIntIndexBuffer : this.quadsIndexBuffer;
88-
}
89-
case LINES -> {
90-
autoIndexBuffer = this.linesIndexBuffer;
91-
indexCount = vertexCount * 3 / 2;
92-
}
93-
case TRIANGLE_FAN -> {
94-
autoIndexBuffer = this.triangleFanIndexBuffer;
95-
indexCount = (vertexCount - 2) * 3;
96-
}
97-
case TRIANGLE_STRIP, LINE_STRIP -> {
98-
autoIndexBuffer = this.triangleStripIndexBuffer;
99-
indexCount = (vertexCount - 2) * 3;
100-
}
101-
case DEBUG_LINE_STRIP -> {
102-
autoIndexBuffer = this.debugLineStripIndexBuffer;
103-
indexCount = (vertexCount - 1) * 2;
104-
}
105-
case TRIANGLES, DEBUG_LINES -> {
106-
indexCount = 0;
107-
autoIndexBuffer = null;
108-
}
109-
default -> throw new RuntimeException(String.format("unknown drawMode: %s", mode));
99+
int indexCount = vertexCount * 3 / 2;
100+
101+
drawIndexed(vertexBuffer, indexBuffer, indexCount);
110102
}
103+
else {
104+
AutoIndexBuffer autoIndexBuffer = getAutoIndexBuffer(mode, vertexCount);
111105

112-
if (indexCount > 0) {
113-
autoIndexBuffer.checkCapacity(vertexCount);
106+
if (autoIndexBuffer != null) {
107+
int indexCount = autoIndexBuffer.getIndexCount(vertexCount);
114108

115-
drawIndexed(vertexBuffer, autoIndexBuffer.getIndexBuffer(), indexCount);
116-
} else {
117-
draw(vertexBuffer, vertexCount);
109+
drawIndexed(vertexBuffer, autoIndexBuffer.getIndexBuffer(), indexCount);
110+
}
111+
else {
112+
draw(vertexBuffer, vertexCount);
113+
}
118114
}
119-
120115
}
121116

122117
public void drawIndexed(VertexBuffer vertexBuffer, IndexBuffer indexBuffer, int indexCount) {
@@ -150,9 +145,11 @@ public void cleanUpResources() {
150145
buffer = this.vertexBuffers[i];
151146
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
152147

153-
buffer = this.uniformBuffers[i];
148+
buffer = this.indexBuffers[i];
154149
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
155150

151+
buffer = this.uniformBuffers[i];
152+
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
156153
}
157154

158155
this.quadsIndexBuffer.freeBuffer();
@@ -185,4 +182,19 @@ public UniformBuffer getUniformBuffer() {
185182
return this.uniformBuffers[this.currentFrame];
186183
}
187184

185+
private AutoIndexBuffer getAutoIndexBuffer(VertexFormat.Mode mode, int vertexCount) {
186+
return switch (mode) {
187+
case QUADS -> {
188+
int indexCount = vertexCount * 3 / 2;
189+
190+
yield indexCount > AutoIndexBuffer.U16_MAX_INDEX_COUNT
191+
? this.quadsIntIndexBuffer : this.quadsIndexBuffer;
192+
}
193+
case LINES -> this.linesIndexBuffer;
194+
case TRIANGLE_FAN -> this.triangleFanIndexBuffer;
195+
case TRIANGLE_STRIP, LINE_STRIP -> this.triangleStripIndexBuffer;
196+
case DEBUG_LINE_STRIP -> this.debugLineStripIndexBuffer;
197+
case TRIANGLES, DEBUG_LINES -> null;
198+
};
199+
}
188200
}

src/main/java/net/vulkanmod/vulkan/memory/AutoIndexBuffer.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ private void createIndexBuffer(int vertexCount) {
5050
MemoryUtil.memFree(buffer);
5151
}
5252

53+
public int getIndexCount(int vertexCount) {
54+
switch (this.drawType) {
55+
case QUADS, LINES -> {
56+
return vertexCount * 3 / 2;
57+
}
58+
case TRIANGLE_FAN, TRIANGLE_STRIP -> {
59+
return (vertexCount - 2) * 3;
60+
}
61+
case DEBUG_LINE_STRIP -> {
62+
return (vertexCount - 1) * 2;
63+
}
64+
default -> throw new RuntimeException(String.format("unknown drawMode: %s", this.drawType));
65+
}
66+
}
67+
5368
public void checkCapacity(int vertexCount) {
5469
if(vertexCount > this.vertexCount) {
5570
int newVertexCount = this.vertexCount * 2;
@@ -202,14 +217,6 @@ public enum DrawType {
202217
this.n = n;
203218
}
204219

205-
public static int getIndexCount(DrawType drawType, int vertexCount) {
206-
return switch (drawType) {
207-
case QUADS, LINES -> vertexCount * 3 / 2;
208-
case TRIANGLE_FAN, TRIANGLE_STRIP -> (vertexCount - 2) * 3;
209-
default -> 0;
210-
};
211-
}
212-
213220
public static int getQuadIndexCount(int vertexCount) {
214221
return vertexCount * 3 / 2;
215222
}

0 commit comments

Comments
 (0)