QNX screen使用介绍 第三章

5 篇文章 14 订阅

六、screen 创建子窗口

如果一个窗口属于另外一个窗口的一个组件,那么可以将此窗口创建为子窗口,子窗口会继承父窗口的大部分属性,同时也可以单独设置其属性。父窗口隐藏或退出,子窗口也会跟随父窗口,这个可以保证应用的各个组件可以同步操作。

  • 以字符串形式检索窗口ID,以便子窗口可以使用它来加入此窗口的组。SCREEN_PROPERTY_ID属性能保证获取的窗口ID该系统中是唯一的 
char window_group_name[64];

screen_get_window_property_cv(screen_window, SCREEN_PROPERTY_ID, sizeof(window_group_name), window_group_name );
  •  创建一个子窗口
screen_window_t screen_child_window;

int wintype = SCREEN_CHILD_WINDOW; 

screen_create_window_type(&screen_child_window, screen_ctx, wintype );
  • 加入父窗口组 
 screen_join_window_group(screen_child_window,window_group_name);

 

七、创建内部缓冲区

  • 创建一个内部缓冲区, 需要指定创建buffers的数量 
int num_bufs = 1;

screen_create_window_buffers(screen_window, num_bufs);
  • 设置buffers数据格式 
int format = SCREEN_FORMAT_RGBA8888;

screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_FORMAT, &format);
  • 设置buffers大小 
int bsize = {1920,1080};

screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_BUFFER_SIZE,  bsize);
  • 设置stride 
 int stride = bsize[0] * bpp / 8;
 
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_STRIDE, &stride);
  • 设置offset, 如果是YUV planar格式,例如NV12,需要设置此属性 
 int offset[3]; offset[0] = 0; offset[1] = bsize[1] * stride; offect[2] = -1;
 
screen_set_buffer_property_iv(created_buf, SCREEN_PROPERTY_STRIDE, &stride);

八、创建外部缓冲区

使用外部缓冲区,context必须使用SCREEN_BUFFER_PROVIDER_CONTEXT标志

  • 设置需要创建的buffers的数量,用于缓存
#define MAX_BUFS_CNT 6
int buf_idx = 0;
int bufs_cnt = MAX_BUFS_CNT;

for(buf_idx =0; buf_idx < bufs_cnt; buf_idx++)
{
     … …
}
  • 创建一个缓冲区句柄,可以将其附加到窗口或像素图上
screen_buffer_t screen_bufs;

screen_create_buffer(screen_bufs[buf_idx]);
  •  设置buffers数据格式
 int format = SCREEN_FORMAT_RGBA8888;
 
 screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_FORMAT, &format);
  •  设置buffers size
int bsize = {1920,1080};

screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_BUFFER_SIZE,  bsize);
  • 设置stride 
int stride = bsize[0] * bpp / 8;

screen_set_buffer_property_iv(screen_bufs, SCREEN_PROPERTY_STRIDE, &stride);
  • 设置buffer 大小 
int buf_capacity = stride * bsize[1];

screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_SIZE,  &buf_capacity);
  • 设置offset, 如果是YUV planar格式,例如NV12,需要设置此属性 
 int offset[3]; offset[0] = 0; offset[1] = bsize[1] * stride; offect[2] = -1;
 
 screen_set_buffer_property_iv(screen_bufs[buf_idx], SCREEN_PROPERTY_STRIDE, &offset);
  •  根据外部传入的物理地址获取虚拟地址
 unsigned *vaddr[MAX_BUFS_CNT];
 
 vaddr[buf_idx] = mmap_device_memory(0, attr->buf_capacity, PROT_READ | PROT_WRITE, 0, phyaddr[buf_idx]);
  •  screenbuf指针指向外部缓冲区
 screen_set_buffer_property_pv(screen_bufs[buf_idx], SCREEN_PROPERTY_POINTER, (void **)&vaddr[buf_idx]);
  •  将缓冲区与窗口关联
 screen_attach_window_buffers(screen_window, MAX_BUFS_CNT, screen_bufs);

 

 

九、screen post windows

  •  在显示屏上刷新窗口内容
 int rects[4] = {0, 0, 1920, 1080};
 
 int count = 1;
 
 screen_post_window(screen_window, screen_bufs[idx],  count, rects, SCREEN_WAIT_IDLE);

rects中包含一个窗口矩形的x,y 坐标,宽度和高度。注意xy坐标是相对坐标,相对与窗口的偏移位置

例如已经调用了screen_set_window_property_iv(screen_window, SCREEN_PROPERTY_POSITION, pos);设置了窗口位置,那么此时xy坐标应该是相对与这个pos的位置。 

 

 

 

 

 

 

 

 

QNXscreen进程是一个图形框架,提供开发时图像显示功能,抽象对外统一接口,屏蔽底层硬件差异。它是基于client/server模型的,其中screen进程是server程序。通过libscreen/libEGL/libGLESv2提供的API函数,应用程序可以进行渲染和硬件加速。此外,screen还支持插件,可以加载特定的硬件模块,如显示硬件模块、2D/3D加速器(GPU)和输入设备等资源。\[3\]在QNX系统中,screen服务的启动命令一般是通过命令"screen -c /lib64/graphics.conf"来启动,通常由startupmanager带起。\[1\]同时,screen服务的初始化依赖于openwfd显示框架,所以要求启动顺序要在wfd服务之后。\[2\] #### 引用[.reference_title] - *1* *2* [QNX SCREEN架构基本介绍](https://blog.csdn.net/kill150/article/details/131190079)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [QNX screen使用介绍 第一章](https://blog.csdn.net/Suixing_yuan/article/details/115145756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值