Wayland源码分析-damage相关流程

2023-12-24 00:38

本文主要是介绍Wayland源码分析-damage相关流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

wayland代码分析系列,刚刚开始,慢慢来~

本文关注damage相关的流程

Damage?

什么是damage?做图形开发的同学应该还比较熟悉,准确定义就不去深究了。

可以理解为,当图形应用需要重绘指定区域时,发送的一种事件,X11协议中有针对Damage的专门的扩展协议,Wayland中,其实就是client向server发送的一种事件(request),server端(compositor)收到事件后进行相应的处理,通常也就是重绘指定的区域。

初始情况下,wayland客户端会将整个surface作为初始区域,发送damage,目的时绘制surface。

流程

还是以weston代码中的最简单的client示例代码simple-shm为例看看相关流程。

client在创建display、window之后,调用:wl_surface_damage发送request,流程开始:

wl_surface_damage实现如下(由scanner工具生成,源代码中没有):

static inline void
wl_surface_damage(struct wl_surface *wl_surface, int32_t x, int32_t y, int32_t width, int32_t height)
{wl_proxy_marshal((struct wl_proxy *) wl_surface,WL_SURFACE_DAMAGE, x, y, width, height);
}

本质上就是封装相关数据,然后调用与服务端通信的接口,将相应的request:WL_SURFACE_DAMAGE发送给server,然后由server调用本地相应的接口完成处理。

服务端接收到相应request之后,调用本地接口(有关wayland客户端和服务端通信相关的机制,后续再抽空写单独的文章来说明),本地接口定义为:

static const struct wl_surface_interface surface_interface = {surface_destroy,surface_attach,surface_damage,surface_frame,surface_set_opaque_region,surface_set_input_region,surface_commit,surface_set_buffer_transform,surface_set_buffer_scale
};

可见damage对应接口为:surface_damage,实现为:

static void
surface_damage(struct wl_client *client,struct wl_resource *resource,int32_t x, int32_t y, int32_t width, int32_t height)
{struct weston_surface *surface = wl_resource_get_user_data(resource);pixman_region32_union_rect(&surface->pending.damage,&surface->pending.damage,x, y, width, height);
}

其实,就啥也没干,获取surface后,将新的damage区域与原有的damage区域进行组合,得到新的damage区域。

另,wayland 0.99版本之后,都使用了double buffer state,对于damage区域也是如此,之前更新damage区域时,更新的都是pending的damage,在commit之后,才将pending.damage赋值给current damage,然后clear掉pending.damage供下次使用。然后,在服务端repaint surface时,会清理掉current.damage供下次使用。

从整个流程上看,其实就是更新了一下damage对应的区域而已,没有其它操作,真正的绘图操作是在客户端commit后,由服务端compositor根据之前更新的damage区域来进行的,damage区域以外的区域不会被重绘。

 

转自:http://happyseeker.github.io/graphic/2016/11/10/wayland-damage-relative-flow.html

这篇关于Wayland源码分析-damage相关流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/530020

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的