LWJGL3共享上下文抛出“GLFW_VERSION_UNAVAILABLE”

时间:2017-07-15 17:08:25

标签: multithreading opengl lwjgl glfw

我尝试多线程化我的应用程序,但是当我尝试从主窗口共享上下文时,程序崩溃了。

[LWJGL]
GLFW_VERSION_UNAVAILABLE
error
Description : WGL: Failed to create OpenGL context
Stacktrace  :   
org.lwjgl.glfw.GLFW.nglfwCreateWindow(GLFW.java:1361)   
org.lwjgl.glfw.GLFW.glfwCreateWindow(GLFW.java:1521)

以下是主窗口的创建代码:

GLFWErrorCallback.createPrint(System.err).set();
if (!glfwInit()) {
    throw new IllegalStateException("Unable to initialize GLFW");
}
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
if(fullscreen){
    window = glfwCreateWindow(vidmode.width(), vidmode.height(), windowTitle, glfwGetPrimaryMonitor(), NULL);
    Var.windowSizeX=vidmode.width();
    Var.windowSizeY=vidmode.height();
}else{
    window = glfwCreateWindow(windowSizeX, windowSizeY, windowTitle, NULL, NULL);
    glfwSetWindowPos(window, (vidmode.width() - windowSizeX) / 2, (vidmode.height() - windowSizeY) / 2);
}

if (window == NULL) {
    throw new RuntimeException("Failed to create the GLFW window");
}

glfwMakeContextCurrent(window);
if (vSync) {
    glfwSwapInterval(1);
} else {
    glfwSwapInterval(0);
}
GL.createCapabilities();

我的第二个帖子中的代码:

GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE);

offsiteWindow = GLFW.glfwCreateWindow(1, 1, "offsite", MemoryUtil.NULL, window);//errors
GLFW.glfwMakeContextCurrent(offsiteWindow);
GL.createCapabilities();

我做错了什么? 版本:稳定的LWJGL 3.1.3快照构建1

2 个答案:

答案 0 :(得分:1)

这里至少有一个问题是你从不同的线程调用glfwCreateWindow,而

  

只能从主线程调用此函数。 [ref]

您必须在基于ConcurrentLinkedQueue的线程之间实现消息传递,或者除了主要线程之外的每个线程只执行窗口创建请求,而主线程必须侦听这些请求并使用此函数进行实际创建调用

答案 1 :(得分:0)

如果Grief的答案不起作用,您还必须确保仅在资源共享glfwCreateWindow和已与此共享共享的窗口中的任何一个当前不能使用window时调用glfwCreateWindow线程。

来自GLFW.glfwMakeContextCurrent(0) javadoc:

  

Windows:共享资源的上下文可能不是任何其他线程上的当前上下文。 [ref]

您可以通过在主线程(或创建主窗口的线程)中调用mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { Log.d(TAG, "Problem setting up In-app Billing: " + result); } } }); 来执行此操作,然后在第二个线程中创建包含共享的窗口。