Add more debug info

- Flywheel version
 - Vertex/Instance count
 - Origin coordinate for Instancing Engine
This commit is contained in:
Jozufozu 2022-01-31 13:13:27 -08:00
parent 84432fb837
commit 24423c56a8
16 changed files with 133 additions and 31 deletions

View file

@ -2,6 +2,7 @@ package com.jozufozu.flywheel;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import com.jozufozu.flywheel.config.EngineArgument; import com.jozufozu.flywheel.config.EngineArgument;
import com.jozufozu.flywheel.config.FlwCommands; import com.jozufozu.flywheel.config.FlwCommands;
@ -13,17 +14,27 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.forgespi.language.IModFileInfo;
@Mod(Flywheel.ID) @Mod(Flywheel.ID)
public class Flywheel { public class Flywheel {
public static final String ID = "flywheel"; public static final String ID = "flywheel";
public static final Logger LOGGER = LogManager.getLogger(Flywheel.class); public static final Logger LOGGER = LogManager.getLogger(Flywheel.class);
public static ArtifactVersion VERSION;
public Flywheel() { public Flywheel() {
IModFileInfo modFileById = ModList.get()
.getModFileById(ID);
VERSION = modFileById.getMods()
.get(0)
.getVersion();
FMLJavaModLoadingContext.get() FMLJavaModLoadingContext.get()
.getModEventBus() .getModEventBus()
.addListener(this::setup); .addListener(this::setup);

View file

@ -18,7 +18,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
public class FlywheelClient { public class FlywheelClient {
public static void clientInit() { public static void clientInit() {
CrashReportCallables.registerCrashCallable("Flywheel Backend", Backend::getBackendDescriptor); CrashReportCallables.registerCrashCallable("Flywheel Backend", () -> Backend.getEngine().getProperName());
OptifineHandler.init(); OptifineHandler.init();
Backend.init(); Backend.init();

View file

@ -25,14 +25,6 @@ public class Backend {
private static final Loader loader = new Loader(); private static final Loader loader = new Loader();
/**
* Get a string describing the Flywheel backend. When there are eventually multiple backends
* (Meshlet, MDI, GL31 Draw Instanced are planned), this will name which one is in use.
*/
public static String getBackendDescriptor() {
return engine == null ? "" : engine.getProperName();
}
public static FlwEngine getEngine() { public static FlwEngine getEngine() {
return engine; return engine;
} }

View file

@ -62,12 +62,12 @@ public abstract class AbstractInstancer<D extends InstanceData> implements Insta
return modelData.vertexCount(); return modelData.vertexCount();
} }
public int numInstances() { public int getInstanceCount() {
return data.size(); return data.size();
} }
public int getTotalVertexCount() { public int getVertexCount() {
return getModelVertexCount() * numInstances(); return getModelVertexCount() * getInstanceCount();
} }
protected void removeDeletedInstances() { protected void removeDeletedInstances() {

View file

@ -1,6 +1,9 @@
package com.jozufozu.flywheel.backend.instancing; package com.jozufozu.flywheel.backend.instancing;
import java.util.List;
import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.api.MaterialManager;
public interface Engine extends RenderDispatcher, MaterialManager { public interface Engine extends RenderDispatcher, MaterialManager {
void addDebugInfo(List<String> info);
} }

View file

@ -46,6 +46,15 @@ public abstract class InstanceManager<T> implements InstancingEngine.OriginShift
this.tickableInstances = new Object2ObjectOpenHashMap<>(); this.tickableInstances = new Object2ObjectOpenHashMap<>();
} }
/**
* Get the number of game objects that are currently being instanced.
*
* @return The object count.
*/
public int getObjectCount() {
return instances.size();
}
/** /**
* Is the given object capable of being instanced at all? * Is the given object capable of being instanced at all?
* *

View file

@ -1,5 +1,8 @@
package com.jozufozu.flywheel.backend.instancing; package com.jozufozu.flywheel.backend.instancing;
import java.util.List;
import com.jozufozu.flywheel.Flywheel;
import com.jozufozu.flywheel.api.instance.DynamicInstance; import com.jozufozu.flywheel.api.instance.DynamicInstance;
import com.jozufozu.flywheel.api.instance.TickableInstance; import com.jozufozu.flywheel.api.instance.TickableInstance;
import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.Backend;
@ -74,7 +77,7 @@ public class InstanceWorld {
* Free all acquired resources and invalidate this instance world. * Free all acquired resources and invalidate this instance world.
*/ */
public void delete() { public void delete() {
this.taskEngine.stopWorkers(); taskEngine.stopWorkers();
engine.delete(); engine.delete();
entityInstanceManager.detachLightListeners(); entityInstanceManager.detachLightListeners();
blockEntityInstanceManager.detachLightListeners(); blockEntityInstanceManager.detachLightListeners();
@ -133,4 +136,11 @@ public class InstanceWorld {
world.entitiesForRendering() world.entitiesForRendering()
.forEach(entityInstanceManager::add); .forEach(entityInstanceManager::add);
} }
public void getDebugString(List<String> debug) {
debug.add("");
debug.add("Flywheel: " + Flywheel.VERSION);
debug.add("B: " + blockEntityInstanceManager.getObjectCount() + ", E: " + entityInstanceManager.getObjectCount());
engine.addDebugInfo(debug);
}
} }

View file

@ -1,5 +1,7 @@
package com.jozufozu.flywheel.backend.instancing; package com.jozufozu.flywheel.backend.instancing;
import java.util.List;
import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.event.BeginFrameEvent; import com.jozufozu.flywheel.event.BeginFrameEvent;
import com.jozufozu.flywheel.event.ReloadRenderersEvent; import com.jozufozu.flywheel.event.ReloadRenderersEvent;
@ -113,4 +115,8 @@ public class InstancedRenderDispatcher {
.loadEntities(world); .loadEntities(world);
} }
public static void getDebugString(List<String> debug) {
instanceWorlds.get(Minecraft.getInstance().level)
.getDebugString(debug);
}
} }

View file

@ -20,6 +20,8 @@ public class BatchedMaterialGroup implements MaterialGroup {
protected final RenderType state; protected final RenderType state;
private final Map<Batched<? extends InstanceData>, BatchedMaterial<?>> materials = new HashMap<>(); private final Map<Batched<? extends InstanceData>, BatchedMaterial<?>> materials = new HashMap<>();
private int vertexCount;
private int instanceCount;
public BatchedMaterialGroup(RenderType state) { public BatchedMaterialGroup(RenderType state) {
this.state = state; this.state = state;
@ -37,11 +39,13 @@ public class BatchedMaterialGroup implements MaterialGroup {
public void render(PoseStack stack, BatchDrawingTracker source, TaskEngine pool) { public void render(PoseStack stack, BatchDrawingTracker source, TaskEngine pool) {
int vertexCount = 0; vertexCount = 0;
instanceCount = 0;
for (BatchedMaterial<?> material : materials.values()) { for (BatchedMaterial<?> material : materials.values()) {
for (CPUInstancer<?> instancer : material.models.values()) { for (CPUInstancer<?> instancer : material.models.values()) {
instancer.setup(); instancer.setup();
vertexCount += instancer.getTotalVertexCount(); vertexCount += instancer.getVertexCount();
instanceCount += instancer.getInstanceCount();
} }
} }
@ -65,4 +69,20 @@ public class BatchedMaterialGroup implements MaterialGroup {
public void delete() { public void delete() {
materials.clear(); materials.clear();
} }
/**
* Get the number of instances drawn last frame.
* @return The instance count.
*/
public int getInstanceCount() {
return instanceCount;
}
/**
* Get the number of vertices drawn last frame.
* @return The vertex count.
*/
public int getVertexCount() {
return vertexCount;
}
} }

View file

@ -2,6 +2,7 @@ package com.jozufozu.flywheel.backend.instancing.batching;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import com.jozufozu.flywheel.api.MaterialGroup; import com.jozufozu.flywheel.api.MaterialGroup;
@ -10,6 +11,7 @@ import com.jozufozu.flywheel.backend.instancing.BatchDrawingTracker;
import com.jozufozu.flywheel.backend.instancing.Engine; import com.jozufozu.flywheel.backend.instancing.Engine;
import com.jozufozu.flywheel.backend.instancing.TaskEngine; import com.jozufozu.flywheel.backend.instancing.TaskEngine;
import com.jozufozu.flywheel.event.RenderLayerEvent; import com.jozufozu.flywheel.event.RenderLayerEvent;
import com.jozufozu.flywheel.util.FlwUtil;
import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.platform.Lighting;
import com.mojang.math.Matrix4f; import com.mojang.math.Matrix4f;
@ -28,7 +30,6 @@ public class BatchingEngine implements Engine {
for (RenderLayer value : RenderLayer.values()) { for (RenderLayer value : RenderLayer.values()) {
layers.put(value, new HashMap<>()); layers.put(value, new HashMap<>());
} }
} }
@Override @Override
@ -70,4 +71,18 @@ public class BatchingEngine implements Engine {
} }
@Override
public void addDebugInfo(List<String> info) {
info.add("Batching");
info.add("Instances: " + layers.values()
.stream()
.flatMap(FlwUtil::mapValues)
.mapToInt(BatchedMaterialGroup::getInstanceCount)
.sum());
info.add("Vertices: " + layers.values()
.stream()
.flatMap(FlwUtil::mapValues)
.mapToInt(BatchedMaterialGroup::getVertexCount)
.sum());
}
} }

View file

@ -24,7 +24,7 @@ public class CPUInstancer<D extends InstanceData> extends AbstractInstancer<D> {
} }
void submitTasks(PoseStack stack, TaskEngine pool, DirectVertexConsumer consumer) { void submitTasks(PoseStack stack, TaskEngine pool, DirectVertexConsumer consumer) {
int instances = numInstances(); int instances = getInstanceCount();
while (instances > 0) { while (instances > 0) {
int end = instances; int end = instances;

View file

@ -46,6 +46,14 @@ public class InstancedMaterial<D extends InstanceData> implements Material<D> {
}); });
} }
public int getInstanceCount() {
return models.values().stream().mapToInt(GPUInstancer::getInstanceCount).sum();
}
public int getVertexCount() {
return models.values().stream().mapToInt(GPUInstancer::getVertexCount).sum();
}
public boolean nothingToRender() { public boolean nothingToRender() {
return models.size() > 0 && models.values() return models.size() > 0 && models.values()
.stream() .stream()

View file

@ -34,6 +34,9 @@ public class InstancedMaterialGroup<P extends WorldProgram> implements MaterialG
private final Map<Instanced<? extends InstanceData>, InstancedMaterial<?>> materials = new HashMap<>(); private final Map<Instanced<? extends InstanceData>, InstancedMaterial<?>> materials = new HashMap<>();
private final ModelAllocator allocator; private final ModelAllocator allocator;
private int vertexCount;
private int instanceCount;
public InstancedMaterialGroup(InstancingEngine<P> owner, RenderType type) { public InstancedMaterialGroup(InstancingEngine<P> owner, RenderType type) {
this.owner = owner; this.owner = owner;
this.type = type; this.type = type;
@ -54,6 +57,22 @@ public class InstancedMaterialGroup<P extends WorldProgram> implements MaterialG
} }
} }
/**
* Get the number of instances drawn last frame.
* @return The instance count.
*/
public int getInstanceCount() {
return instanceCount;
}
/**
* Get the number of vertices drawn last frame.
* @return The vertex count.
*/
public int getVertexCount() {
return vertexCount;
}
public void render(Matrix4f viewProjection, double camX, double camY, double camZ, RenderLayer layer) { public void render(Matrix4f viewProjection, double camX, double camY, double camZ, RenderLayer layer) {
type.setupRenderState(); type.setupRenderState();
Textures.bindActiveTextures(); Textures.bindActiveTextures();
@ -75,6 +94,9 @@ public class InstancedMaterialGroup<P extends WorldProgram> implements MaterialG
pool.flush(); pool.flush();
} }
vertexCount = 0;
instanceCount = 0;
for (Map.Entry<Instanced<? extends InstanceData>, InstancedMaterial<?>> entry : materials.entrySet()) { for (Map.Entry<Instanced<? extends InstanceData>, InstancedMaterial<?>> entry : materials.entrySet()) {
InstancedMaterial<?> material = entry.getValue(); InstancedMaterial<?> material = entry.getValue();
if (material.nothingToRender()) continue; if (material.nothingToRender()) continue;
@ -90,6 +112,8 @@ public class InstancedMaterialGroup<P extends WorldProgram> implements MaterialG
for (GPUInstancer<?> instancer : material.getAllInstancers()) { for (GPUInstancer<?> instancer : material.getAllInstancers()) {
instancer.render(); instancer.render();
vertexCount += instancer.getVertexCount();
instanceCount += instancer.getInstanceCount();
} }
} }
} }

View file

@ -2,6 +2,7 @@ package com.jozufozu.flywheel.backend.instancing.instancing;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -14,6 +15,7 @@ import com.jozufozu.flywheel.backend.instancing.TaskEngine;
import com.jozufozu.flywheel.core.compile.ProgramCompiler; import com.jozufozu.flywheel.core.compile.ProgramCompiler;
import com.jozufozu.flywheel.core.shader.WorldProgram; import com.jozufozu.flywheel.core.shader.WorldProgram;
import com.jozufozu.flywheel.event.RenderLayerEvent; import com.jozufozu.flywheel.event.RenderLayerEvent;
import com.jozufozu.flywheel.util.FlwUtil;
import com.jozufozu.flywheel.util.WeakHashSet; import com.jozufozu.flywheel.util.WeakHashSet;
import com.mojang.math.Matrix4f; import com.mojang.math.Matrix4f;
@ -101,8 +103,7 @@ public class InstancingEngine<P extends WorldProgram> implements Engine {
} else { } else {
return layers.values() return layers.values()
.stream() .stream()
.flatMap(it -> it.values() .flatMap(FlwUtil::mapValues);
.stream());
} }
} }
@ -150,6 +151,14 @@ public class InstancingEngine<P extends WorldProgram> implements Engine {
} }
} }
@Override
public void addDebugInfo(List<String> info) {
info.add("GL33 Instanced Arrays");
info.add("Origin: " + originCoordinate.getX() + ", " + originCoordinate.getY() + ", " + originCoordinate.getZ());
info.add("Instances: " + getGroupsToRender(null).mapToInt(InstancedMaterialGroup::getInstanceCount).sum());
info.add("Vertices: " + getGroupsToRender(null).mapToInt(InstancedMaterialGroup::getVertexCount).sum());
}
@FunctionalInterface @FunctionalInterface
public interface OriginShiftListener { public interface OriginShiftListener {
void onOriginShift(); void onOriginShift();

View file

@ -1,8 +1,7 @@
package com.jozufozu.flywheel.event; package com.jozufozu.flywheel.event;
import java.util.ArrayList;
import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher;
import com.jozufozu.flywheel.light.LightUpdater; import com.jozufozu.flywheel.light.LightUpdater;
import com.jozufozu.flywheel.util.WorldAttached; import com.jozufozu.flywheel.util.WorldAttached;
@ -22,16 +21,7 @@ public class ForgeEvents {
if (Minecraft.getInstance().options.renderDebug) { if (Minecraft.getInstance().options.renderDebug) {
ArrayList<String> right = event.getRight(); InstancedRenderDispatcher.getDebugString(event.getLeft());
String text = "Flywheel: " + Backend.getBackendDescriptor();
if (right.size() < 10) {
right.add("");
right.add(text);
} else {
right.add(9, "");
right.add(10, text);
}
} }
} }

View file

@ -2,6 +2,7 @@ package com.jozufozu.flywheel.util;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
import com.jozufozu.flywheel.mixin.BlockEntityRenderDispatcherAccessor; import com.jozufozu.flywheel.mixin.BlockEntityRenderDispatcherAccessor;
@ -68,4 +69,8 @@ public class FlwUtil {
} }
} }
} }
public static <R> Stream<R> mapValues(Map<?, R> map) {
return map.values().stream();
}
} }