render: add wlr_renderer_init_wl_shm

This allows compositors to initialize wl_shm without initializing
other globals like linux-dmabuf.
This commit is contained in:
Simon Ser 2021-06-07 16:31:53 +02:00
parent c9f3c2b4f7
commit 77d811a21b
2 changed files with 26 additions and 6 deletions

View file

@ -99,13 +99,19 @@ bool wlr_renderer_read_pixels(struct wlr_renderer *r, uint32_t fmt,
uint32_t src_x, uint32_t src_y, uint32_t dst_x, uint32_t dst_y, void *data); uint32_t src_x, uint32_t src_y, uint32_t dst_x, uint32_t dst_y, void *data);
/** /**
* Creates necessary shm and invokes the initialization of the implementation. * Initializes wl_shm, linux-dmabuf and other buffer factory protocols.
* *
* Returns false on failure. * Returns false on failure.
*/ */
bool wlr_renderer_init_wl_display(struct wlr_renderer *r, bool wlr_renderer_init_wl_display(struct wlr_renderer *r,
struct wl_display *wl_display); struct wl_display *wl_display);
/**
* Initializes wl_shm on the provided wl_display.
*/
bool wlr_renderer_init_wl_shm(struct wlr_renderer *r,
struct wl_display *wl_display);
/** /**
* Obtains the FD of the DRM device used for rendering, or -1 if unavailable. * Obtains the FD of the DRM device used for rendering, or -1 if unavailable.
* *

View file

@ -202,17 +202,18 @@ bool wlr_renderer_read_pixels(struct wlr_renderer *r, uint32_t fmt,
src_x, src_y, dst_x, dst_y, data); src_x, src_y, dst_x, dst_y, data);
} }
bool wlr_renderer_init_wl_display(struct wlr_renderer *r, bool wlr_renderer_init_wl_shm(struct wlr_renderer *r,
struct wl_display *wl_display) { struct wl_display *wl_display) {
if (wl_display_init_shm(wl_display)) { if (wl_display_init_shm(wl_display) != 0) {
wlr_log(WLR_ERROR, "Failed to initialize shm"); wlr_log(WLR_ERROR, "Failed to initialize wl_shm");
return false; return false;
} }
size_t len; size_t len;
const uint32_t *formats = wlr_renderer_get_shm_texture_formats(r, &len); const uint32_t *formats = wlr_renderer_get_shm_texture_formats(r, &len);
if (formats == NULL) { if (formats == NULL) {
wlr_log(WLR_ERROR, "Failed to initialize shm: cannot get formats"); wlr_log(WLR_ERROR, "Failed to initialize wl_shm: "
"cannot get renderer formats");
return false; return false;
} }
@ -229,11 +230,24 @@ bool wlr_renderer_init_wl_display(struct wlr_renderer *r,
xrgb8888 = true; xrgb8888 = true;
break; break;
default: default:
wl_display_add_shm_format(wl_display, fmt); if (wl_display_add_shm_format(wl_display, fmt) == NULL) {
wlr_log(WLR_ERROR, "Failed to initialize wl_shm: "
"failed to add format");
return false;
}
} }
} }
assert(argb8888 && xrgb8888); assert(argb8888 && xrgb8888);
return true;
}
bool wlr_renderer_init_wl_display(struct wlr_renderer *r,
struct wl_display *wl_display) {
if (!wlr_renderer_init_wl_shm(r, wl_display)) {
return false;
}
if (wlr_renderer_get_dmabuf_texture_formats(r) != NULL) { if (wlr_renderer_get_dmabuf_texture_formats(r) != NULL) {
if (wlr_renderer_get_drm_fd(r) >= 0) { if (wlr_renderer_get_drm_fd(r) >= 0) {
if (wlr_drm_create(wl_display, r) == NULL) { if (wlr_drm_create(wl_display, r) == NULL) {