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.

[参考译文] Linux/DRA724:使用 drmModeSetPlane 在 GLSDK7.04上以全 fps 显示"获取分裂"

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/617806/linux-dra724-use-drmmodesetplane-to-display-with-full-fps-get-tearing-on-glsdk7-04

器件型号:DRA725

工具/软件:Linux v3.14

各位专家、您好!

  当我使用 drmModeSetPlane 进行显示,而用于显示的视频为25fps 时,LCD 刷新 率为30fps 时会发生分裂,但我将 LCD 刷新率设置为60fps 时, 显示效果会很好。 我的项目是使用 GLSDK 7.04。

  我在该论坛上找到以下信息。

http://e2e.ti.com/support/arm/sitara_arm/f/791/p/482571/1744735

“在 v3.14内核中,您可以调用 drmModeSetPlany(),有时可以实现全 fps,但它主要是靠运气工作的。 通常将 drmModeSetPlane()与其他模式设置一起使用会导致减半 fps 或分裂,因为应用程序不知道 drmModeSetPlane()何时完成。

"

  这是否意味着我无法在  glsdk 上再使用 drmModeSetPlane?  

  根据我的理解, drmModePageFlip() 仅适用于 gfx(平面)和 CRTC,不适用于视频平面和多平面。

  如果我想使用多层显示在 glsdk 上、是否仍有实现 这一点的方法?

  请提供任何指导。
  此致
  SID
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sid、

    我已将您的问题转发给图形专家。

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

    如以下主题中所述、您应该使用 drmModePageFlip 来翻转缓冲区以显示并等待 vsync:
    e2e.ti.com/.../611021

    要更新多个平面、应使用原子模式设置。 这在 K4.4上作为 Processor SDK Linux Automotive v3.x 的一部分受支持。 您可以移至最新版本 v3.02以使用原子模式设置:
    processors.wiki.ti.com/.../Category:Processor_SDK_Linux_Automotive

    此致、
    Anand
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Anand、您好!
    感谢您的回答。
    这是另一个使用 GLSDK7.04的项目,它将在这个入口进行 SOP 操作、没有太多时间迁移到 PSDK 3.02。
    但是我们使用 drmModeSetPlane,当 LCD 刷新率为30fps,而用于显示的视频为25fps 时,就会发生分裂。
    我在双摄像机演示中看到了一些有关 glsdk 的示例,它使用 drmModeSetPlane,如下所示:
    "
    /*延迟将缓冲区队列返回到捕获驱动程序以进行两个显示缓冲区时序*/
    /*这是因为 drmSetModePlany() API 是异步的,并且在*/时不会确认
    /*缓冲区已完成显示。 假设两个捕获帧延迟应*/
    /*足够确保通过显示使用缓冲区,并确保安全排队*/
    /*以捕获驱动程序池 *
    if (v4l2_device->b[0]!= NULL){
    v4l2_queue_buffer (v4l2_device、v4l2_device->b[0]);


    /*从可复制到帧缓冲区的驱动程序请求捕获缓冲区*/
    buf = v4l2_dequeue_buffer (v4l2_device);

    v4l2_device->b[NBUF-1]= buf;
    I = 0;
    执行{
    v4l2_device->b[i]= v4l2_device->b[i+1];
    i++;
    }while (i!=(NBUF-1));


    if (pip){
    RET = drmModeSetPlane (DRM_DEVICE->FD、DRM_DEVICE->Plane_id[pip]、
    DRM_DEVICE_>CRTC_id、buf->fb_id、0、
    /* dst_x、dst_y、dst_w、dst_h *
    25、25、DRM_DEVICE_>width/3、DRM_DEVICE_>height/3、
    /* src_x、src_y、src_w、src_h*/
    0、0、v4l2_device->width << 16、v4l2_device->height << 16);
    }否则{
    RET = drmModeSetPlane (DRM_DEVICE->FD、DRM_DEVICE->Plane_id[pip]、
    DRM_DEVICE_>CRTC_id、buf->fb_id、0、
    /*全屏制作视频:*/
    /* dst_x、dst_y、dst_w、dst_h *
    0、0、DRM_DEVICE_>width、DRM_DEVICE_>height、
    /* src_x、src_y、src_w、src_h*/
    0、0、v4l2_device->width << 16、v4l2_device->height << 16);


    如果(RET){
    错误("无法启用平面%d:%s"、
    DRM_DEVICe->plane_id[pip]、strerror (errno));

    "

    我还想使用三个缓冲区在 kmscube 中执行乒乓循环,但由于我是 GPU 程序的新手,我不知道如何修改代码,在 glsdk 上的 kmscube 代码中,只有两个缓冲区执行乒乓循环,就像我的项目完成的那样。 我认为增加缓冲区来播放圆圈会减少撕裂效果。
    您是否知道如何使用三个缓冲器在 kmscube (GLSDK)中执行乒乓循环?

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

    我们正在继续讨论其他论坛。 因此、我们要将此线程标记为闭合。

    此致、
    Anand