簡體   English   中英

E / libEGL:調用OpenGL ES API,沒有當前上下文(每個線程記錄一次) - Android / SDL

[英]E/libEGL: call to OpenGL ES API with no current context (logged once per thread) - Android/SDL

我知道此問題的不同版本之前已經得到解答,我已經閱讀了很多這些版本。 然而似乎沒有人幫助我解決我的問題。

我正在使用SDL創建一個上下文來保存OpenGL ES。 如果我從包含當前上下文的線程進行OpenGL ES調用,我可以正常渲染。 但是,如果我從另一個線程進行OpenGL ES調用,我無法進行任何渲染,並且我在標題中收到錯誤消息。

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上下文的地方:

    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 ES的上下文,以及一些簡單的obj函數調用,例如對render的調用。

如您所見,在SDL創建的OpenGL上下文的線程內進行了渲染調用。 那么如何使用SDL創建共享上下文,因為當我在此線程之外進行OpenGL ES調用時,我得到了錯誤。 請注意,當我在PC上運行相同的代碼時,我沒有這個問題,所以我確定它是Android特有的問題。

傳統上,OpenGL ES應用程序僅從一個線程渲染到一個表面。

呈現線程是與一個圖形上下文相關聯的一個CPU線程。 默認情況下,每個圖形上下文都無法訪問另一個上下文的資源(紋理,着色器和頂點緩沖區)。 出於這個原因,使用共享上下文,因此一個或多個后台加載線程可以訪問主線程的資源。

我認為你的問題是EGL渲染上下文沒有綁定到當前的渲染線程。

查看eglCreateContext以了解如何創建共享上下文和eglMakeCurrent以將EGL呈現上下文綁定到當前呈現線程。


將SDL與OpenGL ES結合使用

這可以通過SDL_GetWMInfo()調用來完成,以獲取所需的句柄,如:

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);

要么,

您是否嘗試使用SDL_GL_MakeCurrent

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM