生产库(libmirage-display producer)
生产库供 MirageWallpaper 渲染器(渲染生产者)使用:负责连接 broker、广播输出与格式能力、出借 DMA-BUF 缓冲池并提交帧。头文件 include/mirage_display_producer.h。
md_producer_t* p = md_producer_new(&callbacks); /* 调用方持有 *//* ... 连接与派发 ... */md_producer_free(p); /* 调用方释放 */md_producer_free 关闭连接,并清理全部持有的描述符。
typedef struct md_producer_callbacks { void (*on_connected)(void* user_data, uint64_t producer_id, uint64_t output_id); void (*on_output_config)(void* user_data, const md_producer_config_t* config); void (*on_retire_buffers)(void* user_data, uint64_t generation); void (*on_pointer_enter/leave/motion/button/axis)(...); void (*on_window_state)(void* user_data, uint32_t flags); void (*on_disconnected)(void* user_data, md_result_t reason, const char* message); void* user_data;} md_producer_callbacks_t;on_output_config 携带协商后的 md_producer_config_t(物理尺寸、刷新率、变换、
(fourcc, plane_count, modifier) 以及目标 DRM render node、可选 GPU UUID)。
回调返回后,生产者必须按这些字段创建 GPU 资源,并调用
md_producer_bind_gpu;在此之前不能出借池或提交帧。on_retire_buffers 通知
生产者退役指定代际。on_window_state 携带桌面窗口事实位标志(WINDOW_STATE:
0x1 遮盖、0x2 失焦、0x4 最大化、0x8 全屏),在派发线程调用,值仅对该次调用
借用;渲染器可据此暂停/恢复播放。
与消费库对称:md_producer_begin_connect / md_producer_begin_connected_fd / md_producer_advance_handshake / md_producer_connect(阻塞)。md_producer_info_t 包含稳定输出标识、渲染器类型、DRM 渲染节点、设备与驱动 UUID,以及 (fourcc, plane_count, modifier) 能力数组(借用)。
缓冲出借与帧提交
Section titled “缓冲出借与帧提交”md_result_t md_producer_bind_gpu(p, &gpu); /* 必须先于 offer_buffers */md_result_t md_producer_offer_buffers(p, &pool); /* 池 FD 借用,内部复制后排队发送 */md_result_t md_producer_set_config(p, &config);md_result_t md_producer_submit_frame(p, generation, buffer_index, sequence, acquire_sync_fd, release_syncobj_fd);md_result_t md_producer_retire_done(p, generation);offer_buffers的池 FD 是借用的,库在排队发送时复制它们;池本身始终归生产者所有。md_producer_bind_gpu的身份必须与最近一次OUTPUT_CONFIG一致;新的输出配置或重连后需要再次调用。submit_frame会消费两个帧 FD(包括错误路径),所有权转移给生产者协议库。- 没有可用释放槽时跳过该渲染帧;对退役代际的新帧会被拒绝。
- 消费者库
- 错误处理与生产者会话
- GPU 助手(
md_vk_exporter_export_frame与submit_frame配合)