Skip to content

Commit

Permalink
Memory Leaks fixes
Browse files Browse the repository at this point in the history
Fixes

Co-Authored-By: IMS <[email protected]>
  • Loading branch information
Asek3 and IMS212 committed Sep 7, 2023
1 parent a042617 commit 86850e3
Show file tree
Hide file tree
Showing 13 changed files with 92 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,13 @@ public int getUsedSize() {
return size;
}

@Override
public void freeAndDeleteBuffer() {
for (SegmentedBufferBuilder builder : builders) {
builder.freeAndDeleteBuffer();
}
}

@Override
public void startGroup() {
renderOrderManager.startGroup();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
public interface MemoryTrackingBuffer {
int getAllocatedSize();
int getUsedSize();
void freeAndDeleteBuffer();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ public interface MemoryTrackingRenderBuffers {
int getEntityBufferAllocatedSize();
int getMiscBufferAllocatedSize();
int getMaxBegins();
void freeAndDeleteBuffers();
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,9 @@ public int getAllocatedSize() {
public int getUsedSize() {
return ((MemoryTrackingBuffer) buffer).getUsedSize();
}

@Override
public void freeAndDeleteBuffer() {
((MemoryTrackingBuffer) buffer).freeAndDeleteBuffer();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.coderbot.batchedentityrendering.mixin;

import com.mojang.blaze3d.vertex.BufferBuilder;
import net.minecraft.client.renderer.ChunkBufferBuilderPack;
import net.minecraft.client.renderer.RenderType;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

import java.util.Map;

@Mixin(ChunkBufferBuilderPack.class)
public interface ChunkBufferBuilderPackAccessor {
@Accessor
Map<RenderType, BufferBuilder> getBuilders();
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.nio.ByteBuffer;

import org.lwjgl.system.MemoryUtil;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;

Expand All @@ -23,4 +24,10 @@ public int getAllocatedSize() {
public int getUsedSize() {
return buffer.position();
}

@Override
public void freeAndDeleteBuffer() {
MemoryUtil.memFree(buffer);
buffer = null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,13 @@ public int getUsedSize() {

return allocatedSize;
}

@Override
public void freeAndDeleteBuffer() {
((MemoryTrackingBuffer) builder).freeAndDeleteBuffer();

for (BufferBuilder builder : fixedBuffers.values()) {
((MemoryTrackingBuffer) builder).freeAndDeleteBuffer();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package net.coderbot.batchedentityrendering.mixin;

import com.mojang.blaze3d.vertex.BufferBuilder;
import net.minecraft.client.renderer.*;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
Expand All @@ -13,9 +15,8 @@
import net.coderbot.batchedentityrendering.impl.MemoryTrackingBuffer;
import net.coderbot.batchedentityrendering.impl.MemoryTrackingRenderBuffers;
import net.coderbot.batchedentityrendering.impl.RenderBuffersExt;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.OutlineBufferSource;
import net.minecraft.client.renderer.RenderBuffers;

import java.util.SortedMap;

@Mixin(RenderBuffers.class)
public class MixinRenderBuffers implements RenderBuffersExt, MemoryTrackingRenderBuffers, DrawCallTrackingRenderBuffers {
Expand All @@ -35,6 +36,14 @@ public class MixinRenderBuffers implements RenderBuffersExt, MemoryTrackingRende
@Final
private MultiBufferSource.BufferSource bufferSource;

@Shadow
@Final
private ChunkBufferBuilderPack fixedBufferPack;

@Shadow
@Final
private SortedMap<RenderType, BufferBuilder> fixedBuffers;

@Inject(method = "bufferSource", at = @At("HEAD"), cancellable = true)
private void batchedentityrendering$replaceBufferSource(CallbackInfoReturnable<MultiBufferSource.BufferSource> cir) {
if (begins == 0) {
Expand Down Expand Up @@ -106,6 +115,14 @@ public int getMaxBegins() {
return maxBegins;
}

@Override
public void freeAndDeleteBuffers() {
buffered.freeAndDeleteBuffer();
((ChunkBufferBuilderPackAccessor) this.fixedBufferPack).getBuilders().values().forEach(bufferBuilder -> ((MemoryTrackingBuffer) bufferBuilder).freeAndDeleteBuffer());
fixedBuffers.values().forEach(bufferBuilder -> ((MemoryTrackingBuffer) bufferBuilder).freeAndDeleteBuffer());
((MemoryTrackingBuffer) ((OutlineBufferSourceAccessor) outlineBufferSource).getOutlineBufferSource()).freeAndDeleteBuffer();
}

@Override
public int getDrawCalls() {
return buffered.getDrawCalls();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.coderbot.batchedentityrendering.mixin;

import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.OutlineBufferSource;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(OutlineBufferSource.class)
public interface OutlineBufferSourceAccessor {
@Accessor
MultiBufferSource.BufferSource getOutlineBufferSource();
}
Original file line number Diff line number Diff line change
Expand Up @@ -853,6 +853,10 @@ public void destroy() {
shadowRenderTargets.destroy();
}

if(shadowRenderer != null) {
shadowRenderer.destroy();
}

// Destroy custom textures and the static samplers (normals, specular, and noise)
customTextureManager.destroy();
whitePixel.releaseId();
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/net/coderbot/iris/pipeline/ShadowRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import java.util.List;
import java.util.Objects;

import net.coderbot.batchedentityrendering.impl.MemoryTrackingRenderBuffers;
import org.lwjgl.opengl.ARBTextureSwizzle;
import org.lwjgl.opengl.GL20C;
import org.lwjgl.opengl.GL30C;
Expand Down Expand Up @@ -649,6 +650,11 @@ private String getBlockEntitiesDebugString() {
return shouldRenderBlockEntities ? (renderedShadowBlockEntities + "/" + Minecraft.getInstance().level.blockEntityList.size()) : "disabled by pack";
}

public void destroy() {
targets.destroy();
((MemoryTrackingRenderBuffers) buffers).freeAndDeleteBuffers();
}

private static class MipmapPass {
private final int texture;
private final int targetFilteringMode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ public static void addExternallyManagedUniforms(UniformHolder uniformHolder) {
addMat4(uniformHolder, "iris_ModelViewMatrix");
addMat4(uniformHolder, "u_ModelViewProjectionMatrix");
addMat4(uniformHolder, "iris_NormalMatrix");
// Exclusive to pre-1.19
addFloat(uniformHolder, "darknessFactor");
addFloat(uniformHolder, "darknessLightFactor");
}

public static void addExternallyManagedUniforms116(UniformHolder uniformHolder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
"refmap": "oculus-refmap.json",
"compatibilityLevel": "JAVA_8",
"client": [
"ChunkBufferBuilderPackAccessor",
"OutlineBufferSourceAccessor",
"MixinBufferBuilder",
"MixinBufferBuilder_SegmentRendering",
"MixinRenderBuffers",
Expand Down

0 comments on commit 86850e3

Please sign in to comment.