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/TDA2PXEVM:[QT]如何使用 eglCreateImageKHR()在 QT OpenGL 下创建纹理图像

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/815175/linux-tda2pxevm-qt-how-to-create-texture-image-by-eglcreateimagekhr-under-qt-opengl

器件型号:TDA2PXEVM

工具/软件:Linux

您好:

 我们正在开发 VisionSDK、现在成功运行 QT。

我们有一个基于 QT 的环视应用、您知道 visionSDK 不支持 RGB 渲染

我们应该通过 eglCreateImageKHR()创建纹理图像,在这里我们需要通过 EGLDisplay,

我们称之为  

EGLNativeDisplayType GBM_LOADER_GET_native_display ()
{
if (FD =-1){
fd = drmOpen ("omapdrm"、NULL);
}
if (fd > 0 && dev = NULL){
DEV = GBM_CREASE_DEVICE (FD);
odev = OMA_DEVICE_NEW (FD);
}

返回(EGLNativeDisplayType) dev;
} 

但有错误

[AMS][11455497] OverlayDraw::load_obj_file。 MAX_x=1.72、max_y=3.43、max_z=0.00
[AMVM][11455497]超图 Draw::pre_load_radar_data。 文件"AVM_qt_app_res/data/radar_single.obj"开销24ms
加载模块:GBM_PVR.SO
找到有效的 GBM 后端:GBM_PVR.SO
PVR:(错误):[956->956]< GBM_PVR_CREASE_DEVICE():645|ERROR>无法创建 DBM 设备:无此类设备[0、]
EGL:错误:eglCreateImageKHR 失败!!
纹理 img create ok
没有可用的装饰插件。 没有装饰品的跑步。 

我们还尝试从 QT OpenGL 中重复使用 EGLDisplay、请参阅  

在 QT 中出现错误、EGLDisplay 处理程序为 NULL。

Weston 日志是:

root@dra7xx-EVM:/opt/vision_sdk cat /var/log/weston.log
日期:2018-09-17 UTC
[09:22:46.509] Weston 1.9.0
              http://wayland.freedesktop.org
故障报告发送至: bugs.freedesktop.org/enter_bug.cgi
内部版本:1.8.93-2-gb05cdb8 configure.ac:对于正式版本(2015-09-21 18:11:26 -0700)
[09:22:46.5101] OS:Linux、4.4.4.84、#2 SMP 优先

/usr/lib/weston/drm-backend.so
级 PDT 4月19 02:29:04星期五2019、armv7l [09:22:46.5101]使用“weston.ini':46.529]文件时,最多可重喷修改为1.9.0:26.529]。
[09:22:46.553]正在初始化 DRM 后端
[09:22:46.555]使用/dev/dri/card0
[09:22:46.556]正在加载模块'/usr/lib/weston/gl-renderer.so
已加载模块:GBM_PVR.SO
找到有效的 GBM 后端:GBM_PVR.SO
[09:22:46.621]警告:没有 EGL_EXT_platformer_BASE 支持或特定平台支持;回退到 GetlegDisplay。
[09:22:46.632]警告:不支持 EGL_EXT_buffer_age。 性能可能会受到影响。
[09:22:46.632]检索 EGL 客户端扩展字符串失败。
[09:22:46.633]警告:进入 Weston 时没有输入设备。 可能的原因:
-没有读取/dev/input/event 的权限
-席位配置错误(Weston 后端选项'seat'、udev 设备属性 ID_SEAT)
[09:22:46.633]无法创建输入设备
[09:22:46.663] EGL 版本:1.4 build 1.14@3699939 (main)
[09:22:46.09] EGL 供应商:Imagination Technologies
[09:22:46.664] EGL
客户端扩展[09:GEL_EGL_GEL_GEL:GEL:GEL:GEL 客户端扩展[09_GEL:GEL:GEL:GEL API 6.664]
EGL_KHR_IMAGE_BASE EGL_KHR_gl_纹 理_2D_image
EGL_KHR_gL_纹 理_cubemap_image EGL_KHR_gL_renderbuffer_image
EGL_KHR_vg_parent_image EGL_IMG_cl_image EGL_KHR_Fence_sync
EGL_IMG_Context_Priority EGL_IMG_HIBERNATE_PROCESS
EGL_IMG_IMAGE_CONSION_ATTRIBS EGL_KHR_SURFACY_CONTEXT
EGL_KHR_WAIT_SYNC EGL_KHR_CREASE_CONTEXT
EGL_WL_BIND_WAND_DISPLAY EGL_EXT_IMAGE_DMA_buf_IMPORT
[09:22:46.664] GL 版本:OpenGL ES 2.0 Build 1.14@3699939 (main)
[09:22:46.664] GLSL 版本:OpenGL ES GLSL ES 1.00 Build

GX@3699939 (main)[09:22:464]
OES GRUDIFLENDL:8.664] GL GL 6.464] GL GEL GEL GEL GEL GEL:00_GL GL Build GL:24:24:24:46648.24:rgL GL:rgL GL GL GL GL GL (gL:r24:rgL GL (main)[09:rgL
gL_Oes_vertex_half_float gL_Oes_纹 理_float
GL_OES_纹 理_Half_float GL_OES_Element_index_uint
gL_Oes_mapbuffer gL_Oes_fragment_precision_high
GL_OES_COMPLEED_ETC1_RGB8_TESDLE_OES_EGL_IMAGE
GL_OES_EGL_IMAGE_EXTERNAL GL_OES_Required_internalformat
GL_OES_DEPTY_纹 理 GL_OES_GET_program_binary
GL_OES_packed_depthe_stencil GL_OES_standard_衍生 产品
gL_Oes_vertex_array_object gL_Oes_EGL_SYNC gL_Oes_纹 理 nPOT
gL_Oes_surfaceless gL_context gL_EXT_Discard 帧缓冲区
GL_EXT_blind_MinMax GL_EXT_MULTI_RAGE_ARRAINESS_DIAING_RAMINMAX
GL_EXT_MULTI采样_呈现_至_纹理 GL_EXT_SHADER_TEST_LOD
GL_EXT_纹 理_FORMAT_BGRA8888 GL_EXT_occlustion_query_boolean
GL_EXT_纹 理_Rg GL_EXT_Draw 缓冲区
GL_EXT_shader_framebuffer_fetch GL_IMG_shader_binary
gL_IMG_纹 理_compression_pvrtc
gL_IMG_纹 理_压缩_pvrtc2 gL_IMG_纹 理_ nPOT
GL_IMG_纹 理_FORMAT_BGRA8888 GL_IMG_READ_FORMAT
GL_IMG_program_binary GL_IMG_unifore_buffer_object
GL_IMG_MULTILOG_Render;TO_TESTIE GL_KHR_DEBUG
[09:22:46.664] GL ES 2渲染器功能:
读回格式:RGBA
WL_shm 子图像到纹理:否
EGL Wayland 扩展:是
[09:22:46.664]选择的 EGL 配置详细信息:
RGBA 位:8 8 8
交换间隔范围:1 - 1
[09:22:46.664]光标缓冲区不可用,使用 gl 光标
[09:22:46.664]无法初始化背光
[09:22:46.664]输出虚拟-1,(连接器24、CRTC 26)
模式1280x720@60.0、首选、电流
[09:22:46.664]组合器功能:
任意曲面旋转:是
屏幕捕获使用 y 翻转:是
演示时钟:clock_monotonic、id 1
[09:22:46.666]正在加载模块'/usr/lib/weston/desktop-shell.so
[09:22:46.669]启动'/usr/libexec/weston-desktop-shell
[09:22:46.804]警告:计算


的页面延迟是疯狂的:-8734 msec [09:33:10.433]队列队列队列前冲失败:无效参数[09:56:34.12]无效的页前冲无效参数:无效 

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

    您好!

    VISION-SDK 的版本是什么? 是 v3.04还是更高版本的 vDRM? 如果它支持 vDRM、您可以在 kmscube 上引用此提交。

    对 kmsube 应用程序进行此更改是为了在 vDRM 上执行 kmscube。 此处无法使用 omapdrm。

    您还需要在/etc/powervr.ini 中添加此语句

    [QT 应用程序名称]
    DbmDriverName=vDRM 

    请尝试此操作?

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

    在 kmscube 上提交

    http://git.ti.com/glsdk/kmscube/commit/456cabc661caac5c60729751d45efd668faa8e97

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

    高 RAM:

    [引用 user="Ramprasad"]VISION-SDK 的版本是什么? 是 v3.04还是更高版本的 vDRM? 如果它支持 vDRM、您可以在 kmscube 上引用此提交

     VisionSDK3.05、启用 vDRM、qt 应用程序输出可显示在 HDMI 上。

    [引用 user="Ramprasad"]您还需要在/etc/powervr.ini 中添加此语句

     已配置  

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

    您好:

    这些简单的代码是否有效?(与 kmscube.c 进行比较)

    #include 
    #include 
    
    #include 
    #include 
    
    #include 
    #include 
    
    #include 
    
    
    int main( void ){
    
    assert( eglBindAPI( EGL_OpenGL_API )== EGL_true );
    
    int fd = open ("/dev/dri/card0、O_RDWR);
    struct GBM_DEVICE * GBM = GBM_CREASE_DEVICE ( FD );
    
    EGLDisplay dpy = eglGetDisplay( GBM );
    eglInitialize( dpy、NULL、NULL );
    
    EGLConfig 配置;
    EGLint n_of _configs;
    assert( eglGetConfigs( dpy、&config、1、&n_of _configs )== EGL_true );
    
    EGLSurface SRF = eglCreatePbufferSurface (dpy、config、NULL);
    assert( srf != EGL_NO_surface );
    
    EGLContext ctx = eglCreateContext (dpy、config、EGL_no_context、NULL);
    assert( ctx != EGL_NO_Context );
    
    assert( eglMakeCurrent( dpy、srf、srf、ctx )== EGL_true );
    
    eglDestroySurface (dpy,srf);
    eglDestroyContext( dpy , ctx );
    eglTerminate(dpy );
    
    GBM_DEVICE_SAWIT( GBM );
    close( fd );
    
    返回 EXIT_SUCCESS
    ;} 

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

    您好,

    您现在看到的此修改的问题是什么?

    谢谢

    RAM

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

     您好 RAM:

     我现在将 kmscube 代码集成到我的项目中、如果有任何问题、将更新该帖子。

    谢谢。

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

    您好、ram:

     请查看错误日志

    示例代码

    void Test2Setupegl()
    {
    drmEventContext evctx ={
    .version = DRM_EVENT_上下文_VERSION,
    .page_flip_handler = page_flip_handler,
    };
    struct GBM_bo *bo;
    struct DRM_fb *fb;
    int ret = init_drm ();
    if (ret){
    printf ("初始化 drm\n"失败);
    return;
    }
    printf ("## Primary display => ConnectorId =%d、Resolution =%DX%d\n"、
    DRM.connect_id[DISP_ID]、DRM.MODE[DISP_ID]->hISP display.mode[vID]->DRM[vdisplay]
    ;vINT_ID]
    
    
    
    RET = init_GBM();
    if (ret){
    printf ("初始化 GBM\n"\n 失败);
    return;
    }
    
    ret = init_gl ();
    if (ret){
    printf ("初始化 EGL\n"失败);
    return;
    }
    
    
    
    
    

    ###显示[0]:CRTC = 26、连接器= 24、格式= 0x34325258
    选择的模式[1280x720]:时钟=> 57061,垂直刷新=> 60,类型=> 72
    水平=> 1280、1292、1295、1301、0
    垂直=> 720、727、728、731、0
    ###主显示=>连接器 ID = 24、分辨率= 1280x720
    已加载模块:GBM_PVR.SO
    找到有效的 GBM 后端:GBM_PVR.SO
    PVR:(错误):[ 1135->1135]< GBM_PVR_BO_CREATE _COMMON ():260|ERROR>分配 DBM 缓冲区失败:无法分配内存[0、]
    PVR:(错误):[ 1135->1135]< GBM_PVR_surface_create_common ():448|error>GBM=0x281838:无法分配 GBM 缓冲区[0]、] 

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

    你(们)好

    您能否检查这是原因

    http://processors.wiki.ti.com/index.php/Virtual_DRM_:_An_User_Guide_for_Developing_Usecases#I_have_installed_Processor_SDK_Vision_3.04.00.00_with_VDRM_support_and_EVM_boots_up._weston_is_configured_to_use_vdrm.2C_but_the_weston_log_file_indicates_weston_failed_to_launch._Why.3F

    在目标中增加 CMA。  

    谢谢

    Ramprasad

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

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

    您好、ram:

     你是对的、如果有任何问题会更新它、我将继续。

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

    您好 RAM:

      git://git.ti.com/glsdk/kmscube.git 中的源代码运行良好,但当我尝试通过 eglCreateImageKHR()创建纹理 img 时  

    得到 EGL 错误(0x300c)、请帮助检查日志  

    ###显示[0]:CRTC = 26、连接器= 24、格式= 0x34325258
    选择的模式[1280x720]:时钟=> 57061,垂直刷新=> 60,类型=> 72
    水平=> 1280、1292、1295、1301、0
    垂直=> 720、727、728、731、0
    ###主显示=>连接器 Id = 24、分辨率= 1280x720
    已加载模块:GBM_PVR.SO
    找到有效的 GBM 后端: GBM_PVR.SO
    使用显示屏0x2与 EGL 版本1.4
    EGL 版本"1.4 Build 1.14@3699939 (main)"
    EGL 供应商" Imagination Technologies "
    EGL 扩展"EGL_IMG_CLIENT_API_OGL EGL_KHR_image EGL_KHR_IMAGE_BASE EGL_EGL_IMAGE_END_EGL_EGL_IM_ENCH_END_EGL_EGL_EGHR_ENCH_ENTRY_EGL_EGL_EGRAL_EGRATED_END_ENCH_END_EGL_EGL_EGRAM_EGRAM_EGL_EGRATED_EGRAM_GEL_EGRAM_GEL_ENCH_GEL_EGRATED_EGRATED_EGRAM_GEL_EGRAM_GEL_EGRAM_GEL_EGRAM_GEL_EGRATED_GEL_ENCH_GEL_EGRATED_GEL_EGRATED_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRATED_GEL_EGRAM_EG
    
    
    
    
    在 eglCreateImageKHR() eglError (0x300c)
    EGL: Error: eglCreateImageKHR failed!!!
    没有装饰插件可用。 没有装饰品的跑步。
    最大纹理8 

    下面是我的示例代码:

    1. malloc 从 Linux 中的内存(可以吗?)
    2. 将存储器 addr 转换为 DMA FD
    3. 创建纹理图像
    devBufFD = open ("/dev/vmemexp、O_RDWR | O_CLOEXEC);
    SetupEGLEnv ();
    
    uint8_t * Testdata=(uint8_t *) malloc (1280*720);
    if (!Testdata){
    printf ("无内存\n");
    return;
    }
    uint32_t dmaTex720
    
    ;texToutdmaf
    (tex&dmaf)
    CreateYUVTextureImg (1280,720、dmaFd、&outTex); 

    void CreateYUVTextureImg (int width、int height、int dmaBufFd、gLuint * outTexIndex)
    {
    EGLint 属性[32];
    int attrIdx;
    PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
    PFNGLEGLIMAGETTEXURE2DOESPROC glEGLImageTargetTexture2DOES;
    
    attrIdx = 0;
    
    ATTR[attrIdx++]= EGL_Linux_DRM_FourCC_EXT;
    ATTR[attrIdx+]= FourCC_STR ("NV12");
    
    ATTR[attrIdx++]= EGL_width;
    ATTR[attrIdx++]=宽度;
    printf ("width %d \n",width);
    
    ATTR[attrIdx++]= EGL_HEIGHT;
    ATTR[attrIdx++]=高度;
    printf ("高度%d \n"、高度);
    
    ATTR[attrIdx+]= EGL_DMA_BUF_PLANE0_Pit_EXT;
    attr[attrIdx++]=宽度;
    // printf ("pitch%d \n"、pProp->pit[0]);
    
    ATTR[attrIdx++]= EGL_DMA_BUF_Plane1_Pit_EXT;
    attr[attrIdx++]=width;// pProp->piting[0];
    //printf ("节距%d \n"、pProp->节 距[0]);
    
    ATTR[attrIdx+]= EGL_DMA_BUF_PLANE0_OFFSET_EXT;
    ATTR[attrIdx++]= 0;
    
    ATTR[attrIdx++]= EGL_DMA_BUF_Plane1_OFFSET_EXT;
    ATTR[attrIdx++]= 0;
    
    ATTR[attrIdx+]= EGL_DMA_BUF_PLANE0_FD_EXT;
    attr[attrIdx++]= dmaBufFd;
    
    ATTR[attrIdx++]= EGL_DMA_BUF_Plane1_FD_EXT;
    attr[attrIdx++]= dmaBufFd;
    
    ATTR[attrIdx++]= EGL_NONE;
    
    eglCreateImageKHR =
    (PFNEGLCREATEIMAGEKHRPROC) eglGetProAddress("eglCreateImageKHR");
    glEGLImageTargetText2DOES =
    (PFNGLEGLIMAGETADERGETTEXURE2DOESPROC) eglGetProAddress ("glEGLImageTargetTexture2DOES");
    
    printf ("EGLWindowDisplay %p \n"、gl.display);
    EGLImageKHR textImg = eglCreateKHR (
    GL.DISPLAY、
    EGL_NO_Context、
    EGL_Linux_DMA_BUF_EXT、
    null、
    属性
    );
    
    System_eglCheckEglError ("eglCreateImageKHR"、EGL_true);
    if (textimg =EGL_NO_IMAGE_KHR){
    printf (" EGL:错误:eglCreateImageKHR 失败!!!\n");
    返回-1;
    }
    
    光源纹理(1、outTexIndex);
    System_eglCheckGlError ("glGenTexts");
    
    glBindTexture (GL_纹 理_EXTERNAL_OES、* outTexIndex);
    System_eglCheckGlError ("glBindTexture");
    
    GlTextParameteri (GL_turete_external_OES、GL_turete_min_filter、GL_linear_linear);
    GlTextParameteri (GL_turete_external_OES、GL_turete_mag_filter、GL_linear);
    System_eglCheckGlError ("glTexParameteri");
    
    glEGLImageTargetTexture2DOES (GL_Tecture_external_OES、(GLeglImageOES) textImg);
    System_eglCheckGlError ("glEGLImageTargetTexture2DOES");
    
    
    } 

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

    您好,

    错误0x300c 表示 EGL_BAD_PARAMETER。 您的属性参数似乎正确。

    但是  

    uint8_t *测试数据=(uint8_t *) malloc (1280*720); 
    应该是这样的
    uint8_t *测试数据=(uint8_t *) malloc (1280*720*1.5); 
    我不确定错误是否是由这种情况引起的。

    您可以尝试此更改吗?

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

    高 RAM:

     你是对的。

     将其标记为已解决。