首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >E/libEGL:调用没有当前上下文的OpenGL ES (每个线程记录一次)- Android/SDL

E/libEGL:调用没有当前上下文的OpenGL ES (每个线程记录一次)- Android/SDL
EN

Stack Overflow用户
提问于 2017-06-18 00:10:27
回答 1查看 3.5K关注 0票数 1

我知道这个问题的不同版本以前已经回答过,我读过很多。但似乎没有人帮助我解决我的问题。

我正在使用SDL创建一个包含OpenGL ES的上下文。如果我从包含当前上下文的线程中发出OpenGL ES调用,则可以正常呈现。但是,如果我从另一个线程发出一个OpenGL ES调用,我就无法进行任何呈现,并在标题中得到错误消息。

代码语言:javascript
运行
复制
E/libEGL: call to OpenGL ES API with no current context (logged once per thread)

我正在使用SDL源代码包中提供的android项目模板。它使用一个名为SDLActivity的类与android和本机c/c++代码进行通信。

问题是如何创建多个SDL上下文,以便仍然可以从另一个线程进行OpenGL ES调用?

编辑:这里是我在代码中创建SDL上下文的地方:

代码语言:javascript
运行
复制
    int SDL_main(int argc, char **argv)
    {
       window = nullptr;

       if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
          return false;


       SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
       SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);

       SDL_DisplayMode currentDisplayMode;
       int success = SDL_GetCurrentDisplayMode(0, &currentDisplayMode);
       assert(success == 0);
       WIDTH = currentDisplayMode.w;
       HEIGHT = currentDisplayMode.h;

        window = SDL_CreateWindow(Name.c_str(),
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        WIDTH, HEIGHT, SDL_WINDOW_OPENGL);
        assert(window != nullptr);

        SDL_SetHint("SDL_HINT_ORIENTATIONS", "LandscapeRight LandscapeLeft");

        context = SDL_GL_CreateContext(window);
        assert(context != nullptr);

    glGetError();   

    //OpenGL configuration
    glViewport(0, 0, WIDTH, HEIGHT);
    glEnable(GL_CULL_FACE);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    //initialise 

    obj.functionA();

    obj.functionB();    

    SDL_SetEventFilter(FilteringEvents, NULL);



    SDL_Event event;
    shouldQuit = false; 
    while (!shouldQuit)
    {
        SDL_PollEvent(event);

        //Render
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);


        obj.Render();

        SDL_GL_SwapWindow(window);

    }

    SDL_Quit();

    return 0;
}

为了简单起见,我只包括通过SDL创建Opengl的上下文,以及一些简单的obj函数调用,例如要呈现的调用。

如您所见,呈现调用是在SDL创建的OpenGL上下文的线程中进行的。那么,如何使用SDL创建共享上下文,因为当我在这个线程之外进行OpenGL ES调用时,就会得到错误。请注意,当我在我的电脑上运行相同的代码时,我没有这个问题,所以我确信这是Android特有的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-18 02:56:16

传统上,OpenGL ES应用程序只从一个线程呈现到一个表面。 呈现线程是与一个图形上下文相关联的一个CPU线程。默认情况下,每个图形上下文都无法访问另一个上下文的资源(纹理、着色器和顶点缓冲区)。因此,使用共享上下文,以便一个或多个后台加载线程可以访问主线程的资源。

我认为您的问题是EGL呈现上下文不绑定到当前呈现线程。

看看eglCreateContext,了解如何创建共享上下文,以及如何将EGL呈现上下文绑定到当前呈现线程。

在OpenGL ES中使用SDL

这可以通过SDL_GetWMInfo()调用来获得所需的句柄来实现,如:

代码语言:javascript
运行
复制
SDL_SysWMinfo sysWmInfo;
SDL_VERSION(&sysWmInfo.version);
SDL_GetWMInfo(&sysWmInfo);
eglDisplay = eglGetDisplay((EGLNativeDisplayType)sysWmInfo.info.x11.display);
...
eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, (NativeWindowType)sysWmInfo.info.x11.window, NULL);

或,

你试过使用MakeCurrent吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44610576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档