From: Kenneth Graunke Date: Wed, 31 Jul 2019 18:05:49 +0000 (-0700) Subject: Revert "st/dri: simplify dri_get_egl_image by reusing dri2_format_table" X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3f9012839e2af6685cc2aeb8dc7c2757bba37326;p=mesa.git Revert "st/dri: simplify dri_get_egl_image by reusing dri2_format_table" This reverts commit c47af8b95f26bd83efe322ff0baa52263fb8625e. It causes dEQP-EGL regressions. (I think there is an easy fix, but we'll have it go through review again.) --- diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 1a7c6d0a0ae..7b6fc37c0f6 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -65,6 +65,21 @@ dri2_buffer(__DRIbuffer * driBufferPriv) return (struct dri2_buffer *) driBufferPriv; } +struct dri2_format_mapping { + int dri_fourcc; + int dri_format; /* image format */ + int dri_components; + enum pipe_format pipe_format; + int nplanes; + struct { + int buffer_index; + int width_shift; + int height_shift; + uint32_t dri_format; /* plane format */ + int cpp; + } planes[3]; +}; + static const struct dri2_format_mapping dri2_format_table[] = { { __DRI_IMAGE_FOURCC_ARGB2101010, __DRI_IMAGE_FORMAT_ARGB2101010, __DRI_IMAGE_COMPONENTS_RGBA, PIPE_FORMAT_B10G10R10A2_UNORM, 1, @@ -212,7 +227,7 @@ static const struct dri2_format_mapping dri2_format_table[] = { { 0, 1, 0, __DRI_IMAGE_FORMAT_ABGR8888, 4 } } } }; -const struct dri2_format_mapping * +static const struct dri2_format_mapping * dri2_get_mapping_by_fourcc(int fourcc) { for (unsigned i = 0; i < ARRAY_SIZE(dri2_format_table); i++) { diff --git a/src/gallium/state_trackers/dri/dri_helpers.h b/src/gallium/state_trackers/dri/dri_helpers.h index e8425bf5616..76f024fd67c 100644 --- a/src/gallium/state_trackers/dri/dri_helpers.h +++ b/src/gallium/state_trackers/dri/dri_helpers.h @@ -26,27 +26,8 @@ #include "dri_context.h" #include "dri_screen.h" - -struct dri2_format_mapping { - int dri_fourcc; - int dri_format; /* image format */ - int dri_components; - enum pipe_format pipe_format; - int nplanes; - struct { - int buffer_index; - int width_shift; - int height_shift; - uint32_t dri_format; /* plane format */ - int cpp; - } planes[3]; -}; - extern const __DRI2fenceExtension dri2FenceExtension; -const struct dri2_format_mapping * -dri2_get_mapping_by_fourcc(int fourcc); - __DRIimage * dri2_lookup_egl_image(struct dri_screen *screen, void *handle); diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c index 11bee3306c8..188d50dc6e3 100644 --- a/src/gallium/state_trackers/dri/dri_screen.c +++ b/src/gallium/state_trackers/dri/dri_screen.c @@ -33,7 +33,6 @@ #include "dri_screen.h" #include "dri_context.h" -#include "dri_helpers.h" #include "util/u_inlines.h" #include "pipe/p_screen.h" @@ -424,7 +423,6 @@ dri_get_egl_image(struct st_manager *smapi, { struct dri_screen *screen = (struct dri_screen *)smapi; __DRIimage *img = NULL; - const struct dri2_format_mapping *map; if (screen->lookup_egl_image) { img = screen->lookup_egl_image(screen, egl_image); @@ -435,9 +433,32 @@ dri_get_egl_image(struct st_manager *smapi, stimg->texture = NULL; pipe_resource_reference(&stimg->texture, img->texture); - map = dri2_get_mapping_by_fourcc(img->dri_fourcc); - assert(map); - stimg->format = map->pipe_format; + switch (img->dri_components) { + case __DRI_IMAGE_COMPONENTS_Y_U_V: + stimg->format = PIPE_FORMAT_IYUV; + break; + case __DRI_IMAGE_COMPONENTS_Y_UV: + if (img->texture->format == PIPE_FORMAT_R8_UNORM) + stimg->format = PIPE_FORMAT_NV12; + else /* P0XX uses R16 for first texture */ + stimg->format = PIPE_FORMAT_P016; + break; + case __DRI_IMAGE_COMPONENTS_AYUV: + stimg->format = PIPE_FORMAT_RGBA8888_UNORM; + break; + case __DRI_IMAGE_COMPONENTS_XYUV: + stimg->format = PIPE_FORMAT_RGBX8888_UNORM; + break; + case __DRI_IMAGE_COMPONENTS_Y_XUXV: + stimg->format = PIPE_FORMAT_YUYV; + break; + case __DRI_IMAGE_COMPONENTS_Y_UXVX: + stimg->format = PIPE_FORMAT_UYVY; + break; + default: + stimg->format = img->texture->format; + break; + } stimg->level = img->level; stimg->layer = img->layer;