This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:离屏呈现问题:0x506 GL_INVALID_frameBuffer_operation

Guru**** 2534260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1033627/tda4vm-off-screen-rendering-problem-0x506-gl_invalid_framebuffer_operation

器件型号:TDA4VM
主题中讨论的其他器件:TDA2

在 TDA4上使用离屏渲染来报告0x506错误 GL_INVALID_frameBuffer_operation。
QNX~、SDK 版本7.3 μ m

在基于 Linux 系统3.7和3.8SDK 的 TDA2上、同样的离屏渲染效果是可以的。 您说支持 TDA4、下面是实施基本代码。
帮助分析它。 如果您需要提供其他补充资料、请指出~

代码如下所示:

//初始化
void SvEglRenderBase:InitFrameBufferOpt()

//创建帧缓冲对象:FBO
glGenFramebuffers (1、&m_nSvTopviewFbo);
glGetIntegerv (GL_framebuffer_binding、&m_nSvDefaultFbo);
glBindFramebuffer (gL_framebuffer、m_nSvTopviewFbo);
int nTestId;
glGetIntegerv (GL_framebuffer_binding、&nTestId);

//创建脱机渲染纹理
格网格纹理(1、&m_nSvTopviewTexture);
glBindTexture (GL_纹 理_2D、m_nSvTopviewTexture);
GlTextImage2D (GL_Texture_2D、0、GL_RGB、SV_2D_LUT_width、SV_2D_LUT_Height、 0、GL_RGB、GL_unsigned_byte、NULL);
//设置纹理参数:内插方法。 最远和最接近的内插方法可以不同地设置。
GlTextParameteri (GL_turete_2D、GL_turete_min_filter、GL_linear);
GlTextParameteri (GL_turete_2D、GL_turete_mag_filter、GL_linear);
//将2D 纹理绑定到默认纹理通常用于破坏以前的纹理绑定关系
//并将 OpenGL 的纹理绑定状态恢复为默认状态。
glBindTexture (GL_Texture_2D、0);
//将外部绑定到 FBO
glFramebufferTexture2D (GL_framebuffer、GL_color_ATTACHMENT0、GL_t纹 理_2D、m_nSvTopviewTexture、0);
glBindFramebuffer (gL_framebuffer、m_nSvDefaultFbo);

//创建帧缓冲对象:FBO
glGenFramebuffers (1、&m_nSvPart3dFbo);
//创建脱机渲染纹理
格网格纹理(1、&m_nSvPart3dTexture);
//如果需要3D 离屏渲染,则此处需要深度缓冲器
glGenRenderbuffers (1、&m_nSvPart3dDepthId);
//Bind FBO:要使用 FBO,它必须首先被绑定。 使其成为当前渲染缓冲区。
glBindFramebuffer (gL_framebuffer、m_nSvPart3dFbo);
//创建脱机渲染纹理:纹理必须在绑定到 FBO 时创建
glBindTexture (GL_纹 理_2D、m_nSvPart3dTexture);
GlTextImage2D (GL_Texture_2D、0、GL_RGB、SV_3D_View_width、SV_3D_View_Height、0、 gL_RGB、gL_unsigned_byte、NULL);
//设置纹理参数:内插方法。 最远和最接近的内插方法可以不同地设置。
GlTextParameteri (GL_turete_2D、GL_turete_min_filter、GL_linear);
GlTextParameteri (GL_turete_2D、GL_turete_mag_filter、GL_linear);
//将2D 纹理绑定到默认纹理通常用于破坏以前的纹理绑定关系
//并将 OpenGL 的纹理绑定状态恢复为默认状态。
glBindTexture (GL_Texture_2D、0);
//将外部绑定到 FBO
glFramebufferTexture2D (GL_framebuffer、GL_color_ATTACHMENT0、GL_t纹 理_2D、m_nSvPart3dTexture、0);


glBindRenderbuffer (GL_RENDERBUFFER、m_nSvPart3dDepthId);
glRenderBufferStorage (GL_RENDERBUFFER、GL_DEPTH COMPONENT16、SV_3D_View_width、SV_3D_View_Height);
glFramebufferRenderbuffer (gL_framebuffer、gL_depte_attachment、gL_RENDERBUFFER、m_nSvPart3dDepthId);
glBindRenderbuffer (GL_RENDERBUFFER、0);
glBindFramebuffer (gL_framebuffer、m_nSvDefaultFbo);

//在 TDA4中键入0
//在 TDA4中键入0
//在 TDA4中键入0
//在 TDA4中键入0
GLenum eErrStatus = glCheckFramebufferStatus (gL_framebuffer);
printf ("[AVM] glCheckFramebufferStatus Complete eErrStatus = 0x%x.\n"、eErrStatus);
if (eErrStatus!= gL_framebuffer_complete)

switch (eErrStatus)

案例 GL_frameBuffer_complete:
printf ("[AVM]帧缓冲完成。\n");
中断;

案例 GL_framebuffer_incomplete_attachment:
printf ("[AVM][ERROR]帧缓冲不完整:附件未完成。\n");
中断;

案例 GL_framebuffer_incomplete_missing_attachment:
printf ("[AVM][ERROR]帧缓冲不完整:没有图像附加到 FBO。\n");
中断;

案例 GL_framebuffer_incomplete_dimensions:
printf ("[AVM][ERROR]帧缓冲不完整:附加的图像具有不同的尺寸。\n");
中断;

案例 GL_framebuffer_unsupported:
printf (FBO 实现不支持"[AVM][ERROR]。\n");
中断;

默认值:
printf ("[AVM][ERROR]未知错误。\n");
中断;

//渲染和绘图
glBindFramebuffer (gL_framebuffer、m_pEGLRenderBase->m_nSvTopviewFbo);
DrawOffline1();
DrawOffline2();
DrawOffline3();
glBindFramebuffer (gL_framebuffer、m_pEGLRenderBase->m_nSvDefaultFbo);
DrawAll();
//在这里报告0x506错误 gl_invalid_framebuffer_operation
GLenum nErrId = glGetError();
如果(nErrId!= GL_NO_ERROR

帮助分析它。 如果您需要提供其他补充资料、请指出~

请~
谢谢~

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    与 TDA2 3.07版本的 SDK 相比、差异如下:
    FBO 在 TDA4之外使用:

    为什么 TDA4在最外渲染中使用 FBO? 在 appEglBindFrameBufferl 中、将初始化离屏渲染并绑定 FBO、然后调用 render_rendFrame 进行渲染、最后调用 appEglSwap

    但 TDA2在这里不使用 FBO、直接调用 render_renderFrame 进行呈现、然后调用 System_eglSwap。

    TDA4中的 appEglBindFrameBuffer 函数如下所示、
    内部使用 FBO。

    void appEglBindFrameBuffer (void *eglWindow、app_EGL_tex_prop_t * prop)

    int32_t texfound;
    int32_t Texindex;
    uint32_t i;
    PFNGLEGLIMAGETTEXURE2DOESPROC glEGLImageTargetTexture2DOES;
    PFNGLCLIPCONTROLEXTPROC glClipControlEXT;
    app_EGL_obj_t * obj =(app_EGL_obj_t*) eglWindow;
    app_EGL_tex_obj_t * tex_obj;

    glEGLImageTargetTexture2DOES =(PFNGLEGLIMAGETRGETTEXURE2DOESPROC) eglGetProcAddress ("glEGLImageTargetTexture2DOES");
    glClipControlEXT =(PFNGLCLIPCONTROLEXTPROC) eglGetProAddress ("glClipControlEXT");

    Texindex =-1;
    texFound = 0;

    for (i = 0;i < app_EGL_MAX_Render;i++)

    TEx_obj =&obj->texrend[i];

    if (tex_obj->isAlloc
    &&&&tex_obj->dmaBufFd =prop->dmaBufFd[0]
    &&&&tex_obj->dmaBufFdOffset =prop->dmaBufFdOffset[0]
    )

    Texindex = i;
    TexFound = 1;
    中断;

    if (!texFound)

    /*查找可用插槽并创建纹理*/
    for (i = 0;i < app_EGL_MAX_Render;i++)

    TEx_obj =&obj->texrend[i];

    if (!tex_obj->isAlloc)

    int32_t status;

    status = appEglWindowSetupRenderTex (obj、prop、i);
    if (status=0)

    Texindex = i;
    TexFound = 1;

    中断;


    if (短信)

    TEx_obj =&obj->texrend[Texindex];

    glActiveTexture (GL_TEXTURE2);
    glBindTexture (GL_纹 理_2D、tex_obj->tex);
    //appEglCheckEglError ("glBindTexture"、EGL_true);

    glEGLImageTargetTexture2DOES (GL_tuture_2D、(GLeglImageOES) tex_obj->img);
    //appEglCheckEglError ("glEGLImageTargetTexture2DOES"、EGL_true);

    glBindFramebuffer (gL_framebuffer、tex_obj->fboId);
    // appEglCheckEglError ("glBindFramebuffer"、EGL_true);

    glFramebufferTexture2D (gL_framebuffer、gL_color_ATTACHMENT0、gL_tuthere_2D、tex_obj->tex、0);

    //appEglCheckEglError ("glFramebufferTexture2D"、EGL_true);

    GLenum fbstatus = glCheckFramebufferStatus (gL_framebuffer);
    if (fbstatus!= gL_framebuffer_complete)
    printf ("EGL:错误:帧缓冲区完成检查失败0x%x\n"、fbstatus);

    /*绑定 FBO:将原点移至左上方*/
    glClipControlEXT (GL_UPPER 左侧_EXT、GL_NEW_TO_ON_EXT);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    以下代码片段适用于 TDA4 Linux。 请尝试一下吗? 如果仍然无法正常工作、您可能需要联系 QNX。

         
            // Store the current frame buffer 
            glGetIntegerv(GL_FRAMEBUFFER_BINDING, &current_fbo);
            glActiveTexture(GL_TEXTURE0 + 15);
            glGenTextures(1, &offscreen_fbo_texture);
            glBindTexture(GL_TEXTURE_2D, offscreen_fbo_texture);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
            glActiveTexture(GL_TEXTURE0);
            glBindTexture(GL_TEXTURE_2D, 0);
    
            /* Depth buffer */
            glGenRenderbuffers(1, &offscreen_fbo_depth);
            glBindRenderbuffer(GL_RENDERBUFFER, offscreen_fbo_depth);
            glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
            glBindRenderbuffer(GL_RENDERBUFFER, 0);
    
            /* Framebuffer to link everything together */
            glGenFramebuffers(1, &offscreen_fbo);
            glBindFramebuffer(GL_FRAMEBUFFER, offscreen_fbo);
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, offscreen_fbo_texture, 0);
            glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, offscreen_fbo_depth);
    
            if ((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE) {
                    fprintf(stderr, "glCheckFramebufferStatus returned error %d", status);
                    return -1;
            }
            
            // Bind back original frame buffer
            glBindFramebuffer(GL_FRAMEBUFFER, current_fbo);
            
            // To draw to offscreen fbo, bind offscreen_fbo
            glBindFramebuffer(GL_FRAMEBUFFER, offscreen_fbo);
            // ....
            // Draw to Offscreen FBO
            // ....
            
            
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    TDA4使用 FBO 进行渲染的原因是显示屏的工作方式。 TDA2情况下的显示屏由 EGL 驱动、因此是 SWaP。

    对于 TDA4、显示屏由 R5驱动。 GPU 重建缓冲区被传递到负责显示缓冲区的显示节点。 这就是我们需要 TDA4上的离屏缓冲器的原因。

    此致

    Hemant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、非常感谢您的及时详细答复。 我理解 TDA4采用 FBO 的原因。

    现在回到问题:
    TDA4中的渲染过程:
    (笑声) (笑声)
    1. texYuv[i]= appEglWindowGetTexYiv (pEglWindowObj、&texProp[i]);
    (笑声) (笑声)
    2. appEglBindFrameBuffer(glSrvParams->eglWindowObj,&rendTexProp);
    此函数中使用了 FBO
    格网格纹理(1、&tex_obj->tex);
    glBindTexture (GL_纹 理_2D、tex_obj->tex);
    GlTextParameteri (GL_turete_2D、GL_turete_min_filter、GL_linear);
    GlTextParameteri (GL_turete_2D、GL_turete_mag_filter、GL_linear);
    glGenFramebuffers (1、&tex_obj->fboId);
    glBindFramebuffer (gL_framebuffer、tex_obj->fboId);
    Gluint rboDepthStencil;
    glGenRenderbuffers (1、&rboDepthStencil);
    glBindRenderBuffer (GL_RENDERBUFFER、rboDepthStencil);
    glRenderbufferStorage (GL_RENDERBUFFER、GL_DEPTH24_STENCIL8_OES、prop->width、prop->height);
    glFramebufferRenderbuffer (gL_framebuffer、gL_depth_附件、gL_RENDERBUFFER、rboDepthStencil);
    glFramebufferRenderbuffer (gL_framebuffer、gL_stence_attachment、gL_RENDERBUFFER、rboDepthStencil);
    glActiveTexture (GL_TEXTURE2);
    glBindTexture (GL_纹 理_2D、tex_obj->tex);
    glEGLImageTargetTexture2DOES (GL_tuture_2D、(GLeglImageOES) tex_obj->img);
    glBindFramebuffer (gL_framebuffer、tex_obj->fboId);
    glFramebufferTexture2D (gL_framebuffer、gL_color_ATTACHMENT0、gL_tuthere_2D、tex_obj->tex、0);

    (笑声) (笑声)
    3. render_renderFrame (&glSrvParams->rend3DSRVObj、glSrvParams->eglWindowObj、texYov);
    以下是在步骤1中绑定的纹理单元 texYuv。
    现在问题出在这里:如果我在 render_rendFrame 中使用新的 FBO (与步骤2中的 appEglBindFrameBuffer 中的 tex_obj->fboId 不同)、
    在这里、它将报告0x506 GL_INVALID_frameBuffer_operation 错误、因此不能绘制任何内容。
    我之所以在这里使用新的 FBO、是因为我希望先绘制一个、然后绘制 B、最后在处理后将其显示为新纹理。

    我的用法与之前描述的一样、我使用的方法有误吗?
    或者是否有其他方法可以实现我想要的目标?

    4. glFinish();
    glBindFramebuffer (gL_framebuffer、0);
    appEglSwap (glSrvParams->eglWindowObj);

    期待您的回复、谢谢您~

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复。
    我将使用您在 render_renderFrame 函数中提到的方法进行实验。
    它与我以前的用法没有太大不同。
    只需再执行 glActiveTexture (GL_TEXTURE0+15)操作一步。
    您在这里似乎与我的相反:
    //绑定回原始帧缓冲区
    glBindFramebuffer (gL_framebuffer、Current_FBO);//此处 Current_FBO 等效于0、即、glBindFramebuffer (gL_framebuffer、0);
    //要绘制出屏外 FBO,请绑定 offscreen_FBO
    glBindFramebuffer (gL_framebuffer、offscreen_FBO);//offscreen_FBO 此处不等于0
    //....
    //绘制到离屏 FBO
    //....
    最后不要使用 glBindFramebuffer (gL_framebuffer、0)、然后绘制 offscreen_FBO_纹 理?

    根据我的想法:
    //要绘制出屏外 FBO,请绑定 offscreen_FBO
    glBindFramebuffer (gL_framebuffer、offscreen_FBO);
    Drawa();
    DrawB();
    DrawC();
    //绑定回原始帧缓冲区
    glBindFramebuffer (gL_framebuffer、0);
    //Draw offscreen_FBO_纹 理
    Draw (offscreen_FBO_turTure);

    如果有进展、我会及时与您沟通。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我今天根据您的方法验证了它,但它仍然不起作用,并且仍报告错误:
    gl:render_rendFrame ()之后 glError (0x506)

    屏幕始终为黑色。

    我觉得问题的关键在于:
    如前所述、对于 TDA4、显示屏由 R5驱动、因此 TDA4使用 FBO 进行外部渲染。
    这样,我们就不能再在 render_renderFram()中创建和使用其他 FBO。

    现在需要解决的问题是:
    TDA4在外部使用 FBO、
    如何在 render_renderFram()中创建和使用其他 FBO?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能参考以下代码:

    VISION_APPS/utils/OpenGL/src/a72/app_gl_EGL_utils_QNX.c 中的 appEglSetupWindowRenderTex  

    这将向您展示如何设置渲染目标。 您可以将此代码用作参考或根据需要进行修改。

    此致

    Hemant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我要做的是:

    • 创建2个帧缓冲区,让我们将它们称为 fb1和 fb2。
    • 正常将布景渲染到 fb2。
    • 使用一个后处理效果将 fb2渲染到 fb1。
    • 使用另一种后处理效果将 fb1呈现为默认帧缓冲区(我们将其称为 fb0)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    这对我来说很有用。 请查看 offscreen.cpp 中的实现示例。 还包括遮盖器和标头。

    e2e.ti.com/.../offscreen.cppe2e.ti.com/.../offscreen.he2e.ti.com/.../offscreen.fshe2e.ti.com/.../offscreen.vsh

    让我们假设 fb0是当前正在使用的那一个。 假设这是默认使用的帧缓冲区。 我们的目标是将其保留为最终进入 R5以供显示的帧缓冲器。

    现在、让我们创建第二个离屏缓冲区并为其呈现环视。 为此、我们将在 render.cpp 中创建和管理帧缓冲区、而不会更改该缓冲区之外的任何内容。

    将 offscreen.h 包含在 render.cpp 中并进行以下更改:

    在 render 初始化函数中、添加以下内容(您可以在 car_init 之后添加):

        if(offscreen_init(&offscreen_fbo, width, height) != 0)
        {
                offscreen_fbo = 0;
                printf("offscreen_init failed. Cannot run in offscreen mode.");
        };

    请定义 offscren_FBO (由 offscreen_init 返回)、并根据屏幕分辨率和要求定义宽度和高度。

    现在、在 render_rendFrame 的开头保存默认 FBO 并使用上面初始化的帧缓冲区。 在函数结束时、切换到默认 fb 并将离屏纹理呈现到最终帧缓冲区

    void render_renderFrame(render_state_t *pObj, void *pEglObj, GLuint *texYuv)
    {
            GLint default_fbo;
    
            glGetIntegerv(GL_FRAMEBUFFER_BINDING, &default_fbo);
    
            // srv_param_offscreen is used to enable and disable offscreen processing
            if((srv_param_offscreen == true) && (offscreen_fbo !=0 ))
            {
                    offscreen_render = true;
                    glBindFramebuffer(GL_FRAMEBUFFER, offscreen_fbo);
            }
            else
            {
                    offscreen_render = false;
            }
            
            /// The rest of the SRV code can stay unmodified.
            // After srv_draw and car_draw for all viewports are done,
            // we can switch back to original fb
            
            // This piece of code below remains unchanged
            glClear(GL_COLOR_BUFFER_BIT);
            {
                for(int i = 0; i < num_viewports; i++)
                {
                    //..... surround view rendering code .....
                    // ...
                    // ...
                }
            }
            
            // Add the below lines to switch to original fb and draw the
            // offscreen texture to final frame buffer
            if(offscreen_render == true)
            {
                    glFinish();
                    glBindFramebuffer(GL_FRAMEBUFFER, default_fbo);
                    glViewport(0, 0, width, height);
                    offscreen_draw(width, height);
            }
            
            //... frame count/fps code stays as is
    }
    
    

    您可以修改离屏遮盖器和代码以包括任何后处理。 此示例仅添加一个额外的帧缓冲区。 一旦您使其正常工作、您可以根据需要使用第二个。

    此代码适用于 Linux。 如果您在 QNX 上遇到任何问题、请咨询 QNX。 希望这对您有所帮助。

    此致

    Hemant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的回复。
    这种方法确实有效。 但引入了一个新问题:闪屏、屏幕不断闪烁

    如果您删除此项、则显示将正常、并且不会闪烁。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这听起来像是纹理可能无法呈现到。 为了进行实验、您是否可以将 glFinish 更改为 glReadPixels、看看闪烁是否消失?

    此致

    Hemant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复、我觉得黎明即将到来、现在只剩下闪屏问题了

    首先、渲染成功、但总启动屏幕;

    在 render_renderFrame 内注释了 glFinish 函数(由 render_renderFrame 外的 glFinish 保留)、屏幕仍然闪烁。

    在 render_renderFrame 外的 appEglSwap 和 appPerfStatsHwaUpdateLoad 函数之后、调用 glReadPixels 函数、该函数不会生效、保存的图像全部为黑色。 (保存的屏幕在没有闪烁时也是黑屏)。

    此外、顺便说一下、为什么必须使用 TDA4 GPU 渲染:
    屏幕-c /usr/lib/graphics/jacinto7/graphics.conf.dss_on_r5

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     在上面的示例中、您需要在 glBindFramebuffer (gL_framebuffer、default_FBO)之前尝试 glReadPixels。

    我还建议联系 QNX、了解这种闪烁和屏幕命令。

    此致

    Hemant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    验证后:将 glFinish 更改为 glReadPixels、闪烁现象仍然存在。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在其他地方看到此类说明:
    OpenGL ES 双缓冲绘图会导致启动屏幕。 实际上、双缓冲用于解决闪屏问题。 但是、有一种情况会使双缓冲绘图导致启动屏幕问题:在一个过程中(由于某些限制、只能应用一个屏幕表面)、需要同时显示两个不同的位置。
    这种情况将导致以下问题(A 和 B 表示需要在不同位置显示的缓冲区。 A0表示缓冲器的第0个帧)
    时间\屏幕                   On (上屏缓冲区)            关闭(屏幕外缓冲器)
    T1                               A0 B0                        A1 B0
    T2 (上屏幕切换)              A1 B0                        A0 B0
    T3                               A1 B0                        A0 B1
    T4 (上屏幕交换)              A0 B1                        A1 B0
    从 T3到 T4、这段时间将导致屏幕闪烁。 由于双缓冲用于在屏幕上交换、因此交换打开和关闭的数据(实际上、指针指向的内容已更改)。 因此、当 T4在屏幕上、A 位置时、相应的离屏缓冲区为 OLD。

    解决方案
    这提供了一种解决方案:交换后、更新离屏(关闭)缓冲区。 详情如下:
    时间\屏幕                        打开                          关闭
    T1                              A0 B0                       A1 B0
    T2 (上屏幕)                  A1 B0                       A0 B0
    T2 (更新)                       A1 B0                       A1 B0
    T3                              A1 B0                       A1 B1
    T4 (上屏幕)                  A1 B1                       A1 B0
    T4 (更新)                       A1 B1                       A1 B1
    -如上所示,每次交换后,更新离屏数据。 这样,当您再次进入屏幕时,屏幕不会出现闪屏。


    在您提供的示例中、如何更新离屏数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    验证后:将 glFinish 更改为 glReadPixels、闪烁现象仍然存在。

    但 GlReadPixels 保存的图像是正常的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我找到了该函数、

    是否可以使用该解决方案?

    GLenum glClientWaitSync( GLSYNC 同步,
    GLbitfield 标志、
    GLUint64超时);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    可能-您可能需要创建同步对象来同步渲染-我们在这种情况下没有尝试过、但值得尝试。 GlFinish 应该已同步。 它的效率不是很高、正如您所提到的、理想情况下、您希望具有同步的双缓冲。

    您是否有机会向 QNX 询问此问题?

    此致

    Hemant

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢~
    但这实际上与操作系统无关。 我们还测试了 Linux 系统、将会出现这样的闪屏问题。
    它与 TDA4有关、因为我们在 TDA2上可以。

    我觉得这个问题的关键在于:如何同步双缓冲?
    也许我在这方面没有足够的知识,您能提供一些演示参考吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    让我们在这里继续讨论:

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1039081/tda4vm-create-2-framebuffers-but-introduced-a-new-problem-splash-screen-the-screen-keeps-flickering

    我们可以关闭这个吗?