工具/软件:Linux
在 AM5728上、我使用 SGX GPU 的 DMABUF 导入扩展将视频纹理上传到 GPU。 我从 Arago 上使用的 OpenGL 版本是"OpenGL ES 2.0 Build 1.14@3699939 (main)"。
我使用了 Arago SDK"display-ksmscalsc"示例代码作为模板、并尝试了 YUV 和 ARGB8888 (GBM_format_ARGB8888) DMABUF 像素格式。 两种格式类型都可以正常工作、我的 HDMI 显示屏可以正确显示帧。 问题是几分钟后 ARGB8888类型的内存泄漏。
当我的应用程序启动并提供 ARGB8888 DMABUF 作为 EGLImageKHRs 时,它会成功运行大约5分钟,然后我才开始收到指示分配失败的重复控制台消息:
PVR:(错误):[ 961->964]< CreateDrawable():938|错误映射0缓冲区[0、]
PVR:(错误):[ 961->964]< CreateBuffer():859|error>无法获取缓冲区 FD [0、]
更多信息如下。 这是我如何创建映像的问题、还是 DMABUF 导入函数有错误?
下面是我以 RGBA8888格式将 DMABUF 提交到 GPU 的代码:
void TestOpenGL::setFrameToProcess (dmabuf_buffer * dmaBuf){
//仅设置一次输入纹理
EGLint DFD = dmaBuf->FD[0];
//设置 RGB
struct GBM_import_FD_DATA GBM_dmabuf ={
.fd = DFD、
.width = dmaBuf->width、
.height = dmaBuf->身高、
.STRIDE = dmaBuf->螺 距[0]、
.format = GBM_FORMAT_ARGB8888
};
#ifdef DEBUG_OGL
qDebug()<<setFrameToProcess Width,Height,DMABUF:“<< dmaBuf->width << dmaBuf->height << dmaBuf->FD[0];
#endif
struct GBM_bo *bo = GBM_BO_IMPORT (gbmDev、GBM_BO_IMPORT_FD、&GBM_dmabuf、
GBM_BO_USE_SCANOUT);
if (!bo){
qDebug()<<"setFrameToProcess GBM_BO_IMPORT FAILED";
返回;
}
EGLint attrib_list = EGL_none;
eglImage =空;
eglImage = eglCreateImageKHR (eglDisplay、EGL_NO_Context、EGL_NATE_PIXMAP_KHR、bo、&attrib_list);
if (eglImage = EGL_NO_IMAGE_KHR){
#ifdef DEBUG_OGL
qDebug()<<"setFrameToProcess eglCreateImageKHR failed!";
#endif
}
否则{
#ifdef DEBUG_OGL
qDebug()<<"setFrameToProcess EGL 图像:"<<eglImage <<" BO:"<< bo;
#endif
}
#ifdef DEBUG_OGL
qDebug()<<"setFrameToProcess m_TextureLCD:"<< m_TextureLCD;
#endif
glBindTexture (GL_纹 理_外部_OES、m_TextureLCD);
GLENUM Number Err = glGetError();
if (Number Err!= GL_NO_ERROR){
qDebug()<<"setFrameToProcess Failed to glBindTexture!";
fprintf (stderr、"setFrameToProcess EGLImageTargetText2DOES ()返回%d\n"、Number Err);
//销毁 DMABUF 映像
eglDestroyImageKHR( eglDisplay, eglImage );
返回;
}
GlTextParameteri (GL_turete_external_OES、GL_turete_min_filter、GL_linear_linear);
GlTextParameteri (GL_turete_external_OES、GL_turete_mag_filter、GL_linear);
//更新视频纹理/EGL 图像。
glEGLImageTargetTexture2DOES (GL_T纹 理_EXTERNAL_OES、eglImage);
#ifdef DEBUG_OGL
qDebug()<<"setFrameToProcess 上传的纹理!";
#endif
//printf ("setFrameToProcess EGLImageTargetText2DOES()返回%d\n",glGetError());
if (glGetError()!= GL_NO_ERROR){
qDebug()<<"setFrameToProcess Failed to glEGLImageTargetTexture2DOES!";
返回;
}
glUniform1i (m_DataUniformLCD、2);
//销毁 DMABUF 映像
eglDestroyImageKHR( eglDisplay, eglImage );
}
Linux 控制台在无法分配时开始重复打印以下消息:
[2491.096394] PVR_K:(错误):DevMemoryAlloc 错误 MMU_Alloc
[2491.101857] PVR_K:(错误):WrapMemory:DevMemoryAlloc (0x96000)失败
[2491.108390] PVR_K:(错误):BM_Wrap:WrapMemory failed
[2491.113467] PVR_K:(错误):PVRSRVMapDmaBufKM:无法包装 DMA-buf
[2491.120151] PVR_K:(错误):PVRSRVMapDmaBufBW:映射 dma-buf 句柄失败
[2491.127297] PVR_K:(错误):MMU_Alloc:VMArena 的 RA_Alloc 失败
[2491.133367] PVR_K:(错误):MMU_Alloc:Allloc of DevVAddr 从堆 General ID117440512中失败、pid:915、task:QThread
[2491.144093] PVR_K:(错误):DevMemoryAlloc 错误 MMU_Alloc
[2491.149537] PVR_K:(错误):WrapMemory:DevMemoryAlloc (0x1c3000)失败
[2491.156132] PVR_K:(错误):BM_Wrap:WrapMemory failed
[2491.161228] PVR_K:(错误):PVRSRVMapDmaBufKM:无法包装 dma-buf
[2491.167677] PVR_K:(错误):PVRSRVMapDmaBufBW:映射 dma-buf 句柄失败
[2491.212944] PVR_K:(错误):MMU_Alloc:VMArena 的 RA_Alloc 失败
[2491.219004] PVR_K:(错误):MMU_Alloc:Allloc of DevVAddr 从堆 General ID117440512失败,pid:915,task:QThread
[2491.229783] PVR_K:(错误):DevMemoryAlloc 错误 MMU_Alloc
[2491.235205] PVR_K:(错误):WrapMemory:DevMemoryAlloc (0x96000)失败
[2491.241698] PVR_K:(错误):BM_Wrap:WrapMemory failed
[2491.246833] PVR_K:(错误):PVRSRVMapDmaBufKM:无法包装 dma-buf
[2491.253217] PVR_K:(错误):PVRSRVMapDmaBufBW:映射 dma-buf 句柄失败
[2491.260462] PVR_K:(错误):MMU_Alloc:VMArena 的 RA_Alloc 失败
[2491.267169] PVR_K:(错误):MMU_Alloc:Allloc of DevVAddr 从堆中失败常规 ID117440512,pid:915,任务:QThread
我正在使用 omap5-SGX-DDK-um-Linux 中的以下提交:
提交 cf8cd620e96c9741bfcbe7f07c95328fe2d6ece9
作者:Anand Balagopalakrishnan
日期:2017年6月13日星期二11:02:20 +0530
UM:gles2:在1RGB FBO 完整性检查中修复 PVR_DBG 级别
签字人:Anand Balagopalakrishnan
它是几个比以下内容更新的提交:
提交 d1cb4ea42dbf275e2013aae95ad2d9182f05648c
作者:Anand Balagopalakrishnan
日期:2017年2月23日11:17:40日+0530
UM:通过 EGL 图像 DMABuf 导入修复内存泄漏问题
签字人:Anand Balagopalakrishnan
但是、我相信我仍然看到泄漏。