diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index 5e0cbb035..56ac6b532 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -520,6 +520,31 @@ glamor_egl_fd_name_from_pixmap(ScreenPtr screen, return fd; } +static bool +gbm_format_for_depth(CARD8 depth, uint32_t *format) +{ + switch (depth) { + case 15: + *format = GBM_FORMAT_ARGB1555; + return true; + case 16: + *format = GBM_FORMAT_RGB565; + return true; + case 24: + *format = GBM_FORMAT_XRGB8888; + return true; + case 30: + *format = GBM_FORMAT_ARGB2101010; + return true; + case 32: + *format = GBM_FORMAT_ARGB8888; + return true; + default: + ErrorF("unexpected depth: %d\n", depth); + return false; + } +} + Bool glamor_back_pixmap_from_fd(PixmapPtr pixmap, int fd, @@ -558,25 +583,6 @@ glamor_back_pixmap_from_fd(PixmapPtr pixmap, return ret; } -static uint32_t -gbm_format_for_depth(CARD8 depth) -{ - switch (depth) { - case 15: - return GBM_FORMAT_ARGB1555; - case 16: - return GBM_FORMAT_RGB565; - case 24: - return GBM_FORMAT_XRGB8888; - case 30: - return GBM_FORMAT_ARGB2101010; - default: - ErrorF("unexpected depth: %d\n", depth); - case 32: - return GBM_FORMAT_ARGB8888; - } -} - PixmapPtr glamor_pixmap_from_fds(ScreenPtr screen, CARD8 num_fds, const int *fds, @@ -599,6 +605,10 @@ glamor_pixmap_from_fds(ScreenPtr screen, struct gbm_import_fd_modifier_data import_data = { 0 }; struct gbm_bo *bo; + if (!gbm_format_for_depth(depth, &import_data.format) || + width == 0 || height == 0) + goto error; + import_data.width = width; import_data.height = height; import_data.num_fds = num_fds; @@ -608,7 +618,6 @@ glamor_pixmap_from_fds(ScreenPtr screen, import_data.strides[i] = strides[i]; import_data.offsets[i] = offsets[i]; } - import_data.format = gbm_format_for_depth(depth); bo = gbm_bo_import(glamor_egl->gbm, GBM_BO_IMPORT_FD_MODIFIER, &import_data, 0); if (bo) { screen->ModifyPixmapHeader(pixmap, width, height, 0, 0, strides[0], NULL); @@ -624,6 +633,7 @@ glamor_pixmap_from_fds(ScreenPtr screen, } } +error: if (ret == FALSE) { screen->DestroyPixmap(pixmap); return NULL;