LWJGL + XCB Сбой случайно - PullRequest
       85

LWJGL + XCB Сбой случайно

0 голосов
/ 12 февраля 2020

Я разрабатываю 3D-режим для встроенного программного обеспечения с использованием LWJGL - то есть OpenGL-ES. Я должен работать с элементами SWING, а также иметь достаточно хорошую частоту кадров. Поэтому мое решение заключалось в том, чтобы получить поверхность рисования X11 из AWT Canvas, использовать ее для создания контекста и рендеринга непосредственно на него.

Казалось, что он работает нормально. Он работает на моем P C и на самом встроенном устройстве - и я тестировал его в течение многих часов.

Однако на некоторых из моих коллег P C он просто сразу или почти вылетает немедленно. В большинстве случаев ошибка такова:

[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting...

И это правда, что я не использую XInitThreads, потому что ни один из предварительно скомпилированных файлов JNI для LWJGL или AWT не предоставляет этот метод.

То, как я до сих пор работал с потоками, таково:

public void lock() throws AWTException {
        int lock = JAWT_DrawingSurface_Lock(ds, ds.Lock());
        if ((lock & JAWT_LOCK_ERROR) != 0)
            throw new AWTException("JAWT_DrawingSurface_Lock() failed");
    }

    public void unlock() throws AWTException {
        JAWT_DrawingSurface_Unlock(ds, ds.Unlock());
    }

Я в основном вызываю Lock () непосредственно перед тем, как что-то делать с поверхностью, а затем Unlock () после того, как я закончу.

Этого явно было недостаточно, поэтому я получил эти сбои.

Я нашел обходной путь здесь: https://github.com/dunnololda/scage/blob/master/xdll.cpp

Это исправляет это как очарование , Я не мог сделать так, чтобы взломать sh с этим предварительно загруженным .so.

Проблема: теперь мой менеджер проекта в основном обвиняет меня в том, что эта штука работает без помех на моем P C и встроенное устройство - и спрашивает меня, почему. Он отказывается внедрить исправление или позволить мне написать модуль JNI и получить доступ к XInitThreads () - называя это опорой. Потому что, если он работает на моем P C - он должен работать везде, учитывая, что мы все используем один и тот же P C с одинаковым оборудованием и одним и тем же дистрибутивом Debian.

Итак, мой вопрос: ПОЧЕМУ? Почему это работает на моем устройстве и не работает на других? И что я могу сделать, чтобы «исправить» это?

Честно говоря, на мой взгляд, не вызывать функцию, которую система X-Windowing явно просит вас вызвать в многопоточном приложении, - глупое требование. Но, может быть, хотя бы хорошие люди здесь могут объяснить мне, как и почему это работает?

...