Only upload unique LOD uniforms once

This commit is contained in:
James Seibel
2026-03-09 13:52:05 -05:00
parent e530d0ffda
commit 77016de6e6
4 changed files with 71 additions and 31 deletions
@@ -180,8 +180,7 @@ public class McLodRenderer implements IMcLodRenderer
for (int lodIndex = 0; lodIndex < bufferContainers.size(); lodIndex++)
{
LodBufferContainer bufferContainer = bufferContainers.get(lodIndex);
bufferContainer.uniforms.createBufferData(renderEventParam, bufferContainer);
bufferContainer.uniforms.upload();
bufferContainer.uniformContainer.tryUpload();
}
}
@@ -211,6 +210,7 @@ public class McLodRenderer implements IMcLodRenderer
.putFloat() // uMircoOffset
.putFloat() // uEarthRadius
.putVec3() // uCameraPos
.putMat4f() // uCombinedMatrix
.get();
@@ -223,6 +223,10 @@ public class McLodRenderer implements IMcLodRenderer
.putFloat(0.01f) // uMircoOffset // 0.01 block offset
.putFloat(earthCurveRatio) // uEarthRadius
.putVec3(
(float)renderEventParam.exactCameraPosition.x,
(float)renderEventParam.exactCameraPosition.y,
(float)renderEventParam.exactCameraPosition.z) // uCameraPos
.putMat4f(combinedMatrix.createJomlMatrix()) // uCombinedMatrix
.get();
@@ -337,7 +341,7 @@ public class McLodRenderer implements IMcLodRenderer
profiler.popPush("binding");
LodBufferContainer bufferContainer = bufferContainers.get(lodIndex);
LodUniformBufferWrapper uniformWrapper = (LodUniformBufferWrapper)bufferContainer.uniforms;
LodUniformBufferWrapper uniformWrapper = (LodUniformBufferWrapper)bufferContainer.uniformContainer;
boolean columnBuilderDebugEnabled = Config.Client.Advanced.Debugging.ColumnBuilderDebugging.columnBuilderDebugEnable.get();
if (columnBuilderDebugEnabled)
@@ -14,9 +14,21 @@ import java.nio.ByteBuffer;
/**
* TODO ??
*/
public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implements ILodContainerUniformBufferWrapper
public class LodUniformBufferWrapper extends UniformBufferWrapper implements ILodContainerUniformBufferWrapper
{
private boolean uploaded = false;
//=============//
// constructor //
//=============//
//region
public LodUniformBufferWrapper() { super(LodUniformBufferWrapper.class.getName()); }
//endregion
@@ -25,18 +37,13 @@ public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implem
//========//
//region
public void createBufferData(RenderParams renderEventParam, LodBufferContainer bufferContainer)
@Override
public void createUniformData(LodBufferContainer bufferContainer)
{
Vec3d camPos = renderEventParam.exactCameraPosition;
Vec3f modelOffset = new Vec3f(
(float) (bufferContainer.minCornerBlockPos.getX() - camPos.x),
(float) (bufferContainer.minCornerBlockPos.getY() - camPos.y),
(float) (bufferContainer.minCornerBlockPos.getZ() - camPos.z));
Mat4f combinedMatrix = new Mat4f(renderEventParam.dhProjectionMatrix);
combinedMatrix.multiply(renderEventParam.dhModelViewMatrix);
(float) (bufferContainer.minCornerBlockPos.getX()),
(float) (bufferContainer.minCornerBlockPos.getY()),
(float) (bufferContainer.minCornerBlockPos.getZ()));
// upload data //
@@ -51,6 +58,19 @@ public class LodUniformBufferWrapper extends AbstractUniformBufferWrapper implem
}
@Override
public void tryUpload()
{
if (this.uploaded)
{
return;
}
this.upload();
this.uploaded = true;
}
//endregion
}
@@ -5,6 +5,7 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.systems.CommandEncoder;
import com.mojang.blaze3d.systems.GpuDevice;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.distanthorizons.common.render.blaze.wrappers.buffer.VertexBufferWrapper;
import com.seibel.distanthorizons.core.logging.DhLogger;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWrapper;
@@ -12,7 +13,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.IUniformBufferWr
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrapper
public class UniformBufferWrapper implements IUniformBufferWrapper
{
private static final DhLogger LOGGER = new DhLoggerBuilder().build();
@@ -22,7 +23,10 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
private final String name;
private ByteBuffer buffer = null;
private int cpuBufferSize = 0;
private int gpuBufferSize = 0;
private ByteBuffer cpuBuffer = null;
public GpuBuffer gpuBuffer = null;
@@ -32,7 +36,7 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
//=============//
//region
public AbstractUniformBufferWrapper() { this.name = this.getClass().getSimpleName(); }
public UniformBufferWrapper(String name) { this.name = name; }
//endregion
@@ -45,37 +49,49 @@ public abstract class AbstractUniformBufferWrapper implements IUniformBufferWrap
protected ByteBuffer getOrCreateBuffer(int size)
{
if (this.buffer == null
|| this.buffer.capacity() != size)
if (this.cpuBuffer == null
|| this.cpuBufferSize != size)
{
this.buffer = ByteBuffer.allocateDirect(size);
this.buffer.order(ByteOrder.nativeOrder());
this.cpuBuffer = ByteBuffer.allocateDirect(size);
this.cpuBuffer.order(ByteOrder.nativeOrder());
int usage = GpuBuffer.USAGE_COPY_DST
| GpuBuffer.USAGE_VERTEX
| GpuBuffer.USAGE_UNIFORM;
int byteSize = (this.buffer.limit() - this.buffer.position());
this.gpuBuffer = GPU_DEVICE.createBuffer(this::getBufferName, usage, byteSize);
this.cpuBufferSize = size;
}
return this.buffer;
return this.cpuBuffer;
}
@Override
public void upload() throws IllegalStateException
{
if (this.buffer == null)
if (this.cpuBuffer == null)
{
throw new IllegalStateException("Upload called before buffer was created");
}
if (this.gpuBuffer == null
|| this.gpuBufferSize != this.cpuBufferSize)
{
if (this.gpuBuffer != null)
{
this.gpuBuffer.close();
}
int usage = GpuBuffer.USAGE_COPY_DST
| GpuBuffer.USAGE_VERTEX
| GpuBuffer.USAGE_UNIFORM;
this.gpuBuffer = GPU_DEVICE.createBuffer(this::getBufferName, usage, this.cpuBufferSize);
this.gpuBufferSize = this.cpuBufferSize;
}
int byteSize = (this.buffer.limit() - this.buffer.position());
int byteSize = (this.cpuBuffer.limit() - this.cpuBuffer.position());
GpuBufferSlice bufferSlice = new GpuBufferSlice(this.gpuBuffer, /*offset*/0, byteSize);
if (!bufferSlice.buffer().isClosed())
{
COMMAND_ENCODER.writeToBuffer(bufferSlice, this.buffer);
COMMAND_ENCODER.writeToBuffer(bufferSlice, this.cpuBuffer);
}
else
{