单独输入线程上的OpenGL无效操作错误

时间:2018-11-08 15:41:05

标签: c++ opengl visual-c++ glsl glfw

我在项目的所有组件上都有一个“ checkErrors”方法,因此我可以调用“ checkErrors(“ Context Name”)”,它将告诉我到目前为止发生了什么错误(如果有)。该方法看起来像这样:(print是我自己的方法,只需将其解释为简单的printf即可)

void checkErrors(std::string context="Unknwon Context") {
    GLenum err;
    while ((err = glGetError()) != GL_NO_ERROR)
    {
        print("OpenGL Error:");
        print("\t CONTEXT: " + context);
        if (err == GL_INVALID_ENUM) print("\t TYPE: Invalid Enum");
        else if (err == GL_INVALID_VALUE) print("\t TYPE: Invalid Value");
        else if (err == GL_INVALID_OPERATION) print("\t TYPE: Invalid Operation");
        else if (err == GL_OUT_OF_MEMORY) print("\t TYPE: Out of Memory");
        else if (err == GL_INVALID_FRAMEBUFFER_OPERATION) print("\t TYPE: Invalid Framebuffer Operation");
        else if (err == GL_CONTEXT_LOST) print("\t TYPE: Context Lost");
        else print("\t TYPE: Undefined Error");
    }
}

我正在运行一个单独的线程,该线程从终端/控制台获取输入并更改锁定在互斥锁后面的变量,分别更改程序。函数/方法如下:

void Engine::console() {
    std::string input;
    while (true)
    {
        std::cin >> input;

        settingMutex.lock();

        if (input == "something") doSomething();
        // More possible console command here...
        else print(this, "Unknwon Command");

        checkErrors("Console Command");

        settingMutex.unlock();
    }
}

然后我在启动主渲染循环之前不久在单独的线程上启动此功能:

consoleThread = std::thread(&Engine::console, this);
consoleThread.detach();

//Render loop:
while (!window->shouldClose())
{
    settingMutex.lock();

    //Some stuff here...

    // render
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //Objects are drawn here...

    settingMutex.unlock();

    glfwSwapBuffers(window->getGLFWwindow());
    glfwPollEvents();

    checkErrors("Engine Loop");
}

一切正常。正确绘制了对象,并且渲染环没有输出错误。

如果我在console()函数中注释掉'checkErrors(“ Console Command”)“,那么我的输入命令也将执行应有的作用。

但是,如果我不注释该行,无论我输入什么字符串,从本质上来说,我都会收到来自“控制台命令”上下文的无数“无效操作”错误。

我什至可以从console()函数中删除所有内容,除了checkErrors调用之外,我仍然会收到无穷无尽的无效操作错误流。同时,Render-Loop保持完全无错误。

我感觉到OpenGL上下文不在主线程之外,因此仅在单独的线程上调用glGetError会导致无效的操作错误,但是我无法确认。

有人对这里发生的事情有见识吗?

1 个答案:

答案 0 :(得分:3)

不同的线程不共享在其中一个线程中创建的OpenGL上下文,这意味着,当您将控制台放置在新线程上时,对glGetError()的调用没有基础上下文,并且会产生异常。