您好:
我们正在使用 QT 5.11处理 visionsdk3.08、当我们从 Weston 切换到 eglfs 时、出现以下错误
[AMS][439811]ModelLoader::加载"AVM_qt_app_res/SX12_6_22/SX12.3DS"。 min_x=-1.07、min_y=0.00、min_z=-2.29 [AVM][439811]ModelLoader::加载"AVM_qt_app_res/SX12_6_22/SX12.3DS"。 max_x=1.07、max_y=1.67、max_z=2.29 [AVM][439825] ModelDraw::pre_load_model_data。 文件 AVM_qt_app_res/SX12_6_22/SX12.3DS 成本1380ms [AVM][439825][AVM][439825] ModelDraw::pre_load_car_data。 ini 文件、det=-1.40 ModelDraw::pre_load_car_data。 ini 文件、det=-1.40 [AVM][439858]ModelDraw::load_model。 VERT_SIZE = 386532、NORMAL SIZE = 386532、UV_SIZE = 1、idx_SIZE = 128844 [AMS][439884]ModelDraw:load_model。 VERT_SIZE = 386532、NORMAL SIZE = 386532、UV_SIZE = 1、idx_SIZE = 128844 ###显示[0]:CRTC = 31、连接器= 29、格式= 0x34325258 选择的模式[1920x720]:时钟=> 85614,垂直刷新=> 60,类型=> 72 水平=> 1920、1939、1943、1952、0 垂直=> 720、727、728、731、0 ###主显示=>连接器 ID = 29、分辨率= 1920x720 PVR:(错误):[11295->11305]< WSEGL_InitializeDisplay():940|ERROR>GBM 器件通过0xadcc9f60与初始化的值0x3a0040 [0、] 初始化失败 无法初始化 EGL 数据地址0xa850d008 DMA FD 0x1b 宽度1024 高度1024 EGLWindowDisplay 0x3 EGL: After eglCreateImageKHR() eglesgl Error!(0x3lCreateImageKHR 错误:0x3eglEG001失败!)错误:错误:错误:错误:错误:错误:错误:错误:错误:错误:错误:错误:错误!
以下是源代码
void SetupEGLEnv ()
{
drmEventContext evctx ={
.version = DRM_EVENT_Context_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"'失败);
return;
}
ret = init_gl ();
if (ret){
printf ("初始化 EGL\n"'失败);
return;
}
static int init_drm (void)
{
drmModeRes *资源;if (rett){ printf ("failed to initialize EGL\n")
;
* rm_drt 编码器= nuln);* rm_drt = nrmcr *编码器*。
uint32_t maxRes、 curRes;
/* Open default dr device */
DRM.FD = open (device,O_RDWR | O_CLOEXEC);
if (DRM.FD < 0){
printf ("无法打开 DRM 器件%s\n",device);
return -1;
}
resources = drmModeGetResources (DRM.FD);
if (!!
return!/tresn)/tresn (return–32);if (rmrmresources:#rmoutn) *
对于(i = 0;i < resources->count_connector;++i){
connector = drmModeGetConnector (DRM.FD、resources-> connector[i]);
if (connection=DRM_mode_connected){
//找到匹配的编码器*
对于(j=0;j count_encoder;++j){
编码器= drmModeGetEncoder(Drm.fd,connecter->Encoder[j]);
//如果没有分配 fisrt,则获取 fisrt 1;//
if (!connecter->Encoder_id)
{
connectors->Encoder_id = encoderer->crk_id;
}
if (encoders->crtc =
== cer_trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&
++k){
/*检查此 CRTC 是否与编码器一起工作*/
if (!(encer->Possible _crtcs &(1 <<k))
continue;
encer->CRTC_id = resources->crtcs[k];
break;
}
if (!encer->CRTC_id)
{
printf ("编码器(%d)
= resources->crtcer_deeder[k];break;}编码器 mcer_deeder_definc);cer_deedereedere编码 器
!)编码器 mcer_definc = nr 编码器
}
break;
}
dmModeFreeEncoder (encoder);
encoder = NULL;
}
if (!encoder){
printf ("连接器(%d):无编码器!\n"、connector->connector_id);
drmModeFreeConnector (connector);
Continue;
}
//选择当前或第一支持的模式*/
CRTC = drmModeCrtc (tc->GetFDc);继续;
对于(j = 0;j < connector->count_modes;+j)
{
if (crtc->mode_valid)
{
if (connector->modes[j].hdisplay == crtc->宽度)&&
(connector->models[j].vdisplay ==&cntc->高度)}
{dr.modes[j].modes[j<connector=>crtc=>dislinks=j>modes<j>crtc.p<j<j>modes=j<j<j<connector>modes<j>[j<connector.display<j>modes<j<j<j<j<j<j>modes=>degm.display<j<j>[j<j<j<j>modes<j<links=>[j>d<d
}
if (j >= connecter->count_modes)
drm.mode[drm.ndisp]=&connecter->modes[0];
drm.connect_id[drm.ndisp]= connectors->connect_id;
drm.encoder[t.ndisp]=(Uprint32_t)编码器;drm.crtctrm.crtc_det_id[d.n.dx
= n!d.trm.trm.endor.trm.endor.n.dx = n 格式、d.trm.endor.trm.udp = n.dx = nvn = n.d.trm.trm.trm.trm.trm.trm.trm.trm.d.endor.d.d.endor.d.d.endor.trm.n.dx (= n.d.d.d.trm.d.d.tr
drm.connect_id[drm.ndisp]、drm.format[drm.ndisp]);
printf ("\tMode channed [%s]:Clock =>%d、Vertical refresh =>%d、Type =>%d\n"、drm.mode[drm.ndisp]-> name、drm.mode[drm.ndisp]、drm.mode[drm.ndisp]、vreflum->clock drm.mode[drm.ndisp]->type);
printf ("\tHorizontal =>%d、%d、%d、%d、%d、 %d\n"、DRM.mode[DRM.ndisp]->hdisplay、DRM.mode[DRM.ndisp]->HSYNC_START、DRM.mode[DRM.ndisp]->HSYNC_END、DRM.mode[DRM.ndisp]->htotal、 drm.mode[drm.ndisp]->hskew);
printf ("\tVertical =>%d、%d、%d、%d、%d、%d、 %d\n"、drm.mode[drm.ndisp]->vdisplay、drm.mode[drm.ndisp]->vsync_start、drm.mode[drm.ndisp]->vsync_end、drm.mode[drm.ndisp]->vtotal、 DRM.mode[DRM.ndisp]->vscan);
//如果指定了 connector_id,请使用相应的显示*/
if ((connector_id !=-1)&&(connector_id =DRM.connector_id[DRM.ndisp])
,则使用相应的显示*/ if (connector_id !=-1)&&(connector_id =DRM.ndisp]),
如果启用了所有显示*[DRM.connector.display_max_modity],请选择 ddr.remax.did]/以最大
显示模式显示*[DRM.display_dis.remax.did](ddr.display_dis.dis.did])。
curRes = drm.mode[drm.ndisp]->vdisplay * drm.mode[drm.ndisp]->hdisplay;
if (curRes > maxRes)
dISP_ID = drm.ndisp;
}
++DRM.ndisp;
}否则{
drmModeFreeConnector (connector);
}
如果(DRM.ndisp = 0){
//我们可以花哨聆听热插拔事件并等待
*一个连接器。
//
printf ("未连接连接器!\n");
return -1;
}
return 0;
}
static int init_GBM (void)
{
gbm.dev = GBM_create_device (drm.fd);
GBM.surface = GBM_surface_create (gbm.dev、
drm.mode[dsp_id]->hdisplay、drm.mode[dsp_id]->fmbm.mode[DCM_ID]->find_dmt_dmt_display_dmt.file_d&dmt_dmt.for_d&v
GBM_BO_USE_SCANOUT | GBM_BO_USE_Rendering);
if (!GBM.surface){
printf ("创建 GBM 表面失败\n");
return -1;
}
return 0;
}
请参阅此 TT
