工具/软件:Linux
我将 tda2px 平台与 VISION SDK 配合使用:software-dl.ti.com/processor-sdk-vision/esd/TDAx/vision-sdk/latest/index_FDS.html
当前正在尝试设置在 GPU 和 CPU 之间共享工作负载的后台处理流水线。 GPU 需要呈现一些离屏数据、CPU 可以进一步处理这些数据。
为此、我需要将用户空间映射缓冲区作为 OpenGL 资源传递。
通常在 GPU 侧、这是由 GL/EGL 实现的:EGLImage -> eglImageTargetRenderbufferStorage -> glFrameBufferRenderBuffer -> glDraw*
我在 ADAS 演示中发现 VISION_SDK/links_FW/src/HLS/system/system_egl_context.h 中使用的实用程序、用于将摄像机帧映射为 GPU 资源。
System_EglWindowObj* pEglObj; EGLCompatBuffer eglCBuf = pEglObj->eglInfo.get_EGL_attach_buffer (buf_width、buf_height、system_Df_RGB24_888 / mapbuf_format*、buf_memory_pointer);pegf_gap_gel_heel (pegl_gel_gap_gel_gap_gel_gap_gel_gaps);peglesnative = pegr_gel_gel_gel_gel_gel_gap_gel_gap_gap_gel_gel_gap_gap_esnative、
那么、现在的问题是如何获取在 GPU/CPU 之间共享的连续存储器区域、并将其映射到我们的进程。
我已经取得了很大的进展:
使用通用缓冲区管理器:TI_components/OS_tools/linux/targetfs/usr/include/GBM/gbm.h 创建共享缓冲区
使用直接渲染管理器:TI_components/OS_tools/linux/targetfs/usr/include/xf86drm.h 将缓冲区映射到处理用户空间
下面是一些省略了错误检查的伪代码:
struct GBM_DEVICE* gbmDev =(GBM_DEVICE_)pEglObj->nativeDisplay;
int FD = drmOpen ("omapdrm"、NULL);// DRM 句柄
struct struct GBM_bo* bo = GBM_BO_create (gbmDev、buf_width、buf_height、GBM_BO_format_GBM_SCBGBM_FORMAT_GBM*);GBM_GBM_SCBGBM_SCBGBM_FORMAT_SCBGBM*使用 GBM*
int bo_fd = GBM_bo_get_fd (bo);
union GBM_bo_handle bo_handle = GBM_bo_get_handle (bo);
struct drm_mode_map_dumb mreq ={0};
mreq.handle = bo_handle.ptr;
int ret = drmIoctl (fd /* bo_reert*、dumb mmap ={0}、mrebdumb
)、mfr_t_trl_remot_t_t_remote_remote_t*、t_dumb = mreq.offset);
GBM 缓冲区对象似乎已正确创建、具有句柄和文件描述符、但我无法映射它:
drmIoctl -返回-1、因此我们无法映射缓冲区对象以提供 get_EGL_attach_buffer 的指针。
这是解决此特定问题的正确方法还是实现此功能的更好方法?
后续问题将是高速缓存控制、当从 CPU 切换到 GPU 时、提供了哪些工具来使共享缓冲区无效/清除共享缓冲区、反之亦然?
提前感谢您、
此致、
Yavor