Skip to content

Commit

Permalink
Experimental fix for 24w21a corruption
Browse files Browse the repository at this point in the history
  • Loading branch information
IMS212 committed May 23, 2024
1 parent 1bed11b commit b7beb15
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 29 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ object Constants {
const val CUSTOM_SODIUM_NAME: String = "sodium-fabric-0.5.8-snapshot+mc24w21b-local.jar"

const val IS_SHARED_BETA: Boolean = false
const val ACTIVATE_RENDERDOC: Boolean = true
const val ACTIVATE_RENDERDOC: Boolean = false
const val BETA_TAG: String = "DH Support"
const val BETA_VERSION = 4

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package net.irisshaders.batchedentityrendering.impl;

import com.mojang.blaze3d.vertex.ByteBufferBuilder;

public class ByteBufferBuilderHolder implements MemoryTrackingBuffer {
private final ByteBufferBuilder builder;
private long lastUse;

public ByteBufferBuilderHolder(ByteBufferBuilder builder) {
this.lastUse = System.currentTimeMillis();
this.builder = builder;
}

public ByteBufferBuilder getBuffer() {
this.lastUse = System.currentTimeMillis();

return builder;
}

public boolean deleteOrClear() {
// If it's been 10 seconds since the last use, delete the buffer.
if (lastUse - System.currentTimeMillis() > 10000) {
this.builder.close();
return true;
} else {
this.builder.clear();
return false;
}
}

public void forceDelete() {
this.builder.close();
}

@Override
public int getAllocatedSize() {
return ((MemoryTrackingBuffer) builder).getAllocatedSize();
}

@Override
public int getUsedSize() {
return ((MemoryTrackingBuffer) builder).getUsedSize();
}

@Override
public void freeAndDeleteBuffer() {
builder.close();
}

public void wasUsed() {
this.lastUse = System.currentTimeMillis();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ public void endBatch() {
profiler.push("draw buffers");

for (RenderType type : renderOrder) {
if (!typeToSegment.containsKey(type)) continue;

type.setupRenderState();

renderTypes += 1;
Expand All @@ -146,6 +148,10 @@ public void endBatch() {
type.clearRenderState();
}

for (SegmentedBufferBuilder builder : builders) {
builder.clearBuffers();
}

profiler.popPush("reset");

removeReady();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,19 @@
import net.minecraft.client.renderer.RenderType;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

public class SegmentedBufferBuilder implements MultiBufferSource, MemoryTrackingBuffer {
private final ByteBufferBuilder buffer;
private final Map<RenderType, ByteBufferBuilderHolder> buffers;
private final Map<RenderType, BufferBuilder> builders;
private final List<BufferSegment> buffers;
private final List<BufferSegment> segments;

public SegmentedBufferBuilder() {
// 2 MB initial allocation
this.buffer = new ByteBufferBuilder(512 * 1024);
this.buffers = new Object2ObjectOpenHashMap<>();
this.builders = new Object2ObjectOpenHashMap<>();
this.buffers = new ArrayList<>();
this.segments = new ArrayList<>();
}

private static boolean shouldSortOnUpload(RenderType type) {
Expand All @@ -34,7 +32,10 @@ private static boolean shouldSortOnUpload(RenderType type) {

@Override
public VertexConsumer getBuffer(RenderType renderType) {
BufferBuilder builder = builders.computeIfAbsent(renderType, (t) -> new BufferBuilder(buffer, renderType.mode(), renderType.format()));
ByteBufferBuilderHolder buffer = buffers.computeIfAbsent(renderType, (r) -> new ByteBufferBuilderHolder(new ByteBufferBuilder(512*2024)));

buffer.wasUsed();
BufferBuilder builder = builders.computeIfAbsent(renderType, (t) -> new BufferBuilder(buffer.getBuffer(), renderType.mode(), renderType.format()));

// Use duplicate vertices to break up triangle strips
// https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Art/degenerate_triangle_strip_2x.png
Expand All @@ -54,33 +55,51 @@ public List<BufferSegment> getSegments() {
if (meshData == null) return;

if (shouldSortOnUpload(renderType)) {
meshData.sortQuads(buffer, RenderSystem.getVertexSorting());
meshData.sortQuads(buffers.get(renderType).getBuffer(), RenderSystem.getVertexSorting());
}

buffers.add(new BufferSegment(meshData, renderType));
segments.add(new BufferSegment(meshData, renderType));
}));

builders.clear();

List<BufferSegment> finalSegments = new ArrayList<>(buffers);
List<BufferSegment> finalSegments = new ArrayList<>(segments);

buffers.clear();
segments.clear();

return finalSegments;
}

@Override
public int getAllocatedSize() {
return ((MemoryTrackingBuffer) buffer).getAllocatedSize();
int usedSize = 0;
for (ByteBufferBuilderHolder buffer : buffers.values()) {
usedSize += ((MemoryTrackingBuffer) buffer).getAllocatedSize();
}

return usedSize;
}

@Override
public int getUsedSize() {
return ((MemoryTrackingBuffer) buffer).getUsedSize();
int usedSize = 0;
for (ByteBufferBuilderHolder buffer : buffers.values()) {
usedSize += ((MemoryTrackingBuffer) buffer).getUsedSize();
}

return usedSize;
}

@Override
public void freeAndDeleteBuffer() {
((MemoryTrackingBuffer) buffer).freeAndDeleteBuffer();
for (ByteBufferBuilderHolder buffer : buffers.values()) {
buffer.forceDelete();
}

buffers.clear();
}

public void clearBuffers() {
buffers.values().removeIf(ByteBufferBuilderHolder::deleteOrClear);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,20 +109,6 @@ public abstract class MixinBufferBuilder implements VertexConsumer, BlockSensiti
return format;
}

// TODO: why is this needed?
@Inject(method = "<init>", at = @At("TAIL"))
private void ensureInit(ByteBufferBuilder byteBufferBuilder, VertexFormat.Mode mode, VertexFormat vertexFormat, CallbackInfo ci) {
if (this.format == IrisVertexFormats.TERRAIN || this.format == IrisVertexFormats.ENTITY || this.format == IrisVertexFormats.GLYPH) {
if (!this.extending) {
throw new IllegalStateException("wtf (again)?");
} else if (this.format == IrisVertexFormats.TERRAIN && !iris$isTerrain) {
throw new IllegalStateException("wtf (again x2)");
} else if (this.format != IrisVertexFormats.TERRAIN && iris$isTerrain) {
throw new IllegalStateException("wtf (again x3)");
}
}
}

@Redirect(method = "addVertex(FFFIFFIIFFF)V", at = @At(value = "FIELD", target = "Lcom/mojang/blaze3d/vertex/BufferBuilder;fastFormat:Z"))
private boolean fastFormat(BufferBuilder instance) {
return this.fastFormat && !extending;
Expand Down

0 comments on commit b7beb15

Please sign in to comment.