Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/main/java/net/vulkanmod/mixin/compatibility/gl/GL11M.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ public static void glBindTexture(@NativeType("GLenum") int target, @NativeType("
GlTexture.bindTexture(texture);
}

/**
* @author
* @reason
*/
@Overwrite(remap = false)
public static void glLineWidth(@NativeType("GLfloat") float width) {
VRenderSystem.setLineWidth(width);
}

/**
* @author
* @reason
Expand Down
11 changes: 7 additions & 4 deletions src/main/java/net/vulkanmod/mixin/render/BufferUploaderM.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import net.minecraft.client.renderer.ShaderInstance;
import net.vulkanmod.interfaces.ShaderMixed;
import net.vulkanmod.vulkan.Renderer;
import net.vulkanmod.vulkan.VRenderSystem;
import net.vulkanmod.vulkan.shader.GraphicsPipeline;
import net.vulkanmod.vulkan.shader.Pipeline;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;

Expand All @@ -32,15 +33,17 @@ public static void drawWithShader(BufferBuilder.RenderedBuffer buffer) {

Renderer renderer = Renderer.getInstance();

if(parameters.vertexCount() <= 0)
if(parameters.vertexCount() <= 0) {
return;
}

ShaderInstance shaderInstance = RenderSystem.getShader();
//Used to update legacy shader uniforms
//TODO it would be faster to allocate a buffer from stack and set all values
// Used to update legacy shader uniforms
// TODO it would be faster to allocate a buffer from stack and set all values
shaderInstance.apply();

GraphicsPipeline pipeline = ((ShaderMixed)(shaderInstance)).getPipeline();
VRenderSystem.setPrimitiveTopologyGL(parameters.mode().asGLMode);
renderer.bindGraphicsPipeline(pipeline);
renderer.uploadAndBindUBOs(pipeline);
Renderer.getDrawer().draw(buffer.vertexBuffer(), parameters.mode(), parameters.format(), parameters.vertexCount());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,15 @@ public static void disableCull() {
VRenderSystem.disableCull();
}

/**
* @author
*/
@Overwrite(remap = false)
public static void polygonMode(final int i, final int j) {
assertOnGameThread();
VRenderSystem.setPolygonModeGL(i);
}

/**
* @author
*/
Expand Down
75 changes: 42 additions & 33 deletions src/main/java/net/vulkanmod/render/VBO.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import net.vulkanmod.interfaces.ShaderMixed;
import net.vulkanmod.vulkan.Renderer;
import net.vulkanmod.vulkan.VRenderSystem;
import net.vulkanmod.vulkan.memory.*;
import net.vulkanmod.vulkan.memory.AutoIndexBuffer;
import net.vulkanmod.vulkan.memory.IndexBuffer;
import net.vulkanmod.vulkan.memory.MemoryTypes;
import net.vulkanmod.vulkan.memory.VertexBuffer;
import net.vulkanmod.vulkan.shader.GraphicsPipeline;
import net.vulkanmod.vulkan.shader.Pipeline;
import org.joml.Matrix4f;

import java.nio.ByteBuffer;
Expand All @@ -34,7 +36,6 @@ public void upload(BufferBuilder.RenderedBuffer buffer) {

this.indexCount = parameters.indexCount();
this.vertexCount = parameters.vertexCount();
// this.indexType = parameters.indexType();
this.mode = parameters.mode();

this.configureVertexFormat(parameters, buffer.vertexBuffer());
Expand All @@ -47,11 +48,11 @@ public void upload(BufferBuilder.RenderedBuffer buffer) {
private void configureVertexFormat(BufferBuilder.DrawState parameters, ByteBuffer data) {
if (!parameters.indexOnly()) {

if(vertexBuffer != null)
if (this.vertexBuffer != null)
this.vertexBuffer.freeBuffer();

this.vertexBuffer = new VertexBuffer(data.remaining(), MemoryTypes.GPU_MEM);
vertexBuffer.copyToVertexBuffer(parameters.format().getVertexSize(), parameters.vertexCount(), data);
this.vertexBuffer.copyToVertexBuffer(parameters.format().getVertexSize(), parameters.vertexCount(), data);

}
}
Expand All @@ -63,34 +64,43 @@ private void configureIndexBuffer(BufferBuilder.DrawState parameters, ByteBuffer
switch (this.mode) {
case TRIANGLE_FAN -> {
autoIndexBuffer = Renderer.getDrawer().getTriangleFanIndexBuffer();
this.indexCount = (vertexCount - 2) * 3;
this.indexCount = AutoIndexBuffer.DrawType.getTriangleStripIndexCount(this.vertexCount);
}
case TRIANGLE_STRIP, LINE_STRIP -> {
autoIndexBuffer = Renderer.getDrawer().getTriangleStripIndexBuffer();
this.indexCount = AutoIndexBuffer.DrawType.getTriangleStripIndexCount(this.vertexCount);
}
case QUADS -> {
autoIndexBuffer = Renderer.getDrawer().getQuadsIndexBuffer();
}
case TRIANGLES -> {
case LINES -> {
autoIndexBuffer = Renderer.getDrawer().getLinesIndexBuffer();
}
case DEBUG_LINE_STRIP -> {
autoIndexBuffer = Renderer.getDrawer().getDebugLineStripIndexBuffer();
}
case TRIANGLES, DEBUG_LINES -> {
autoIndexBuffer = null;
}
default -> throw new IllegalStateException("Unexpected draw mode:" + this.mode);
default -> throw new IllegalStateException("Unexpected draw mode: %s".formatted(this.mode));
}

if(indexBuffer != null && !this.autoIndexed)
indexBuffer.freeBuffer();
if (this.indexBuffer != null && !this.autoIndexed)
this.indexBuffer.freeBuffer();

if(autoIndexBuffer != null) {
autoIndexBuffer.checkCapacity(vertexCount);
indexBuffer = autoIndexBuffer.getIndexBuffer();
if (autoIndexBuffer != null) {
autoIndexBuffer.checkCapacity(this.vertexCount);
this.indexBuffer = autoIndexBuffer.getIndexBuffer();
}

this.autoIndexed = true;

}
else {
if(indexBuffer != null)
} else {
if (this.indexBuffer != null)
this.indexBuffer.freeBuffer();

this.indexBuffer = new IndexBuffer(data.remaining(), MemoryTypes.GPU_MEM);
// this.indexBuffer = new AsyncIndexBuffer(data.remaining());
indexBuffer.copyBuffer(data);
this.indexBuffer.copyBuffer(data);
}

}
Expand All @@ -101,7 +111,7 @@ public void drawWithShader(Matrix4f MV, Matrix4f P, ShaderInstance shader) {

RenderSystem.setShader(() -> shader);

drawWithShader(MV, P, ((ShaderMixed)shader).getPipeline());
drawWithShader(MV, P, ((ShaderMixed) shader).getPipeline());

}
}
Expand All @@ -116,10 +126,10 @@ public void drawWithShader(Matrix4f MV, Matrix4f P, GraphicsPipeline pipeline) {
renderer.bindGraphicsPipeline(pipeline);
renderer.uploadAndBindUBOs(pipeline);

if(indexBuffer != null)
Renderer.getDrawer().drawIndexed(vertexBuffer, indexBuffer, indexCount);
if (this.indexBuffer != null)
Renderer.getDrawer().drawIndexed(this.vertexBuffer, this.indexBuffer, this.indexCount);
else
Renderer.getDrawer().draw(vertexBuffer, vertexCount);
Renderer.getDrawer().draw(this.vertexBuffer, this.vertexCount);

VRenderSystem.applyMVP(RenderSystem.getModelViewMatrix(), RenderSystem.getProjectionMatrix());

Expand All @@ -130,25 +140,24 @@ public void drawChunkLayer() {
if (this.indexCount != 0) {

RenderSystem.assertOnRenderThread();
Renderer.getDrawer().drawIndexed(vertexBuffer, indexBuffer, indexCount);
Renderer.getDrawer().drawIndexed(this.vertexBuffer, this.indexBuffer, this.indexCount);
}
}

public void close() {
if(vertexCount <= 0) return;
vertexBuffer.freeBuffer();
vertexBuffer = null;
if(!autoIndexed) {
indexBuffer.freeBuffer();
indexBuffer = null;
if (this.vertexCount <= 0)
return;

this.vertexBuffer.freeBuffer();
this.vertexBuffer = null;

if (!this.autoIndexed) {
this.indexBuffer.freeBuffer();
this.indexBuffer = null;
}

this.vertexCount = 0;
this.indexCount = 0;
}

// public VertexFormat getFormat() {
// return this.vertexFormat;
// }

}
5 changes: 4 additions & 1 deletion src/main/java/net/vulkanmod/render/chunk/WorldRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import net.vulkanmod.vulkan.Renderer;
import net.vulkanmod.vulkan.VRenderSystem;
import net.vulkanmod.vulkan.memory.Buffer;
import net.vulkanmod.vulkan.memory.IndexBuffer;
import net.vulkanmod.vulkan.memory.IndirectBuffer;
import net.vulkanmod.vulkan.memory.MemoryTypes;
import net.vulkanmod.vulkan.shader.GraphicsPipeline;
Expand Down Expand Up @@ -312,7 +313,9 @@ public void renderSectionLayer(RenderType renderType, PoseStack poseStack, doubl
Renderer renderer = Renderer.getInstance();
GraphicsPipeline pipeline = PipelineManager.getTerrainShader(terrainRenderType);
renderer.bindGraphicsPipeline(pipeline);
Renderer.getDrawer().bindAutoIndexBuffer(Renderer.getCommandBuffer(), 7);

IndexBuffer indexBuffer = Renderer.getDrawer().getQuadsIndexBuffer().getIndexBuffer();
Renderer.getDrawer().bindIndexBuffer(Renderer.getCommandBuffer(), indexBuffer);

int currentFrame = Renderer.getCurrentFrame();
Set<TerrainRenderType> allowedRenderTypes = Initializer.CONFIG.uniqueOpaqueLayer ? TerrainRenderType.COMPACT_RENDER_TYPES : TerrainRenderType.SEMI_COMPACT_RENDER_TYPES;
Expand Down
73 changes: 37 additions & 36 deletions src/main/java/net/vulkanmod/vulkan/Drawer.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ public class Drawer {

public Drawer() {
// Index buffers
quadsIndexBuffer = new AutoIndexBuffer(MAX_QUAD_VERTICES_UINT16, AutoIndexBuffer.DrawType.QUADS);
linesIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.LINES);
debugLineStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.DEBUG_LINE_STRIP);
triangleFanIndexBuffer = new AutoIndexBuffer(1000, AutoIndexBuffer.DrawType.TRIANGLE_FAN);
triangleStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.TRIANGLE_STRIP);
this.quadsIndexBuffer = new AutoIndexBuffer(MAX_QUAD_VERTICES_UINT16, AutoIndexBuffer.DrawType.QUADS);
this.linesIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.LINES);
this.debugLineStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.DEBUG_LINE_STRIP);
this.triangleFanIndexBuffer = new AutoIndexBuffer(1000, AutoIndexBuffer.DrawType.TRIANGLE_FAN);
this.triangleStripIndexBuffer = new AutoIndexBuffer(10000, AutoIndexBuffer.DrawType.TRIANGLE_STRIP);
}

public void setCurrentFrame(int currentFrame) {
Expand All @@ -50,7 +50,7 @@ public void setCurrentFrame(int currentFrame) {
public void createResources(int framesNum) {
this.framesNum = framesNum;

if (vertexBuffers != null) {
if (this.vertexBuffers != null) {
Arrays.stream(this.vertexBuffers).iterator().forEachRemaining(
Buffer::freeBuffer
);
Expand All @@ -76,7 +76,7 @@ public void draw(ByteBuffer buffer, VertexFormat.Mode mode, VertexFormat vertexF
AutoIndexBuffer autoIndexBuffer;
int indexCount;

VertexBuffer vertexBuffer = this.vertexBuffers[currentFrame];
VertexBuffer vertexBuffer = this.vertexBuffers[this.currentFrame];
vertexBuffer.copyToVertexBuffer(vertexFormat.getVertexSize(), vertexCount, buffer);

switch (mode) {
Expand Down Expand Up @@ -117,18 +117,6 @@ public void draw(ByteBuffer buffer, VertexFormat.Mode mode, VertexFormat vertexF

}

public AutoIndexBuffer getQuadsIndexBuffer() {
return quadsIndexBuffer;
}

public AutoIndexBuffer getTriangleFanIndexBuffer() {
return triangleFanIndexBuffer;
}

public UniformBuffer getUniformBuffer() {
return this.uniformBuffers[currentFrame];
}

public void drawIndexed(VertexBuffer vertexBuffer, IndexBuffer indexBuffer, int indexCount) {
VkCommandBuffer commandBuffer = Renderer.getCommandBuffer();

Expand All @@ -150,22 +138,13 @@ public void draw(VertexBuffer vertexBuffer, int vertexCount) {
vkCmdDraw(commandBuffer, vertexCount, 1, 0, 0);
}

public void bindAutoIndexBuffer(VkCommandBuffer commandBuffer, int drawMode) {
AutoIndexBuffer autoIndexBuffer;
switch (drawMode) {
case 7 -> autoIndexBuffer = this.quadsIndexBuffer;
case 6 -> autoIndexBuffer = this.triangleFanIndexBuffer;
case 5 -> autoIndexBuffer = this.triangleStripIndexBuffer;
default -> throw new RuntimeException("unknown drawType");
}
IndexBuffer indexBuffer = autoIndexBuffer.getIndexBuffer();

public void bindIndexBuffer(VkCommandBuffer commandBuffer, IndexBuffer indexBuffer) {
vkCmdBindIndexBuffer(commandBuffer, indexBuffer.getId(), indexBuffer.getOffset(), VK_INDEX_TYPE_UINT16);
}

public void cleanUpResources() {
Buffer buffer;
for (int i = 0; i < framesNum; ++i) {
for (int i = 0; i < this.framesNum; ++i) {
buffer = this.vertexBuffers[i];
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());

Expand All @@ -174,12 +153,34 @@ public void cleanUpResources() {

}

buffer = this.quadsIndexBuffer.getIndexBuffer();
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
buffer = this.triangleFanIndexBuffer.getIndexBuffer();
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
buffer = this.triangleStripIndexBuffer.getIndexBuffer();
MemoryManager.freeBuffer(buffer.getId(), buffer.getAllocation());
this.quadsIndexBuffer.freeBuffer();
this.linesIndexBuffer.freeBuffer();
this.triangleFanIndexBuffer.freeBuffer();
this.debugLineStripIndexBuffer.freeBuffer();
}

public AutoIndexBuffer getQuadsIndexBuffer() {
return this.quadsIndexBuffer;
}

public AutoIndexBuffer getLinesIndexBuffer() {
return this.linesIndexBuffer;
}

public AutoIndexBuffer getTriangleFanIndexBuffer() {
return this.triangleFanIndexBuffer;
}

public AutoIndexBuffer getTriangleStripIndexBuffer() {
return this.triangleStripIndexBuffer;
}

public AutoIndexBuffer getDebugLineStripIndexBuffer() {
return this.debugLineStripIndexBuffer;
}

public UniformBuffer getUniformBuffer() {
return this.uniformBuffers[this.currentFrame];
}

}
9 changes: 9 additions & 0 deletions src/main/java/net/vulkanmod/vulkan/Renderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ public Renderer() {
imagesNum = getSwapChain().getImagesNum();
}

public static void setLineWidth(float width) {
if (INSTANCE.boundFramebuffer == null) {
return;
}
vkCmdSetLineWidth(INSTANCE.currentCmdBuffer, width);
}

private void init() {
MemoryManager.createInstance(Renderer.getFramesNum());
Vulkan.createStagingBuffers();
Expand Down Expand Up @@ -250,6 +257,8 @@ public void beginFrame() {
mainPass.begin(commandBuffer, stack);

vkCmdSetDepthBias(commandBuffer, 0.0F, 0.0F, 0.0F);

vkCmdSetLineWidth(commandBuffer, 1.0F);
}

p.pop();
Expand Down
Loading