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.

[参考译文] 用于视频显示的内存管理

Guru**** 2563960 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595064/memory-management-for-video-display

我写了一个演示来显示3D 模型和图像嵌合。

========================================================================================================

 将存储器从摄像头收集的数据复制到图形缓冲器时、我遇到了一个问题。

这需要在 crotex-a15上花费12ms 和30%的 CPU 负载。

因此、我想在摄像头和 GPU 之间共享缓冲器。

=========== 这是 数据流=================================

我发现 "memcpy"是测试后占用12ms 和30% CPU 负载的原因。

那么、我想说的是"is it posable to share the buffer between camera and GPU?"(可以在摄像机和 GPU 之间共享缓冲区吗?)

因为摄像机数据缓冲器必须是连续的物理缓冲器!

但图形缓冲器是由 API OMAP-BO_MAP 制作的!

=========================== 这是 内存 allocat====的代码

********* DRM 部分********

int fd = drmOpen ("omapdrm"、NULL);

omap_device* dev = omap_device_new (FD);

******** OMAP 器件*********

struct omap_bo *bo;

BO = omap_bo_new (dev、  width * height * bpp / 8、 bo_flags);

********* OpenGL 部件********

int dfd = omap_bo_dabuf (bo);

               EGLint __attr[]={
                   EGL_width、   nWid、
                   EGL_Height、   nHgt、
                   EGL_Linux_DRM_FourCC_EXT、 DRM_FORMAT_YUV、
                   EGL_DMA_BUF_PLANE0_FD_EXT、 DFD、
                   EGL_DMA_BUF_PLANE0_OFFSET_EXT、 0、
                   EGL_DMA_BUF_PLANE0_Pit_EXT、 NPitch、
                   EGL_NONE
               };

 

              m_pKHRImage = eglCreateImageKHR (
                   m_pGraphic->getDisplay(),
                   EGL_NO_Context、
                   EGL_Linux_DMA_BUF_EXT、
                   null、
                   _attr);

               格网格纹理(1、&m_nTexture);
               glBindTexture (GL_纹 理_external_OES、m_nTexture);
               GlTextParameteri (GL_turete_external_OES、GL_turete_min_filter、GL_linear_linear);
               GlTextParameteri (GL_turete_external_OES、GL_turete_mag_filter、GL_linear);
               glEGLImageTargetTexture2DOES (GL_Texture_external_OES、(GLeglImageOES) m_pKHRImage);

(二 获取虚拟地址*********

m_pAddress      = OMA_BO_MAP (BO);//获取图形缓冲区

m_pVideoBuffer = getVideoBuffer();    //abstract API_-->摄像机缓冲区,是连续的物理缓冲区,使用"mmap" API

memcpy (m_pAddress、m_pVideoBuffer、npPitch * nHgt); // API 会消耗很多效率

 

 

 

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

    您的查询已发送给专家。 他们将在这里直接评论。

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

    无需将摄像机缓冲器的 memcpy 放入图形纹理中。 获取用于摄像头缓冲器的 DMABUF 后、它可直接用于创建 EGLImage。

    我建议改为:

    m_pVideoBuffer = getVideoBuffer();

    //从此摄像头缓冲器中获取 DMABUF FD

    //直接从此 DMABUF 创建 EGLImage

    eglCreateImageKHR(...)

    有关更多详细信息、请参阅以下承诺:
    git.ti.com/.../fccafce7d0a023e36c064ccbaa7d33e89252ea00

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

    上述消息中缺少一个部件。 如果摄像头缓冲器来自 M4、则需要首先将其转换为 Linux 端的 DMABUF、然后才能将其传递到图形驱动程序。

    以下白皮书建议了如何将虚拟内存导出为 DMABUF 的选项:
    elinux.org/.../ELC-virtmem-exp.pdf

    请注意、以上仅是其中一个选项。

    基本前提是确保将 M4存储器作为 DMABUF 直接提供给 SGX 驱动程序。

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

    你(们)好

     感谢您的回复,根据您的建议,我们希望尝试以下方法:

    1) 1)从 CMA 保留连续物理内存、而不进行映射

    2) userspace 映射上述物理内存以获取带有 mmap()的 vaddr

    3) 3)将 vaddr 导出为 DMABUF

    例如 ELC-virtmem-exp.pdf 中提到的方法

     "•使用不含零拷贝的 CMA 驱动程序
    White small square使用 CMA 驱动程序分配内存
    White small square映射它们以获取 vaddr,导出为 dmabuf "

    但是我检查了内核、libdrm 和 kmscube 代码,没有找到相关 示例。

    您能帮个忙、支持上述方法的一些参考代码吗、谢谢。

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

    在 PSDKLA 版本中、我们没有参考代码。 如果可以单独使用、让我在内部跟进团队。

    请注意、即使我们有参考代码、它也仅用作参考代码。 它不会作为 PSDKLA 的一部分得到支持。 如果存在问题、用户有责任解决这些问题。

    此致、
    Anand