Skip to content

Commit 54babbd

Browse files
Improve fast dynamic resolution, probably less crashes
1 parent 25ca05f commit 54babbd

4 files changed

Lines changed: 113 additions & 94 deletions

File tree

src/main/java/io/github/ultimateboomer/resolutioncontrol/ResolutionControlMod.java

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ public static ResolutionControlMod getInstance() {
5454

5555
@Nullable
5656
private Framebuffer clientFramebuffer;
57-
5857
private Set<Framebuffer> scaledFramebuffers;
5958

6059
private Set<Framebuffer> minecraftFramebuffers;
@@ -67,6 +66,9 @@ public static ResolutionControlMod getInstance() {
6766
private long estimatedMemory;
6867

6968
private boolean screenshot = false;
69+
70+
private int lastWidth;
71+
private int lastHeight;
7072

7173
@Override
7274
public void onInitialize() {
@@ -103,7 +105,8 @@ public void onInitialize() {
103105
});
104106

105107
ClientTickEvents.END_CLIENT_TICK.register(client -> {
106-
if (ConfigHandler.instance.getConfig().enableDynamicResolution && client.world != null) {
108+
if (ConfigHandler.instance.getConfig().enableDynamicResolution && client.world != null
109+
&& getWindow().getX() != -32000) {
107110
DynamicResolutionHandler.INSTANCE.tick();
108111
}
109112
});
@@ -217,6 +220,8 @@ private void initMinecraftFramebuffers() {
217220
minecraftFramebuffers = new HashSet<>();
218221
}
219222

223+
// setFramebufferReference();
224+
220225
minecraftFramebuffers.add(client.worldRenderer.getEntityOutlinesFramebuffer());
221226
minecraftFramebuffers.add(client.worldRenderer.getTranslucentFramebuffer());
222227
minecraftFramebuffers.add(client.worldRenderer.getEntityFramebuffer());
@@ -229,6 +234,7 @@ private void initMinecraftFramebuffers() {
229234
public Framebuffer getFramebuffer() {
230235
if (getEnableFastDynamicResolution()) {
231236
if (DynamicResolutionHandler.INSTANCE.isFramebufferMapEmpty()) {
237+
// setFramebufferReference();
232238
DynamicResolutionHandler.INSTANCE.generateFrameBuffers(
233239
getWindow().getFramebufferWidth(), getWindow().getFramebufferHeight(), scaledFramebuffers);
234240
}
@@ -268,7 +274,7 @@ public void setUpscaleAlgorithm(ScalingAlgorithm algorithm) {
268274

269275
Config.getInstance().upscaleAlgorithm = algorithm;
270276

271-
updateFramebufferSize();
277+
onResolutionChanged();
272278

273279
ConfigHandler.instance.saveConfig();
274280
}
@@ -291,7 +297,7 @@ public void setDownscaleAlgorithm(ScalingAlgorithm algorithm) {
291297

292298
Config.getInstance().downscaleAlgorithm = algorithm;
293299

294-
updateFramebufferSize();
300+
onResolutionChanged();
295301

296302
ConfigHandler.instance.saveConfig();
297303
}
@@ -375,9 +381,10 @@ public boolean getEnableFastDynamicResolution() {
375381
}
376382

377383
public void onResolutionChanged() {
378-
if (getWindow() != null && getEnableFastDynamicResolution()) {
384+
if (client.world != null && getEnableFastDynamicResolution()) {
385+
379386
DynamicResolutionHandler.INSTANCE.generateFrameBuffers(
380-
getWindow().getFramebufferWidth(), getWindow().getFramebufferHeight(), scaledFramebuffers);
387+
getWindow().framebufferWidth, getWindow().framebufferHeight, scaledFramebuffers);
381388
}
382389

383390
updateFramebufferSize();
@@ -396,24 +403,6 @@ public void resizeMinecraftFramebuffers() {
396403
initMinecraftFramebuffers();
397404

398405
if (getEnableFastDynamicResolution()) {
399-
client.worldRenderer.entityOutlinesFramebuffer
400-
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
401-
client.worldRenderer.entityOutlinesFramebuffer);
402-
client.worldRenderer.translucentFramebuffer
403-
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
404-
client.worldRenderer.translucentFramebuffer);
405-
client.worldRenderer.entityFramebuffer
406-
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
407-
client.worldRenderer.entityFramebuffer);
408-
client.worldRenderer.particlesFramebuffer
409-
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
410-
client.worldRenderer.particlesFramebuffer);
411-
client.worldRenderer.weatherFramebuffer
412-
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
413-
client.worldRenderer.weatherFramebuffer);
414-
client.worldRenderer.cloudsFramebuffer
415-
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
416-
client.worldRenderer.cloudsFramebuffer);
417406
} else {
418407
minecraftFramebuffers.forEach(this::resize);
419408
}
@@ -441,11 +430,15 @@ public void resize(@Nullable Framebuffer framebuffer) {
441430
);
442431
} else {
443432
if (getEnableFastDynamicResolution()) {
444-
framebuffer.resize(
445-
getWindow().getWidth(),
446-
getWindow().getHeight(),
447-
MinecraftClient.IS_SYSTEM_MAC
448-
);
433+
if (lastWidth != getWindow().framebufferWidth && lastHeight != getWindow().framebufferHeight) {
434+
framebuffer.resize(
435+
Math.max(getWindow().framebufferWidth, 1),
436+
Math.max(getWindow().framebufferHeight, 1),
437+
MinecraftClient.IS_SYSTEM_MAC
438+
);
439+
lastWidth = getWindow().framebufferWidth;
440+
lastHeight = getWindow().framebufferHeight;
441+
}
449442
} else {
450443
framebuffer.resize(
451444
getWindow().getFramebufferWidth(),

src/main/java/io/github/ultimateboomer/resolutioncontrol/mixin/WorldRendererMixin.java

Lines changed: 62 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,79 @@
44
import io.github.ultimateboomer.resolutioncontrol.util.DynamicResolutionHandler;
55
import net.minecraft.client.gl.Framebuffer;
66
import net.minecraft.client.render.WorldRenderer;
7+
import org.jetbrains.annotations.Nullable;
78
import org.spongepowered.asm.mixin.Mixin;
89
import org.spongepowered.asm.mixin.Shadow;
910
import org.spongepowered.asm.mixin.injection.At;
10-
import org.spongepowered.asm.mixin.injection.Inject;
11-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12-
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
11+
import org.spongepowered.asm.mixin.injection.Redirect;
1312

1413
@Mixin(WorldRenderer.class)
1514
public abstract class WorldRendererMixin {
1615
@Shadow
1716
private Framebuffer entityOutlinesFramebuffer;
18-
19-
@Inject(at = @At("RETURN"), method = "loadEntityOutlineShader")
20-
private void onLoadEntityOutlineShader(CallbackInfo ci) {
21-
ResolutionControlMod.getInstance().resizeMinecraftFramebuffers();
22-
}
23-
24-
@Inject(at = @At("RETURN"), method = "onResized")
25-
private void onOnResized(CallbackInfo ci) {
26-
if (entityOutlinesFramebuffer == null) return;
27-
ResolutionControlMod.getInstance().resizeMinecraftFramebuffers();
28-
}
29-
30-
@Inject(at = @At("RETURN"), method = "loadTransparencyShader")
31-
private void onLoadTransparencyShader(CallbackInfo ci) {
32-
ResolutionControlMod.getInstance().resizeMinecraftFramebuffers();
33-
}
3417

35-
@Inject(method = "getEntityOutlinesFramebuffer", at = @At("RETURN"), cancellable = true)
36-
private void onGetEntityOutlineFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
37-
handleGetFramebuffer(ci);
38-
}
39-
40-
@Inject(method = "getTranslucentFramebuffer", at = @At("RETURN"), cancellable = true)
41-
private void onGetTranslucentFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
42-
handleGetFramebuffer(ci);
43-
}
18+
@Shadow @Nullable public Framebuffer cloudsFramebuffer;
4419

45-
@Inject(method = "getEntityFramebuffer", at = @At("RETURN"), cancellable = true)
46-
private void onGetEntityFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
47-
handleGetFramebuffer(ci);
48-
}
20+
// @Inject(at = @At("RETURN"), method = "loadEntityOutlineShader")
21+
// private void onLoadEntityOutlineShader(CallbackInfo ci) {
22+
// ResolutionControlMod.getInstance().resizeMinecraftFramebuffers();
23+
// }
24+
//
25+
// @Inject(at = @At("RETURN"), method = "onResized")
26+
// private void onOnResized(CallbackInfo ci) {
27+
// if (entityOutlinesFramebuffer == null) return;
28+
// ResolutionControlMod.getInstance().resizeMinecraftFramebuffers();
29+
// }
30+
//
31+
// @Inject(at = @At("RETURN"), method = "loadTransparencyShader")
32+
// private void onLoadTransparencyShader(CallbackInfo ci) {
33+
// ResolutionControlMod.getInstance().resizeMinecraftFramebuffers();
34+
// }
35+
//
36+
// @Inject(method = "getEntityOutlinesFramebuffer", at = @At("RETURN"), cancellable = true)
37+
// private void onGetEntityOutlineFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
38+
// handleGetFramebuffer(ci);
39+
// }
40+
//
41+
// @Inject(method = "getTranslucentFramebuffer", at = @At("RETURN"), cancellable = true)
42+
// private void onGetTranslucentFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
43+
// handleGetFramebuffer(ci);
44+
// }
45+
//
46+
// @Inject(method = "getEntityFramebuffer", at = @At("RETURN"), cancellable = true)
47+
// private void onGetEntityFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
48+
// handleGetFramebuffer(ci);
49+
// }
50+
//
51+
// @Inject(method = "getParticlesFramebuffer", at = @At("RETURN"), cancellable = true)
52+
// private void onGetParticlesFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
53+
// handleGetFramebuffer(ci);
54+
// }
55+
//
56+
// @Inject(method = "getWeatherFramebuffer", at = @At("RETURN"), cancellable = true)
57+
// private void onGetWeatherFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
58+
// handleGetFramebuffer(ci);
59+
// }
60+
//
61+
// @Inject(method = "getCloudsFramebuffer", at = @At("RETURN"), cancellable = true)
62+
// private void onGetCloudsFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
63+
// handleGetFramebuffer(ci);
64+
// }
65+
//
66+
// private void handleGetFramebuffer(CallbackInfoReturnable<Framebuffer> fb) {
67+
// if (fb.getReturnValue() != null && ResolutionControlMod.getInstance().getEnableFastDynamicResolution()) {
68+
// fb.setReturnValue(DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(fb.getReturnValue()));
69+
// }
70+
// }
4971

50-
@Inject(method = "getParticlesFramebuffer", at = @At("RETURN"), cancellable = true)
51-
private void onGetParticlesFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
52-
handleGetFramebuffer(ci);
53-
}
54-
55-
@Inject(method = "getWeatherFramebuffer", at = @At("RETURN"), cancellable = true)
56-
private void onGetWeatherFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
57-
handleGetFramebuffer(ci);
58-
}
59-
60-
@Inject(method = "getCloudsFramebuffer", at = @At("RETURN"), cancellable = true)
61-
private void onGetCloudsFramebuffer(CallbackInfoReturnable<Framebuffer> ci) {
62-
handleGetFramebuffer(ci);
63-
}
64-
65-
private void handleGetFramebuffer(CallbackInfoReturnable<Framebuffer> fb) {
66-
if (fb.getReturnValue() != null && ResolutionControlMod.getInstance().getEnableFastDynamicResolution()) {
67-
fb.setReturnValue(DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(fb.getReturnValue()));
72+
@Redirect(method = "render", at = @At(value = "FIELD",
73+
target = "Lnet/minecraft/client/render/WorldRenderer;entityOutlinesFramebuffer:Lnet/minecraft/client/gl/Framebuffer;"))
74+
private Framebuffer onRender1(WorldRenderer renderer) {
75+
if (ResolutionControlMod.getInstance().getEnableFastDynamicResolution()) {
76+
return DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(this.entityOutlinesFramebuffer);
77+
} else {
78+
return this.entityOutlinesFramebuffer;
6879
}
6980
}
81+
7082
}

src/main/java/io/github/ultimateboomer/resolutioncontrol/util/DynamicResolutionHandler.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ public class DynamicResolutionHandler {
2323
private int timer = 0;
2424
private int currentScale;
2525

26+
private int lastWidth;
27+
private int lastHeight;
28+
2629
private DynamicResolutionHandler() {
2730
for (float i = 0.5f; i <= 2.0f; i += 0.125f) {
2831
scales.add(i);
@@ -37,7 +40,7 @@ private DynamicResolutionHandler() {
3740
public void tick() {
3841
timer++;
3942

40-
if (timer > 10) {
43+
if (timer > 20) {
4144
timer = 0;
4245
update();
4346
}
@@ -51,7 +54,7 @@ private void update() {
5154
if (fps > 80) {
5255
setCurrentScale(Math.min(currentScale + 1, scales.size() - 1));
5356
} else if (fps < 60) {
54-
setCurrentScale(Math.max(currentScale - 1, 0));
57+
setCurrentScale(Math.max(currentScale - 2, 0));
5558
}
5659
}
5760

@@ -80,19 +83,28 @@ public Framebuffer getCurrentFramebuffer(Framebuffer key) {
8083
}
8184

8285
public void generateFrameBuffers(int baseWidth, int baseHeight, Collection<Framebuffer> fbs) {
83-
frameBufferMap.forEach((framebuffer, list) -> list.forEach(Framebuffer::delete));
84-
frameBufferMap.clear();
85-
86-
fbs.forEach(framebuffer -> {
87-
List<Framebuffer> framebufferList = new ObjectArrayList<>(scales.size());
88-
for (int i = 0; i < scales.size(); i++) {
89-
float scale = scales.getFloat(i);
90-
framebufferList.add(new Framebuffer(
91-
(int) Math.max(baseWidth * scale, 1), (int) Math.max(baseHeight * scale, 1),
92-
true, true));
93-
}
94-
frameBufferMap.put(framebuffer, framebufferList);
95-
});
86+
if (lastWidth != baseWidth && lastHeight != baseHeight) {
87+
frameBufferMap.forEach((framebuffer, list) -> list.forEach(Framebuffer::delete));
88+
frameBufferMap.clear();
89+
90+
fbs.forEach(framebuffer -> {
91+
System.out.println(framebuffer.textureWidth + " " + framebuffer.textureHeight);
92+
93+
List<Framebuffer> framebufferList = new ObjectArrayList<>(scales.size());
94+
for (int i = 0; i < scales.size(); i++) {
95+
float scale = scales.getFloat(i);
96+
97+
Framebuffer newFb = new Framebuffer(
98+
(int) Math.max(baseWidth * scale, 1), (int) Math.max(baseHeight * scale, 1),
99+
true, false);
100+
framebufferList.add(newFb);
101+
}
102+
frameBufferMap.put(framebuffer, framebufferList);
103+
});
104+
105+
lastWidth = baseWidth;
106+
lastHeight = baseHeight;
107+
}
96108
}
97109

98110
public boolean isFramebufferMapEmpty() {

src/main/resources/resolutioncontrol.accesswidener

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ accessible field net/minecraft/client/render/WorldRenderer particlesFramebuffer
1212
accessible field net/minecraft/client/render/WorldRenderer weatherFramebuffer Lnet/minecraft/client/gl/Framebuffer;
1313
accessible field net/minecraft/client/render/WorldRenderer cloudsFramebuffer Lnet/minecraft/client/gl/Framebuffer;
1414

15+
accessible field net/minecraft/client/util/Window framebufferWidth I
16+
accessible field net/minecraft/client/util/Window framebufferHeight I

0 commit comments

Comments
 (0)