egl: consistently use EGLint for DMA-BUF format

EGL_EXT_image_dma_buf_import_modifiers [1] uses EGLint to carry
formats. We were casting it to int (which may not be the same
width) and uint32_t (which may change the value).

Instead, use EGLint everywhere.

[1]: https://registry.khronos.org/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt
This commit is contained in:
Simon Ser 2022-12-12 23:08:48 +01:00
parent 8f58c060fd
commit 80074d95fb

View file

@ -95,8 +95,8 @@ static void load_egl_proc(void *proc_ptr, const char *name) {
*(void **)proc_ptr = proc; *(void **)proc_ptr = proc;
} }
static int get_egl_dmabuf_formats(struct wlr_egl *egl, int **formats); static int get_egl_dmabuf_formats(struct wlr_egl *egl, EGLint **formats);
static int get_egl_dmabuf_modifiers(struct wlr_egl *egl, int format, static int get_egl_dmabuf_modifiers(struct wlr_egl *egl, EGLint format,
uint64_t **modifiers, EGLBoolean **external_only); uint64_t **modifiers, EGLBoolean **external_only);
static void log_modifier(uint64_t modifier, bool external_only) { static void log_modifier(uint64_t modifier, bool external_only) {
@ -112,7 +112,7 @@ static void init_dmabuf_formats(struct wlr_egl *egl) {
wlr_log(WLR_INFO, "WLR_EGL_NO_MODIFIERS set, disabling modifiers for EGL"); wlr_log(WLR_INFO, "WLR_EGL_NO_MODIFIERS set, disabling modifiers for EGL");
} }
int *formats; EGLint *formats;
int formats_len = get_egl_dmabuf_formats(egl, &formats); int formats_len = get_egl_dmabuf_formats(egl, &formats);
if (formats_len < 0) { if (formats_len < 0) {
return; return;
@ -122,7 +122,7 @@ static void init_dmabuf_formats(struct wlr_egl *egl) {
bool has_modifiers = false; bool has_modifiers = false;
for (int i = 0; i < formats_len; i++) { for (int i = 0; i < formats_len; i++) {
uint32_t fmt = formats[i]; EGLint fmt = formats[i];
uint64_t *modifiers = NULL; uint64_t *modifiers = NULL;
EGLBoolean *external_only = NULL; EGLBoolean *external_only = NULL;
@ -781,7 +781,7 @@ EGLImageKHR wlr_egl_create_image_from_dmabuf(struct wlr_egl *egl,
return image; return image;
} }
static int get_egl_dmabuf_formats(struct wlr_egl *egl, int **formats) { static int get_egl_dmabuf_formats(struct wlr_egl *egl, EGLint **formats) {
if (!egl->exts.EXT_image_dma_buf_import) { if (!egl->exts.EXT_image_dma_buf_import) {
wlr_log(WLR_DEBUG, "DMA-BUF import extension not present"); wlr_log(WLR_DEBUG, "DMA-BUF import extension not present");
return -1; return -1;
@ -793,14 +793,13 @@ static int get_egl_dmabuf_formats(struct wlr_egl *egl, int **formats) {
// Just a guess but better than not supporting dmabufs at all, // Just a guess but better than not supporting dmabufs at all,
// given that the modifiers extension isn't supported everywhere. // given that the modifiers extension isn't supported everywhere.
if (!egl->exts.EXT_image_dma_buf_import_modifiers) { if (!egl->exts.EXT_image_dma_buf_import_modifiers) {
static const int fallback_formats[] = { static const EGLint fallback_formats[] = {
DRM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888,
DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888,
}; };
static unsigned num = sizeof(fallback_formats) / int num = sizeof(fallback_formats) / sizeof(fallback_formats[0]);
sizeof(fallback_formats[0]);
*formats = calloc(num, sizeof(int)); *formats = calloc(num, sizeof(EGLint));
if (!*formats) { if (!*formats) {
wlr_log_errno(WLR_ERROR, "Allocation failed"); wlr_log_errno(WLR_ERROR, "Allocation failed");
return -1; return -1;
@ -816,7 +815,7 @@ static int get_egl_dmabuf_formats(struct wlr_egl *egl, int **formats) {
return -1; return -1;
} }
*formats = calloc(num, sizeof(int)); *formats = calloc(num, sizeof(EGLint));
if (*formats == NULL) { if (*formats == NULL) {
wlr_log(WLR_ERROR, "Allocation failed: %s", strerror(errno)); wlr_log(WLR_ERROR, "Allocation failed: %s", strerror(errno));
return -1; return -1;
@ -830,7 +829,7 @@ static int get_egl_dmabuf_formats(struct wlr_egl *egl, int **formats) {
return num; return num;
} }
static int get_egl_dmabuf_modifiers(struct wlr_egl *egl, int format, static int get_egl_dmabuf_modifiers(struct wlr_egl *egl, EGLint format,
uint64_t **modifiers, EGLBoolean **external_only) { uint64_t **modifiers, EGLBoolean **external_only) {
*modifiers = NULL; *modifiers = NULL;
*external_only = NULL; *external_only = NULL;