Fix black patches covering the world (#2325)

This commit is contained in:
Jason Mitchell authored and GitHub committed 2026-11-01 12:45:06 -08:00
1 parent 85bde5827f
commit 5da38c9180
2 files changed
+34 -28

No files matched your search

@@ -34,7 +34,8 @@ public final class BatchDrawDefaults {
}
public void apply() {
if (passFramebuffer >= 0 && TesrBatchRenderer.deferredPipeline() == null) {
final boolean pack = TesrBatchRenderer.deferredPipeline() != null;
if (passFramebuffer >= 0 && !pack) {
final int framebuffer = GLSMFramebuffer.getDrawFramebuffer();
if (framebuffer != passFramebuffer) {
callerFramebuffer = framebuffer;
@@ -42,7 +43,7 @@ public final class BatchDrawDefaults {
}
}
final int program = GLSMPrograms.getActiveProgram();
if (program != 0 && !Program.isManagedBind(program) && !DepthColorStorage.isOwnedProgram(program)) {
if (program != 0 && !Program.isManagedBind(program) && !(pack && DepthColorStorage.isOwnedProgram(program))) {
callerProgram = program;
GLSMPrograms.glUseProgram(0);
}
@@ -226,32 +226,8 @@ class TesrLayerStateTest {
GLSMMatrices.setTextureMatrix(0, new Matrix4f());
});
}),
Arguments.of("foreign program and framebuffer", (Supplier<BatchScenario>) () -> {
final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
final int framebuffer = GLSMFramebuffer.glGenFramebuffers();
GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
BatchDrawDefaults.capturePassFramebuffer();
GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
GLSMPrograms.glUseProgram(program);
return new BatchScenario(
() -> {
assertEquals(0, GLSMPrograms.getActiveProgram(), "program during batch draw");
assertEquals(0, GLSMFramebuffer.getDrawFramebuffer(), "framebuffer during batch draw");
assertEquals(0, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver draw framebuffer during batch draw");
},
() -> {
assertEquals(program, GLSMPrograms.getActiveProgram(), "caller program restored");
assertEquals(framebuffer, GLSMFramebuffer.getDrawFramebuffer(), "caller framebuffer restored");
assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "driver caller program restored");
assertEquals(framebuffer, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver caller framebuffer restored");
},
() -> {
GLSMPrograms.glUseProgram(0);
GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
GLSMFramebuffer.glDeleteFramebuffers(framebuffer);
GLSMPrograms.glDeleteProgram(program);
});
}),
Arguments.of("foreign program and framebuffer", (Supplier<BatchScenario>) () -> foreignProgram(false)),
Arguments.of("angelica-owned program and framebuffer", (Supplier<BatchScenario>) () -> foreignProgram(true)),
Arguments.of("filter from before an item renderer's blur window", (Supplier<BatchScenario>) () -> {
final int texture = GLSMTextures.glGenTextures();
GLSMTextures.glActiveTexture(GL13.GL_TEXTURE0);
@@ -281,6 +257,35 @@ class TesrLayerStateTest {
}));
}
private static BatchScenario foreignProgram(boolean owned) {
final int program = GlTestSupport.program(GlTestSupport.TRIVIAL_VS, GlTestSupport.TRIVIAL_FS);
if (owned) DepthColorStorage.registerOwnedProgram(program);
final int framebuffer = GLSMFramebuffer.glGenFramebuffers();
GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
BatchDrawDefaults.capturePassFramebuffer();
GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, framebuffer);
GLSMPrograms.glUseProgram(program);
return new BatchScenario(
() -> {
assertEquals(0, GLSMPrograms.getActiveProgram(), "program during batch draw");
assertEquals(0, GLSMFramebuffer.getDrawFramebuffer(), "framebuffer during batch draw");
assertEquals(0, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver draw framebuffer during batch draw");
},
() -> {
assertEquals(program, GLSMPrograms.getActiveProgram(), "caller program restored");
assertEquals(framebuffer, GLSMFramebuffer.getDrawFramebuffer(), "caller framebuffer restored");
assertEquals(program, GL11.glGetInteger(GL20.GL_CURRENT_PROGRAM), "driver caller program restored");
assertEquals(framebuffer, GL11.glGetInteger(GL30.GL_DRAW_FRAMEBUFFER_BINDING), "driver caller framebuffer restored");
},
() -> {
GLSMPrograms.glUseProgram(0);
DepthColorStorage.unregisterOwnedProgram(program);
GLSMFramebuffer.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
GLSMFramebuffer.glDeleteFramebuffers(framebuffer);
GLSMPrograms.glDeleteProgram(program);
});
}
@ParameterizedTest(name = "{0}")
@MethodSource("batchDrawCases")
void batchDrawDoesNotInheritTheInterruptedRenderersState(String name, Supplier<BatchScenario> setup) {