QNX-Software Rendering

简介

QNX屏幕图形子系统基于客户机/服务器模型,其中应用程序是向服务器(屏幕)请求图形服务的客户机。目前QNX自身的渲染支持Software、Hardware acceleration、Hybrid、Cloning四种。由于QNX官方提供的screen渲染相关的文档,几乎没有提供有用的代码。因此,本文主要是为了记录自己在qnx screen渲染调试上的一些痕迹。

本文主要介绍QNX侧的Software渲染,其余渲染方案将在其他的文章中介绍。

Software

software渲染即使用cpu的方式对buffer进行渲染。通常流程如下:

  1. 创建render的目标
  2. 创建需要render的buffer
  3. 在buffer上绘制内容
  4. post上屏

以自身的项目为例,对上述render的步骤做详细的解释

1、创建render目标,QNX侧官方文档上,提供的样例,解释支持window、pixmap、stream三种形式,本文主要以screen window为例,按如下流程创建和初始化screen win

ret = screen_create_context(&pstCtx->screen_ctx, SCREEN_APPLICATION_CONTEXT | SCREEN_BUFFER_PROVIDER_CONTEXT);
ret = screen_create_window(&pstCtx->screen_win, pstCtx->screen_ctx);
/设置windows各种属性
ret = screen_set_window_property_iv(pstCtx->screen_win, SCREEN_PROPERTY_USAGE, &pstCtx->usage);
......
//选择要显示的物理屏///
pstCtx->screen_dpy = (screen_display_t *)calloc(pstCtx->ndisplays, sizeof(screen_display_t));
ret = screen_get_context_property_pv(pstCtx->screen_ctx, SCREEN_PROPERTY_DISPLAYS, (void **)pstCtx->screen_dpy);
......
ret = screen_set_window_property_pv(pstCtx->screen_win, SCREEN_PROPERTY_DISPLAY, (void **)&pstCtx->target_disp);

Context创建时,需要设置创建的Context类型,不通的Context,qnx侧给予的权限也是不同,Context type如下:

enum { 
    SCREEN_APPLICATION_CONTEXT = 0,               /// 允许进程创建自己的窗口并控制某些窗口属性
    SCREEN_WINDOW_MANAGER_CONTEXT = (1 << 0),     /// 允许进程创建的win拥有修改其他窗口的权力
    SCREEN_INPUT_PROVIDER_CONTEXT = (1 << 1),     /// 允许进程创建的win可以向其他窗口发送event
    SCREEN_POWER_MANAGER_CONTEXT = (1 << 2),      /// 允许进程创建的win可以访问diplay power
    SCREEN_DISPLAY_MANAGER_CONTEXT = (1 << 3),    /// 允许进程创建的win可以修改系统的display属性
    SCREEN_INPUT_MANAGER_CONTEXT = (1 << 4),      /// 允许进程创建的win可以收到所有的session
    SCREEN_BUFFER_PROVIDER_CONTEXT = (1 << 5)     /// 允许进程创建的win可以attach buffer
};

关于设置的screen属性,官方文档也有完整的描述,此处便不再详细描述,针对项目中使用的部分属性,在下方做解释

SCREEN_PROPERTY_USAGE                            指定该rendering target的预期用途
SCREEN_PROPERTY_FORMAT                           指定该rendering target的颜色格式
SCREEN_PROPERTY_SWAP_INTERVAL                    指定该rendering target post的周期
SCREEN_PROPERTY_SIZE                             指定该rendering target的尺寸
SCREEN_PROPERTY_POSITION                         指定该rendering target的位置
SCREEN_PROPERTY_ZORDER                           指定该rendering target的zorder
SCREEN_PROPERTY_ID_STRING                        指定该rendering target的窗口名
SCREEN_PROPERTY_PIPELINE                         指定该rendering target的display管道
SCREEN_PROPERTY_DISPLAY_COUNT                    用于获取系统支持的外部硬件display数量
SCREEN_PROPERTY_DISPLAYS                         指定该rendering target的display

2、创建需要render的buffer

//创建一个screen的通用buffer
ret = screen_create_buffer(&pstCtx->screen_buf);
/设置各种buffer属性
ret = screen_set_buffer_property_iv(pstCtx->screen_buf, SCREEN_PROPERTY_FORMAT, &fmt);
......
创建完buffer,设置完buffer属性后,attach到windowbuffer上
ret = screen_attach_window_buffers(pstCtx->screen_win, 1, &pstCtx->screen_buf);

3、在buffer上绘制你的内容,绘制(渲染)到与渲染目标关联的缓冲区。渲染buffer到缓冲区中有各种方案,本文在此不做详细解释,在项目中,主要使用同OpenGL来绘制该buffer

4、post上屏

ret = screen_get_window_property_pv(pstCtx->screen_win, SCREEN_PROPERTY_RENDER_BUFFERS, (void **)&pstCtx->screen_renderbuf);
if(ret != 0){
    LOGE( "screen_get_window_property_pv SCREEN_PROPERTY_RENDER_BUFFERS error:%s\n", strerror(errno));
    return 0;
}
/// post上屏
ret = screen_post_window(pstCtx->screen_win, pstCtx->screen_renderbuf, 0, nullptr, 0);
if(ret != 0){
    LOGE( "screen_post_window error:%s\n", strerror(errno));
}

QNX系统中自定义LCD分辨率并配置触摸屏涉及到对配置文件和库文件libwfdcfg-imx6x-qnx-car.so的修改。首先,要修改LCD的分辨率,需要定位到配置文件中`begin display internal`和`end display`之间的部分,并调整`video-mode`参数以设置所需的分辨率。例如,将`video-mode`修改为`1920x1080`可设置为1080p分辨率。 参考资源链接:[QNX系统中LCD分辨率设置与调试教程](https://wenku.youkuaiyun.com/doc/1fpjpe34aa?spm=1055.2569.3001.10343) 紧接着,对于触摸屏的配置,如果触摸屏与默认分辨率不兼容,需要修改库文件wfdcfg.c。这需要开发者具备QNX源码并按照特定格式添加新的分辨率参数。完成修改后,执行编译步骤,包含`make clean`, `make makehinstall install`等,生成新的库文件libwfdcfg-sample.so,并将其复制到指定位置替换原有库文件libwfdcfg-imx6x-qnx-car.so。操作命令如下: 1. 使用`mount -uw/base`命令进入基础文件系统目录。 2. 切换到`base/user/lib/graphics`目录。 3. 使用`cp`命令将新生成的libwfdcfg-sample.so复制到`lib/graphics`目录下libwfdcfg-imx6x-qnx-car.so的位置。 4. 使用`sync`命令同步更改,然后重启系统使改动生效。 最后,通过捕获FRAMEBUFF来检查2.bmp文件的分辨率,确认配置是否成功。如果显示的分辨率与设置的分辨率一致,则说明配置成功。若系统中无触摸屏,还需配置鼠标输入,涉及设置`blit-config`, `blits-logsize`, `input-logsize`, `requests-logsize`等变量,并启用`input=mouse`选项。以上步骤详细介绍了在QNX系统中如何自定义LCD分辨率和配置触摸屏的过程,确保了显示质量和用户交互的完整性。如果需要进一步了解关于编译流程和配置触摸屏的深入内容,可以参考《QNX系统中LCD分辨率设置与调试教程》。 参考资源链接:[QNX系统中LCD分辨率设置与调试教程](https://wenku.youkuaiyun.com/doc/1fpjpe34aa?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值