Skip to content

Commit b8ad5ef

Browse files
committed
fix synchronous sort tasks, change important task scheduling to be separate from regular deferred task scheduling
1 parent f76f7b1 commit b8ad5ef

File tree

10 files changed

+191
-134
lines changed

10 files changed

+191
-134
lines changed

common/src/main/java/net/caffeinemc/mods/sodium/client/render/SodiumWorldRenderer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public void setupTerrain(Camera camera,
192192
float fogDistance = RenderSystem.getShaderFog().end();
193193

194194
if (this.lastCameraPos == null) {
195-
this.lastCameraPos = new Vector3d(pos);
195+
this.lastCameraPos = pos;
196196
}
197197
if (this.lastProjectionMatrix == null) {
198198
this.lastProjectionMatrix = new Matrix4f(projectionMatrix);
@@ -218,7 +218,7 @@ public void setupTerrain(Camera camera,
218218
profiler.popPush("translucent_triggering");
219219

220220
this.renderSectionManager.processGFNIMovement(new CameraMovement(this.lastCameraPos, pos));
221-
this.lastCameraPos = new Vector3d(pos);
221+
this.lastCameraPos = pos;
222222
}
223223

224224
int maxChunkUpdates = updateChunksImmediately ? this.renderDistance : 1;
@@ -230,7 +230,7 @@ public void setupTerrain(Camera camera,
230230
profiler.popPush("chunk_update");
231231

232232
this.renderSectionManager.cleanupAndFlip();
233-
this.renderSectionManager.updateChunks(updateChunksImmediately);
233+
this.renderSectionManager.updateChunks(viewport, updateChunksImmediately);
234234

235235
profiler.popPush("chunk_upload");
236236

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/ChunkUpdateType.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package net.caffeinemc.mods.sodium.client.render.chunk;
22

3+
/**
4+
* NOTE: Update types with not-ALWAYS defer mode should be prefixed "important".
5+
*/
36
public enum ChunkUpdateType {
47
SORT(DeferMode.ALWAYS, 2),
58
INITIAL_BUILD(DeferMode.ALWAYS, 0),
@@ -28,7 +31,7 @@ public static ChunkUpdateType getPromotionUpdateType(ChunkUpdateType prev, Chunk
2831
}
2932

3033
public boolean isImportant() {
31-
return this == IMPORTANT_REBUILD || this == IMPORTANT_SORT;
34+
return this.deferMode != DeferMode.ALWAYS;
3235
}
3336

3437
public DeferMode getDeferMode() {

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/RenderSectionManager.java

Lines changed: 152 additions & 91 deletions
Large diffs are not rendered by default.

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/async/FrustumCullTask.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package net.caffeinemc.mods.sodium.client.render.chunk.async;
22

33
import it.unimi.dsi.fastutil.longs.LongArrayList;
4-
import net.caffeinemc.mods.sodium.client.render.chunk.lists.TaskListCollection;
4+
import net.caffeinemc.mods.sodium.client.render.chunk.lists.DeferredTaskList;
55
import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.CullType;
66
import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.OcclusionCuller;
77
import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.RayOcclusionSectionTree;
@@ -46,7 +46,7 @@ public SectionTree getTree() {
4646
}
4747

4848
@Override
49-
public TaskListCollection getFrustumTaskLists() {
49+
public DeferredTaskList getFrustumTaskLists() {
5050
return frustumTaskLists;
5151
}
5252
};
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package net.caffeinemc.mods.sodium.client.render.chunk.async;
22

3-
import net.caffeinemc.mods.sodium.client.render.chunk.lists.TaskListCollection;
3+
import net.caffeinemc.mods.sodium.client.render.chunk.lists.DeferredTaskList;
44

55
public interface FrustumTaskListsResult {
6-
TaskListCollection getFrustumTaskLists();
6+
DeferredTaskList getFrustumTaskLists();
77
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package net.caffeinemc.mods.sodium.client.render.chunk.async;
22

3-
import net.caffeinemc.mods.sodium.client.render.chunk.lists.TaskListCollection;
3+
import net.caffeinemc.mods.sodium.client.render.chunk.lists.DeferredTaskList;
44
import net.caffeinemc.mods.sodium.client.render.chunk.lists.TaskSectionTree;
55

66
public interface GlobalCullResult extends FrustumTaskListsResult {
77
TaskSectionTree getTaskTree();
88

9-
TaskListCollection getGlobalTaskLists();
9+
DeferredTaskList getGlobalTaskLists();
1010
}

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/async/GlobalCullTask.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import it.unimi.dsi.fastutil.longs.LongArrayList;
55
import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection;
66
import net.caffeinemc.mods.sodium.client.render.chunk.lists.FrustumTaskCollector;
7-
import net.caffeinemc.mods.sodium.client.render.chunk.lists.TaskListCollection;
7+
import net.caffeinemc.mods.sodium.client.render.chunk.lists.DeferredTaskList;
88
import net.caffeinemc.mods.sodium.client.render.chunk.lists.TaskSectionTree;
99
import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.CullType;
1010
import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.OcclusionCuller;
@@ -56,12 +56,12 @@ public TaskSectionTree getTaskTree() {
5656
}
5757

5858
@Override
59-
public TaskListCollection getFrustumTaskLists() {
59+
public DeferredTaskList getFrustumTaskLists() {
6060
return frustumTaskLists;
6161
}
6262

6363
@Override
64-
public TaskListCollection getGlobalTaskLists() {
64+
public DeferredTaskList getGlobalTaskLists() {
6565
return globalTaskLists;
6666
}
6767
};
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
package net.caffeinemc.mods.sodium.client.render.chunk.lists;
22

33
import it.unimi.dsi.fastutil.longs.Long2ReferenceMap;
4+
import it.unimi.dsi.fastutil.longs.LongArrayList;
5+
import it.unimi.dsi.fastutil.longs.LongCollection;
46
import it.unimi.dsi.fastutil.longs.LongHeapPriorityQueue;
5-
import net.caffeinemc.mods.sodium.client.render.chunk.DeferMode;
67
import net.caffeinemc.mods.sodium.client.render.chunk.RenderSection;
78
import net.minecraft.core.SectionPos;
89

9-
import java.util.EnumMap;
10-
11-
public class TaskListCollection extends EnumMap<DeferMode, LongHeapPriorityQueue> {
10+
public class DeferredTaskList extends LongHeapPriorityQueue {
1211
private final long creationTime;
1312
private final boolean isFrustumTested;
1413
private final int baseOffsetX;
1514
private final int baseOffsetZ;
1615

17-
public TaskListCollection(Class<DeferMode> keyType, long creationTime, boolean isFrustumTested, int baseOffsetX, int baseOffsetZ) {
18-
super(keyType);
16+
public static DeferredTaskList createHeapCopyOf(LongCollection copyFrom, long creationTime, boolean isFrustumTested, int baseOffsetX, int baseOffsetZ) {
17+
return new DeferredTaskList(new LongArrayList(copyFrom), creationTime, isFrustumTested, baseOffsetX, baseOffsetZ);
18+
}
19+
20+
private DeferredTaskList(LongArrayList copyFrom, long creationTime, boolean isFrustumTested, int baseOffsetX, int baseOffsetZ) {
21+
super(copyFrom.elements(), copyFrom.size());
1922
this.creationTime = creationTime;
2023
this.isFrustumTested = isFrustumTested;
2124
this.baseOffsetX = baseOffsetX;

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/lists/PendingTaskCollector.java

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class PendingTaskCollector implements OcclusionCuller.GraphOcclusionVisit
2222
static final float CLOSE_PROXIMITY_FACTOR = 0.6f; // penalty for being CLOSE_DISTANCE or farther away
2323
static final float INV_MAX_DISTANCE_CLOSE = CLOSE_PROXIMITY_FACTOR / CLOSE_DISTANCE;
2424

25-
private final LongArrayList[] pendingTasks = new LongArrayList[DeferMode.values().length];
25+
private final LongArrayList pendingTasks = new LongArrayList();
2626

2727
protected final boolean isFrustumTested;
2828
protected final int baseOffsetX, baseOffsetY, baseOffsetZ;
@@ -67,7 +67,8 @@ public void visit(RenderSection section) {
6767
protected void checkForTask(RenderSection section) {
6868
ChunkUpdateType type = section.getPendingUpdate();
6969

70-
if (type != null && section.getTaskCancellationToken() == null) {
70+
// collect non-important tasks (important tasks are handled separately)
71+
if (type != null && !type.isImportant() && section.getTaskCancellationToken() == null) {
7172
this.addPendingSection(section, type);
7273
}
7374
}
@@ -82,14 +83,8 @@ protected void addPendingSection(RenderSection section, ChunkUpdateType type) {
8283
var localZ = section.getChunkZ() - this.baseOffsetZ;
8384
long taskCoordinate = (long) (localX & 0b1111111111) << 20 | (long) (localY & 0b1111111111) << 10 | (long) (localZ & 0b1111111111);
8485

85-
var queue = this.pendingTasks[type.getDeferMode().ordinal()];
86-
if (queue == null) {
87-
queue = new LongArrayList();
88-
this.pendingTasks[type.getDeferMode().ordinal()] = queue;
89-
}
90-
9186
// encode the priority and the section position into a single long such that all parts can be later decoded
92-
queue.add((long) MathUtil.floatToComparableInt(priority) << 32 | taskCoordinate);
87+
this.pendingTasks.add((long) MathUtil.floatToComparableInt(priority) << 32 | taskCoordinate);
9388
}
9489

9590
private float getSectionPriority(RenderSection section, ChunkUpdateType type) {
@@ -121,18 +116,8 @@ public static float decodePriority(long encoded) {
121116
return MathUtil.comparableIntToFloat((int) (encoded >>> 32));
122117
}
123118

124-
public TaskListCollection getPendingTaskLists() {
125-
var result = new TaskListCollection(DeferMode.class, this.creationTime, this.isFrustumTested, this.baseOffsetX, this.baseOffsetZ);
126-
127-
for (var mode : DeferMode.values()) {
128-
var list = this.pendingTasks[mode.ordinal()];
129-
if (list != null) {
130-
var queue = new LongHeapPriorityQueue(list.elements(), list.size());
131-
result.put(mode, queue);
132-
}
133-
}
134-
135-
return result;
119+
public DeferredTaskList getPendingTaskLists() {
120+
return DeferredTaskList.createHeapCopyOf(this.pendingTasks, this.creationTime, this.isFrustumTested, this.baseOffsetX, this.baseOffsetZ);
136121
}
137122

138123
}

common/src/main/java/net/caffeinemc/mods/sodium/client/render/chunk/occlusion/SectionTree.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ public int getFrame() {
3838

3939
public boolean isValidFor(Viewport viewport, float searchDistance) {
4040
var cameraPos = viewport.getChunkCoord();
41-
return Math.abs((this.cameraX >> 4) - cameraPos.getX()) <= this.bfsWidth &&
42-
Math.abs((this.cameraY >> 4) - cameraPos.getY()) <= this.bfsWidth &&
43-
Math.abs((this.cameraZ >> 4) - cameraPos.getZ()) <= this.bfsWidth &&
41+
return Math.abs((this.cameraX >> 4) - cameraPos.getX()) <= this.bfsWidth &&
42+
Math.abs((this.cameraY >> 4) - cameraPos.getY()) <= this.bfsWidth &&
43+
Math.abs((this.cameraZ >> 4) - cameraPos.getZ()) <= this.bfsWidth &&
4444
this.buildDistance >= searchDistance;
4545
}
4646

@@ -113,6 +113,11 @@ private boolean isSectionPresent(int x, int y, int z) {
113113
return this.tree.getPresence(x, y, z) == Tree.PRESENT;
114114
}
115115

116+
public boolean isSectionVisible(Viewport viewport, RenderSection section) {
117+
return this.isSectionPresent(section.getChunkX(), section.getChunkY(), section.getChunkZ()) &&
118+
this.isWithinFrustum(viewport, section);
119+
}
120+
116121
public void traverse(VisibleSectionVisitor visitor, Viewport viewport, float distanceLimit) {
117122
this.tree.traverse(visitor, viewport, distanceLimit);
118123
}

0 commit comments

Comments
 (0)