版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

...

Compositor调用libXcomposite库实现composite扩展协议通信,X11 Server源码中集成了composite扩展功能,实现在源码树的composite目录下。

画布

图形系统的内容都渲染在画布上,如:X11的Pixmap,Wayland的wl_surface。图形系统启动时为每个屏幕创建一个画布,默认情况下,每个窗口都共享该画布,如下图所示。在X11 server中,在创建屏幕时调用CreateScreenResources回调函数创建画布,由miCreateScreenResources调用CreatePixmap创建画布。在创建窗口(Window)过程中,调CreateWindow回调函数,最终由fbCreateWindow函数将屏幕画布分配给窗口。

...

为了实现窗口合成功能,图形系统可为窗口创建新的画布,下图为compositor之后窗口与Pixmap的关系,为每个顶级窗口创建一个画布。以X11 Server为例,调用CreatePixmap回调函数,最终由fbCreatePixmap创建Pixmap;再调用SetWindowPixmap回调函数,最终由_fbSetWindowPixmap将窗口与pixmap关联。

...

Pixmap画布内存在fbCreatePixmap分配了一段连续的主机内存,当使用GPU渲染时,会调用以下操作分配GPU内存

代码块
languagecpp
// 申明分配GPU buffer
glGenBuffers
// 指定Buffer类型
glBindBuffer(GL_PIXEL_PACK_BUFFER)
// 指定尺寸创建GPU内存
glBufferData(GL_PIXEL_PACK_BUFFER)
// 指定GPU内存访问权限
glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE)

// 将GPU内存与framebuffer关联
glBindFramebuffer(GL_FRAMEBUFFER)

X11 Server端的实现

请求扩展

compositor向X11 server发送请求,X11 server影响请求,并做响应处理。

...

代码块
languagejava
/* Requests */
#define X_DamageQueryVersion        0
#define X_DamageCreate          1
#define X_DamageDestroy         2
#define X_DamageSubtract        3
#define X_DamageAdd         4
 
/* Events */
#define XDamageNotify           0
#define XDamageNumberEvents     (XDamageNotify + 1)
 
/* Constants */
#define XDamageReportRawRectangles  0      // 有新的区域
#define XDamageReportDeltaRectangles    1  // 区域有变化
#define XDamageReportBoundingBox    2      // 边界有变化
#define XDamageReportNonEmpty       3      // 空至非空转换
 
static int (*ProcDamageVector[XDamageNumberRequests]) (ClientPtr) = {
    ProcDamageQueryVersion, ProcDamageCreate, ProcDamageDestroy,
    ProcDamageSubtract, ProcDamageAdd,
};

// 提交渲染命令前调用该函数,二选一:记录或者报告;可由调用者选择。
1. 报告:指定报告触发条件,以及报告回调函数,当该drawable满足条件时回调通知
2. 记录:记录drawable所有的变化区域。如:modesetting记录screen pixmap的变化,然后更新显示。
void DamageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion);

// 提交渲染命令后调用该函数,处理reportAfter的damageReport,或者记录变化区域
void DamageRegionProcessPending(DrawablePtr pDrawable);