Render task handler name tracking

This commit is contained in:
James Seibel
2026-03-14 09:20:01 -05:00
parent e27cee1f71
commit 38e104a9fc
4 changed files with 90 additions and 19 deletions
@@ -90,7 +90,7 @@ public class ClientPluginChannelApi
LOGGER.info("Server level key received: [" + msg.levelKey + "].");
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() ->
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("ClientPluginChannelApi onLevelInitMessage", () ->
{
IClientLevelWrapper clientLevel = MC.getWrappedClientLevel(true);
IServerKeyedClientLevel existingKeyedClientLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel();
@@ -129,7 +129,7 @@ public class LodBufferContainer implements AutoCloseable
// upload on MC's render thread
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() ->
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("LodBufferContainer Upload", () ->
{
try
{
@@ -291,7 +291,7 @@ public class LodBufferContainer implements AutoCloseable
{
this.buffersUploaded = false;
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() ->
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("LodBufferContainer Close", () ->
{
for (IVertexBufferWrapper buffer : this.vbos)
{
@@ -7,6 +7,8 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.TimerUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
import org.jetbrains.annotations.Nullable;
import java.util.Timer;
import java.util.concurrent.ConcurrentLinkedQueue;
@@ -47,23 +49,17 @@ public class RenderThreadTaskHandler
//==============//
//region
public void queueRunningOnRenderThread(Runnable renderCall)
public void queueRunningOnRenderThread(String name, Runnable renderCall)
{
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
RENDER_THREAD_RUNNABLE_QUEUE.add(() -> this.createRenderThreadRunnable(renderCall, stackTrace));
}
private void createRenderThreadRunnable(Runnable renderCall, StackTraceElement[] stackTrace)
{
try
// don't get the stacktrace on release to reduce GC pressure
StackTraceElement[] stackTrace = null;
if (ModInfo.IS_DEV_BUILD)
{
renderCall.run();
}
catch (Exception e)
{
RuntimeException error = new RuntimeException("Uncaught Exception during GL call execution:", e);
error.setStackTrace(stackTrace);
LOGGER.error("[" + Thread.currentThread().getName() + "] ran into an unexpected error running a GL call, Error: ["+ e.getMessage() +"].", error);
stackTrace = Thread.currentThread().getStackTrace();
}
QueuedRunnable runnable = new QueuedRunnable(name, renderCall, stackTrace);
RENDER_THREAD_RUNNABLE_QUEUE.add(runnable);
}
//endregion
@@ -136,7 +132,82 @@ public class RenderThreadTaskHandler
MC.executeOnRenderThread(() -> this.runRenderThreadTasks(1_000));
}
//end region
//endregion
//================//
// helper classes //
//================//
//region
private static class QueuedRunnable implements Runnable
{
/** used to easily track what's being done on the render thread */
public final String name;
public final Runnable renderCall;
/** will be null on release build to reduce GC pressure */
@Nullable
public final StackTraceElement[] stackTrace;
//=============//
// constructor //
//=============//
//region
public QueuedRunnable(String name, Runnable renderCall, @Nullable StackTraceElement[] stackTrace)
{
this.name = name;
this.renderCall = renderCall;
this.stackTrace = stackTrace;
}
//endregion
//=========//
// running //
//=========//
//region
@Override
public void run()
{
try
{
this.renderCall.run();
}
catch (Exception e)
{
RuntimeException error = new RuntimeException("Uncaught Exception during GL call execution. StackTrace: ["+(this.stackTrace != null ? "Present" : "Missing")+"] Error: ["+e.getMessage()+"]", e);
if (this.stackTrace != null)
{
error.setStackTrace(this.stackTrace);
}
LOGGER.error("[" + Thread.currentThread().getName() + "] ran into an unexpected error running a GL call, Error: ["+ e.getMessage() +"].", error);
}
}
//endregion
//================//
// base overrides //
//================//
//region
@Override
public String toString() { return this.name; }
//endregion
}
//endregion
@@ -346,7 +346,7 @@ public class RenderableBoxGroup
@Override
public void close()
{
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() ->
RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("RenderBoxGroup Close", () ->
{
this.vertexBufferContainer.close();
this.altVertexBufferContainer.close();