Hi, Pardon me If I'm bothering with nonsense, but I really think there's a leak, mainly because DrawableInfo is never freed (I did not find any code that frees it).
Using valgrind, I see *many* entries like this: ==28403== 1,464 bytes in 61 blocks are still reachable in loss record 15,444 of 16,301 ==28403== at 0x4846828: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) ==28403== by 0x2BF83E5C: Java_com_sun_prism_es2_X11GLDrawable_nCreateDrawable (in /home/tsayao/IdeaProjects/jfx/build/sdk/lib/libprism_es2.so) ==28403== by 0x15E9FB3B: ??? ==28403== by 0x15E9B2D5: ??? ==28403== by 0x15E9B1DF: ??? ==28403== by 0x15E9B379: ??? ==28403== by 0xED02F83: ??? ==28403== by 0xED267B3: ??? ==28403== by 0x15E9B1DF: ??? ==28403== by 0x15E9B6E5: ??? ==28403== by 0x15E9B6E5: ??? ==28403== by 0x15E9B1DF: ??? Valgrind command: valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all --suppressions=java.supp --log-file=valgrind.log java @/home/tsayao/IdeaProjects/jfx/build/run.args TestScenes.java Suppression file (java.supp): { # Suppress Java's native code memory allocations Memcheck:Leak obj:/usr/lib/jvm/jdk-22-oracle-x64/lib/server/libjvm.so fun:malloc fun:calloc fun:realloc fun:free } TestScenes.java: public class TestScenes extends Application { @Override public void start(Stage stage) { // Create a timeline animation to switch between scenes Timeline timeline = new Timeline( new KeyFrame(Duration.millis(100), e -> stage.setScene(createScene("Scene 1", Color.RED))), new KeyFrame(Duration.millis(200), e -> stage.setScene(createScene("Scene 2", Color.BLUE))), new KeyFrame(Duration.millis(300), e -> stage.setScene(createScene("Scene 3", Color.GREEN))) ); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); stage.show(); } private Scene createScene(String text, Color color) { return new Scene(new StackPane(), 400, 300, color); } public static void main(String[] args) { launch(TestScenes.class, args); } } Em qui., 26 de set. de 2024 às 08:14, Thiago Milczarek Sayão < thiago.sa...@gmail.com> escreveu: > Hi, > > I'm investigating the code, and for someone not familiar with it, it's > very complex. > > On com.sun.javafx.tk.quantum.WindowStage it will do this when changing > scene: > > if (oldScene != null) { > ViewPainter painter = ((ViewScene)oldScene).getPainter(); > QuantumRenderer.getInstance().disposePresentable(painter.presentable); > // latched on RT > } > > But not when closing the Sage (possible problem #1). > > When changing scenes, ES2SwapChain dispose will be called: > > public void dispose() { > if (stableBackbuffer != null) { > stableBackbuffer.dispose(); > stableBackbuffer = null; > } > } > > > But it does not dispose the drawable that should clear the native struc > DrawableInfo created, I think (possible problem #2). > > Does it make sense? > > -- Thiago. > > > > Em ter., 24 de set. de 2024 às 14:10, Thiago Milczarek Sayão < > thiago.sa...@gmail.com> escreveu: > >> I might be mistaken, but it seems deleteDrawableInfo is never called. >> >> I think it should be called when the platform View is replaced or when >> the window is closed. >> >> Github search for deleteDrawableInfo >> >> https://github.com/search?q=repo%3Aopenjdk%2Fjfx%20deleteDrawableInfo&type=code >> >> Em ter., 24 de set. de 2024 às 09:07, Thiago Milczarek Sayão < >> thiago.sa...@gmail.com> escreveu: >> >>> Hi, >>> >>> While doing some work on replacing GLX with EGL I discovered a possible >>> leak. >>> >>> Running this test: >>> gradle -PFULL_TEST=true -PUSE_ROBOT=true :systemTests:test --tests >>> SetSceneScalingTest >>> >>> will result in X11GLDrawable -> nCreateDrawable to be called multiple >>> times on the same test, while GLDrawable -> deleteDrawableInfo is never >>> called, generating a leak (I think). >>> >>> I can probably fix this, but I still have little knowledge on the es2 >>> part, so any help would be appreciated. >>> >>> -- Thiago. >>> >>>