Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8352209

NPE com.sun.prism.d3d.D3DTextureData.getContext

XMLWordPrintable

    • generic
    • generic

      ADDITIONAL SYSTEM INFORMATION :
      Windows 11, temurin 21.0.6

      A DESCRIPTION OF THE PROBLEM :
      Application crashes (with -Dprism.maxvram=300M and -Dprism.pooldebug=true)

      see provided code

      While `Canvas` object is recreated every time it is toggled on it consumes much more VRAM, than if it's created on object creation.
      And it appears it doesn't break under this condition.

      It doesn't break also when we create canvas on button "click", but we comment out `gc.clip()` and it consumes much VRAM, but it's freed correctly.
      If we doesn't comment out `gc.clip()` it breaks, it consumes much VRAM and doesn't free it correctly.
      Need 25 985 024 (hoping for 25 985 024) from pool: D3D Vram Pool
      D3D Vram Pool: 304 090 128 used (96,7%), 307 175 640 target (97,6%), 314 572 800 max
      20 total resources being managed
      average resource age is 1,1 frames
      0 resources at maximum supported age (0,0%)
      13 resources marked permanent (65,0%)
      0 resources have had mismatched locks (0,0%)
      3 resources locked (15,0%)
      14 resources contain interesting data (70,0%)
      0 resources disappeared (0,0%)
      Pruning obsolete in pool: D3D Vram Pool
      Pruning unuseful older than 1024 in pool: D3D Vram Pool
      Pruning unuseful older than 512 in pool: D3D Vram Pool
      Pruning unuseful older than 10 in pool: D3D Vram Pool
      Pruning all older than 1024 in pool: D3D Vram Pool
      Pruning all older than 512 in pool: D3D Vram Pool
      Pruning all older than 100 in pool: D3D Vram Pool
      Pruning everything in pool: D3D Vram Pool
      unlinking: null (size=25 592 688)
      unlinking: null (size=20 003 760)
      pruning: com.sun.prism.d3d.D3DTextureResource@3adeabfa (size=20 160 512) (age=6)
      unlinking: null (size=20 003 760)
      unlinking: null (size=20 003 760)
      unlinking: null (size=20 003 760)
      unlinking: null (size=10 329 600)
      unlinking: null (size=12 202 992)
      pruning: com.sun.prism.d3d.D3DTextureResource@3a8cdb81 (size=7 002 248) (age=0)
      unlinking: null (size=23 791 040)
      unlinking: null (size=22 529 024)
      cleaned up 201 623 144 from pool: D3D Vram Pool
      D3D Vram Pool: 102 466 984 used (32,6%), 307 175 640 target (97,6%), 314 572 800 max
      9 total resources being managed
      average resource age is 0,0 frames
      0 resources at maximum supported age (0,0%)
      6 resources marked permanent (66,7%)
      0 resources have had mismatched locks (0,0%)
      3 resources locked (33,3%)
      7 resources contain interesting data (77,8%)
      0 resources disappeared (0,0%)

      java.lang.NullPointerException: Cannot invoke "com.sun.prism.d3d.D3DTextureData.getContext()" because the return value of "com.sun.prism.d3d.D3DTextureResource.getResource()" is null
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DTexture.getContext(D3DTexture.java:85)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DTexture.update(D3DTexture.java:210)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DTexture.update(D3DTexture.java:154)
      at javafx.graphics@23.0.2/com.sun.prism.impl.BaseContext.flushMask(BaseContext.java:115)
      at javafx.graphics@23.0.2/com.sun.prism.impl.BaseContext.drawQuads(BaseContext.java:124)
      at javafx.graphics@23.0.2/com.sun.prism.impl.VertexBuffer.flush(VertexBuffer.java:98)
      at javafx.graphics@23.0.2/com.sun.prism.impl.BaseContext.flushVertexBuffer(BaseContext.java:107)
      at javafx.graphics@23.0.2/com.sun.prism.impl.ps.BaseShaderContext.setRenderTarget(BaseShaderContext.java:789)
      at javafx.graphics@23.0.2/com.sun.prism.impl.BaseContext.setRenderTarget(BaseContext.java:149)
      at javafx.graphics@23.0.2/com.sun.prism.impl.BaseGraphics.<init>(BaseGraphics.java:107)
      at javafx.graphics@23.0.2/com.sun.prism.impl.ps.BaseShaderGraphics.<init>(BaseShaderGraphics.java:86)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DGraphics.<init>(D3DGraphics.java:40)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DGraphics.create(D3DGraphics.java:63)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DRTTexture.createGraphics(D3DRTTexture.java:80)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DResourceFactory.createRTTexture(D3DResourceFactory.java:362)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DResourceFactory.createRTTexture(D3DResourceFactory.java:303)
      at javafx.graphics@23.0.2/com.sun.prism.d3d.D3DResourceFactory.createRTTexture(D3DResourceFactory.java:63)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.prism.ps.PPSDrawable.create(PPSDrawable.java:59)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.prism.ps.PPSRenderer.createCompatibleImage(PPSRenderer.java:218)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.prism.ps.PPSRenderer.createCompatibleImage(PPSRenderer.java:67)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.ImagePool.checkOut(ImagePool.java:184)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.Renderer.getCompatibleImage(Renderer.java:124)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.prism.ps.PPSRenderer.getCompatibleImage(PPSRenderer.java:226)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.prism.ps.PPSTwoSamplerPeer.filterImpl(PPSTwoSamplerPeer.java:62)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.impl.prism.ps.PPSEffectPeer.filter(PPSEffectPeer.java:54)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.CoreEffect.filterImageDatas(CoreEffect.java:106)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.Blend.filterImageDatas(Blend.java:37)
      at javafx.graphics@23.0.2/com.sun.scenario.effect.FilterEffect.filter(FilterEffect.java:195)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGCanvas.applyEffectOnAintoC(NGCanvas.java:741)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGCanvas.blendAthruBintoC(NGCanvas.java:771)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGCanvas.renderClip(NGCanvas.java:727)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGCanvas.initClip(NGCanvas.java:714)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGCanvas.renderStream(NGCanvas.java:1062)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGCanvas.renderContent(NGCanvas.java:610)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2063)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1955)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:266)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2063)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1955)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGGroup.renderContent(NGGroup.java:266)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGRegion.renderContent(NGRegion.java:579)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGNode.doRender(NGNode.java:2063)
      at javafx.graphics@23.0.2/com.sun.javafx.sg.prism.NGNode.render(NGNode.java:1955)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.ViewPainter.doPaint(ViewPainter.java:481)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(ViewPainter.java:329)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.PresentingPainter.run(PresentingPainter.java:92)
      at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
      at java.base/java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:358)
      at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
      at --- Async.Stack.Trace --- (captured by IntelliJ IDEA debugger)
      at java.base/java.util.concurrent.FutureTask.<init>(FutureTask.java:151)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.RenderJob.<init>(RenderJob.java:45)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.PaintRenderJob.<init>(PaintRenderJob.java:36)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.ViewScene.setStage(ViewScene.java:85)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.GlassStage.setScene(GlassStage.java:93)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.WindowStage.setScene(WindowStage.java:266)
      at javafx.graphics@23.0.2/javafx.stage.Window$12.invalidated(Window.java:1176)
      at javafx.base@23.0.2/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:110)
      at javafx.base@23.0.2/javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
      at javafx.graphics@23.0.2/javafx.stage.Window.setShowing(Window.java:1253)
      at javafx.graphics@23.0.2/javafx.stage.Window.show(Window.java:1268)
      at javafx.graphics@23.0.2/javafx.stage.Stage.show(Stage.java:277)
      at pl.com.pixel.ims.javafxcanvasbug/pl.com.pixel.ims.javafxcanvasbug.CanvasAutoApplication.start(CanvasAutoApplication.java:64)
      at javafx.graphics@23.0.2/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
      at javafx.graphics@23.0.2/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
      at javafx.graphics@23.0.2/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
      at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
      at javafx.graphics@23.0.2/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
      at javafx.graphics@23.0.2/com.sun.glass.ui.InvokeLaterDispatcher$Future.run$$$capture(InvokeLaterDispatcher.java:95)
      at javafx.graphics@23.0.2/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java)
      at --- Async.Stack.Trace --- (captured by IntelliJ IDEA debugger)
      at javafx.graphics@23.0.2/com.sun.glass.ui.InvokeLaterDispatcher.invokeLater(InvokeLaterDispatcher.java)
      at javafx.graphics@23.0.2/com.sun.glass.ui.win.WinApplication._invokeLater(WinApplication.java:337)
      at javafx.graphics@23.0.2/com.sun.glass.ui.Application.invokeLater(Application.java:483)
      at javafx.graphics@23.0.2/com.sun.javafx.tk.quantum.QuantumToolkit.defer(QuantumToolkit.java:832)
      at javafx.graphics@23.0.2/com.sun.javafx.application.PlatformImpl.runLater(PlatformImpl.java:452)
      at javafx.graphics@23.0.2/com.sun.javafx.application.PlatformImpl.runAndWait(PlatformImpl.java:481)
      at javafx.graphics@23.0.2/com.sun.javafx.application.PlatformImpl.runAndWait(PlatformImpl.java:468)
      at javafx.graphics@23.0.2/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:832)
      at javafx.graphics@23.0.2/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
      at java.base/java.lang.Thread.run(Thread.java:1583)

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      fire up the apps on a larger-than-laptop display and wait up to 2/5 minutes

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Application doesn't crash.
      ACTUAL -
      Application crashes with logs provided in description.

      ---------- BEGIN SOURCE ----------
      import java.util.ArrayList;
      import java.util.List;
      import java.util.Random;
      import java.util.concurrent.ExecutorService;
      import java.util.concurrent.Executors;
      import java.util.concurrent.atomic.AtomicBoolean;

      import javafx.application.Application;
      import javafx.application.Platform;
      import javafx.scene.Scene;
      import javafx.scene.canvas.Canvas;
      import javafx.scene.canvas.GraphicsContext;
      import javafx.scene.control.Button;
      import javafx.scene.control.Label;
      import javafx.scene.layout.HBox;
      import javafx.scene.layout.Pane;
      import javafx.scene.layout.VBox;
      import javafx.scene.paint.Color;
      import javafx.stage.Stage;

      public class CanvasAutoApplication extends Application {

          private Canvas canvas;
      // private final Canvas canvas = new Canvas();
          private GraphicsContext gc;
          private final AtomicBoolean canvasAdded = new AtomicBoolean(true);
          private Pane canvasPane;
          private static final int INITIAL_WIDTH = 1700;
          private static final int INITIAL_HEIGHT = 1000;
          private static final int MIN_WIDTH = 800;
          private static final int MIN_HEIGHT = 600;
          private static final int MAX_WIDTH = 1920;
          private static final int MAX_HEIGHT = 1080;

          static ExecutorService taskScheduler = Executors.newSingleThreadExecutor();
          static ExecutorService resizeScheduler = Executors.newSingleThreadExecutor();

          private final AtomicBoolean stop = new AtomicBoolean(false);
          private HBox root;
          private Button button;
          private Stage primaryStage;

          @Override
          public void start(Stage primaryStage) {
              this.primaryStage = primaryStage;
              root = new HBox();
              canvasPane = new VBox();
              Scene scene = new Scene(root, INITIAL_WIDTH, INITIAL_HEIGHT);
              primaryStage.setScene(scene);

              button = new Button("Toggle Canvas");

              root.getChildren().add(button);
              root.getChildren().add(canvasPane);

              button.setOnAction(e -> {
                  toggleCanvas();
              });

              startTaskLoop();

              primaryStage.show();
          }

          private void startTaskLoop() {
              taskScheduler.submit(() -> {
                  while (!stop.get()) {
                      Platform.runLater(() -> {
                          button.fire();

                      });
                      try {
                          Thread.sleep(300);
                      } catch (InterruptedException e) {
                          Thread.currentThread().interrupt();
                      }
                  }
                  taskScheduler.shutdown();
              });
              resizeScheduler.submit(() -> {
                  while (!stop.get()) {
                      Platform.runLater(() -> {
                          resizeWindowRandomly();
                      });
                      try {
                          Thread.sleep(1000); // Change size every second
                      } catch (InterruptedException e) {
                          Thread.currentThread().interrupt();
                      }
                  }
                  resizeScheduler.shutdown();
              });
          }

          private void resizeWindowRandomly() {
              Random random = new Random();
              int newWidth = random.nextInt(MAX_WIDTH - MIN_WIDTH + 1) + MIN_WIDTH;
              int newHeight = random.nextInt(MAX_HEIGHT - MIN_HEIGHT + 1) + MIN_HEIGHT;

              primaryStage.setWidth(newWidth);
              primaryStage.setHeight(newHeight);
          }

          private void toggleCanvas() {
              if (canvasAdded.get()) {
                  root.getChildren().remove(canvasPane);
                  canvasPane = new VBox();
      //todo comment this line while uncommenting 26
                  canvas = new Canvas(primaryStage.getWidth(), primaryStage.getHeight());
                  canvas.heightProperty().bind(primaryStage.heightProperty());
                  canvas.widthProperty().bind(primaryStage.widthProperty());
                  canvasAdded.set(false);
              } else {
                  root.getChildren().add(canvasPane);
                  canvasPane.getChildren().add(new Label(String.valueOf(new Random().nextInt(Integer.MAX_VALUE))));
                  canvasPane.getChildren().add(canvas);
                  refreshCanvas();
                  drawLines();
                  canvasAdded.set(true);
              }
          }

          private void refreshCanvas() {
              gc = canvas.getGraphicsContext2D();
              gc.setFill(Color.BLACK);
              gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
          }

          private void drawLines() {
              gc = canvas.getGraphicsContext2D();
              gc.setStroke(Color.RED);
              gc.setLineWidth(2.2);
              gc.beginPath();
              gc.save();
              Random random = new Random();
              List<Path> paths = new ArrayList<>();
              for (int i = 0; i < 10; i++) {
                  float[] xs = new float[10];
                  float[] ys = new float[10];
                  for (int j = 0; j < 10; j++) {
                      xs[j] = random.nextFloat() * (float)canvas.getWidth();
                      ys[j] = random.nextFloat() * (float)canvas.getHeight();
                  }
                  Path path = new Path(xs, ys);
                  paths.add(path);
              }
              for (Path path : paths) {
                  final int pathLen = path.xs.length;
                  if (pathLen == 0) {
                      return;
                  }
                  gc.moveTo(path.xs[0], path.ys[0]);
                  for (int i = 1; i < pathLen; i++) {
                      gc.lineTo(path.xs[i], path.ys[i]);
                  }
                  gc.closePath();
              }
              gc.fill();
              //todo comment this causes no crash
              gc.clip();
              gc.stroke();
              gc.restore();
          }

          @Override
          public void stop() throws Exception {
              super.stop();
              stop.set(true);
              taskScheduler.shutdown();
              resizeScheduler.shutdown();
              System.exit(0);
          }

          public static void main(String[] args) {
              launch(args);
          }
      }
      ---------- END SOURCE ----------

        1. Path.java
          0.2 kB
        2. Test.java
          6 kB

            lkostyra Lukasz Kostyra
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: