Почему я получаю GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT, используя версии JAVAFX выше 12.02

#java #javafx #framebuffer #snapcraft

#java #javafx #фреймбуфер #snapcraft

Вопрос:

Я создал приложение UBUNTU snap на базе LINUX, используя BASE20 (т.Е. Ubuntu 20.04) в качестве целевой ОС, и оно находится в дистрибутиве.

Это приложение отлично работает с использованием OpenJDK 11 до 15.0.1 на OpenJFX 11 и 12. Однако, если я перейду на более свежую версию OpenJFX, я получаю следующую ошибку при каждом изменении экрана (смена сцены на сцене) — экран становится пустым, и на терминале отображается следующая ошибка:

 Incomplete attachment. (GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)(FBO - 820)
Error creating framebuffer object with TexID 1).
 

Если я принудительно перезаписываю экран (например, переключаясь на окно терминала или другое приложение, а затем обратно в мое приложение), на экране отображается ожидаемое содержимое.

Похоже, это ошибка в последующих выпусках JAVAFX — однако возможно, что чего-то не хватает в библиотеках UBUNTU 20.04, включенных в оснастку. Я опубликую аналогичный запрос о помощи на сайте Snapcraft, но, возможно, кто-то здесь столкнулся с подобной проблемой и может иметь некоторые указания.

Моя среда разработки — IntelliJ Idea, использующая gradle с OpenJDK 15.

Заранее спасибо

Алан

Редактировать: мне удалось выполнить некоторую трассировку моего собственного кода в исходный код библиотеки Java.

Ошибка возникает после последней строки, выполняемой в этом методе в файловой сцене.java — одна вещь — приложение не вылетает, оно работает с пустым белым экраном, пока что-то не заставит обновить экран, например, открыть другое полноэкранное приложение, а затем снова закрыть его — тогда появится желаемая сцена!

первая строка находится в строке 2578 в Scene.java

 //== 
@Override
       public void mouseEvent(EventType<MouseEvent> type, double x, double y, double screenX, double screenY,
                              MouseButton button, boolean popupTrigger, boolean synthesized,
                              boolean shiftDown, boolean controlDown, boolean altDown, boolean metaDown,
                              boolean primaryDown, boolean middleDown, boolean secondaryDown,
                              boolean backDown, boolean forwardDown)
       {
           MouseEvent mouseEvent = new MouseEvent(type, x, y, screenX, screenY, button,
                   0, // click count will be adjusted by clickGenerator later anyway
                   shiftDown, controlDown, altDown, metaDown,
                   primaryDown, middleDown, secondaryDown, backDown, forwardDown,
                   synthesized, popupTrigger, false, null);
           processMouseEvent(mouseEvent);
       }
       
//===========================================================================
 

Стек до ошибки:

 //====        
mouseEvent:2591, Scene$ScenePeerListener (javafx.scene)
run:409, GlassViewEventHandler$MouseEventNotification (com.sun.javafx.tk.quantum)
run:299, GlassViewEventHandler$MouseEventNotification (com.sun.javafx.tk.quantum)
doPrivileged:-1, AccessController (java.security)
lambda$handleMouseEvent$2:447, GlassViewEventHandler (com.sun.javafx.tk.quantum)
get:-1, 2067987277 (com.sun.javafx.tk.quantum.GlassViewEventHandler$Lambda$812)
runWithoutRenderLock:412, QuantumToolkit (com.sun.javafx.tk.quantum)
handleMouseEvent:446, GlassViewEventHandler (com.sun.javafx.tk.quantum)
handleMouseEvent:556, View (com.sun.glass.ui)
notifyMouse:942, View (com.sun.glass.ui)
_runLoop:-1, GtkApplication (com.sun.glass.ui.gtk)
lambda$runLoop$11:277, GtkApplication (com.sun.glass.ui.gtk)
run:-1, 1159114532 (com.sun.glass.ui.gtk.GtkApplication$Lambda$115)
run:834, Thread (java.lang)

//============================================================================
 

Стек вызовов кода приложения:

 //==
private void setupStage()
    {

        mLastTitle = mPrimaryStage.getTitle();
        mPrimaryStage.setScene(mScene);
        mPrimaryStage.setTitle("PhotoNoteBook"   MyConstants.TMMARK   " Photo Carousel");
        mPrimaryStage.show();
    }
    
//===    
 

The Above Method is called by:

 //==
public PhotoCarousel(ImageContainerCallBack imageContainerCallBack, Stage primaryStage, Scene lastScene, UUID photoNotebookUuid, int imageNumber)
    {
        DEBUG = (MyLogger.getTraceLevel() == MyLogger.TRACELEVELDEBUG);
        MyLogger.Logi(this.getClass(), " - Method: PhotoCarousel",
                "Message: Starting constructor ", "");


        mImageContainerCallback = imageContainerCallBack;
        mPrimaryStage = primaryStage;
        mLastScene = lastScene;
        mPhotoNotebookUuid = photoNotebookUuid;
        mImageNumber = imageNumber;
        mPhotoNotebookDataList = PhotoNotebookDataList.get();

        setUpScene();
        setupStage();
    }
    
//==
 

NOTE setupscene() in the above method is a method that creates the scene, and works fine in JAVAFX 11.0.2 -> 11.0.5
The Above Method is called by:

 //===
   private void openPhotoCarouselButtonClickHandler()
    {
        mOpenPhotoCarouselButton.setStyle("-fx-background-color:MediumSeaGreen");
        if ((mPhotoNotebookUuid != null) amp;amp; (photosToWorkWith()))
        {

            PhotoCarousel photoCarousel = new PhotoCarousel(this,
                    mPrimaryStage, mScene, mPhotoNotebookUuid, 0);

        }
        resetButtonColours();
    }
  
//===  
 

следующий фрагмент кода является частью метода, который создает кнопки и размещает их на панели инструментов. кнопка, описанная во фрагменте, использует лямбда-выражение для установки переменной setOnAction кнопки

Приведенный выше метод вызывается:

 //===
                    .
                    .
                    .
        mOpenPhotoCarouselButton = new Button();
        mOpenPhotoCarouselButton.setOnAction(e -> openPhotoCarouselButtonClickHandler());
        mOpenPhotoCarouselButton.setPrefWidth(buttonWidth);
        mOpenPhotoCarouselButton.setText("Photos");

                .
                .
         
//===
 

мой build.gradle

 plugins {
    id 'org.openjfx.javafxplugin' version '0.0.9'
}

plugins {
    id 'java'
    id 'application'
    id "org.beryx.jlink" version "2.22.0"
}

repositories {
    mavenCentral()
    jcenter()
    google()
}


jlink {
    options=['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'photonotebook'
    }
}

group 'com.dryjointproductions.photonotebook'
version '1.4.2'



allprojects {
    apply plugin: 'idea'
    idea.module.outputDir file("out/production/classes")
}

allprojects {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }


    sourceSets {
        main {
            resources {
                srcDirs  = sourceSets.main.java.srcDirs   sourceSets.main.resources.srcDirs   'resources'
                exclude '**/*.java'
            }
        }
    }

    javafx {
        version = "13.0.2"
        modules = ['javafx.controls', 'javafx.graphics', 'javafx.base','javafx.fxml', 'javafx.swing', 'javafx.web' ]
    }

compileJava  {
            sourceCompatibility = 11
        }

plugins.withType(JavaPlugin).configureEach {
    java {
        modularity.inferModulePath = true
    }
}

application {
    setMainModule ('PhotoNoteBook')
     setMainClassName('com.dryjointproductions.photonotebook.PhotoNoteBook')
}

dependencies {
   // implementation 'com.google.code.gson:gson:2.7'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'org.xerial:sqlite-jdbc:3.28.0'
    implementation group: 'javax.activation', name: 'activation', version: '1.1.1'
    implementation group: 'javax.mail', name: 'mail', version: '1.4.7'
    implementation 'com.drewnoakes:metadata-extractor:2.14.0'
    implementation 'net.coobird:thumbnailator:0.4.12'
}
 

Я попытаюсь отправить отчет об ошибке, если смогу узнать, как это сделать! В то же время, если кто-нибудь сможет найти проблему с моей Java, я был бы благодарен!

Комментарии:

1.Вы можете попробовать установить некоторые системные свойства, чтобы узнать, сможете ли вы получить больше информации: например, prism.debug=true prism.verbose=true Эта ошибка OpenGL появлялась ранее в связи с выделением текстуры. bugs.openjdk.java.net/browse/JDK-8123050 bugs.openjdk.java.net/browse/JDK-8088510 Если у вас есть воспроизводимый тестовый пример, я настоятельно рекомендую отправить отчет об ошибке.

2. Выполняется исправление ошибки: bugs.openjdk.java.net/browse /…

3. swpalmer — поскольку эта ошибка все еще присутствовала в JAVAFX17, я попробовал еще раз, используя -Djavafx.verbose=true -Djavafx.debug=true -Dprism.verbose=true -Dprism.debug=true -Dquantum.verbose=true -Dquantum.debug=true -Dquantum.debug=true -Dquantum.debug=true -Dquantum.pulsedebug=true -Dprism.order=sw, что привело к некоторым интересным ошибкам.

Ответ №1:

Я, наконец, добрался до сути этой ошибки, но только в качестве обходного пути, поэтому для всех, у кого есть эта проблема, это может помочь.

Я запустил приложение со следующими параметрами отладки jvm:

  -Djavafx.verbose=true -Djavafx.debug=true -Dprism.verbose=true -Dprism.debug=true -Dquantum.verbose=true -Dquantum.debug=true -Dquantum.pulsedebug=true -Dprism.order=sw 

 

Именно последний вариант выявил проблему, сбой:

 PC.removeDirtyScene:  scene: 1596154225 @ (-1,-1)
PC.removeDirtyScene:  scene: 1596154225 @ (-1,-1)
PC.removeDirtyScene:  scene: 1596154225 @ (-1,-1)
PC.removeDirtyScene:  scene: 1596154225 @ (-1,-1)
PC.addDirtyScene: 12225757175188 scene: 1596154225 @ (-1,-1)
QT.postPulse@(12225760218463): TAPN
PC.addDirtyScene: 12225781351419 scene: 1596154225 @ (-1,-1)
PC.addDirtyScene: 12225781509215 scene: 1596154225 @ (-1,-1)
PC.addDirtyScene: 12225782656044 scene: 1596154225 @ (-1,-1)
QT.endPulse: 12225782846730
java.lang.IllegalArgumentException: WIDTH must be positive
    at javafx.graphics/com.sun.pisces.AbstractSurface.<init>(Unknown Source)
    at javafx.graphics/com.sun.pisces.JavaSurface.<init>(Unknown Source)
    at javafx.graphics/com.sun.prism.sw.SWRTTexture.<init>(Unknown Source)
    at javafx.graphics/com.sun.prism.sw.SWResourceFactory.createRTTexture(Unknown Source)
    at javafx.graphics/com.sun.prism.sw.SWResourceFactory.createRTTexture(Unknown Source)
    at javafx.graphics/com.sun.javafx.tk.quantum.UploadingPainter.run(Unknown Source)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at javafx.graphics/com.sun.javafx.tk.RenderJob.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
QT.postPulse@(12225783499118): TaPN
PC.addDirtyScene: 12225786804608 scene: 1596154225 @ (-1,-1)
QT.endPulse: 12225786976417

 

Это заставило меня задуматься .. если я установлю ширину и высоту сцены перед вызовом stage.show(), это может исчезнуть, и это произошло.
например

 Stage mPrimaryStage ;

ScreenUtils screenUtils = new ScreenUtils();
        double minX = screenUtils.getMinX();
        double minY = screenUtils.getMinY();
        double height = screenUtils.getScreenHeight();
        double width = screenUtils.getScreenWidth();

        mPrimaryStage.setX(minX);
        mPrimaryStage.setY(minY);

        mPrimaryStage.setWidth(width);
        mPrimaryStage.setHeight(height);
        mPrimaryStage.show();

 

(ScreenUtils — это утилита, которую я создал для получения информации на экране)

Ошибки «Неполное вложение. (GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT) (FBO — 820)» и «Ошибка создания объекта фреймбуфера с TexID 1)»больше не сообщается.

Об этом обходном пути сообщалось в отчетах об ошибках OpenJDK.

Спасибо всем

Алан