diff options
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 17 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_helpers.h | 19 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.c | 30 |
3 files changed, 24 insertions, 42 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 7b6fc37c0f6..1a7c6d0a0ae 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -65,21 +65,6 @@ 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, @@ -227,7 +212,7 @@ static const struct dri2_format_mapping dri2_format_table[] = { { 0, 1, 0, __DRI_IMAGE_FORMAT_ABGR8888, 4 } } } }; -static const struct dri2_format_mapping * +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 76f024fd67c..e8425bf5616 100644 --- a/src/gallium/state_trackers/dri/dri_helpers.h +++ b/src/gallium/state_trackers/dri/dri_helpers.h @@ -26,8 +26,27 @@ #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 188d50dc6e3..5a555eacd09 100644 --- a/src/gallium/state_trackers/dri/dri_screen.c +++ b/src/gallium/state_trackers/dri/dri_screen.c @@ -33,6 +33,7 @@ #include "dri_screen.h" #include "dri_context.h" +#include "dri_helpers.h" #include "util/u_inlines.h" #include "pipe/p_screen.h" @@ -423,6 +424,7 @@ 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); @@ -433,32 +435,8 @@ dri_get_egl_image(struct st_manager *smapi, stimg->texture = NULL; pipe_resource_reference(&stimg->texture, img->texture); - 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; - } + map = dri2_get_mapping_by_fourcc(img->dri_fourcc); + stimg->format = map ? map->pipe_format : img->texture->format; stimg->level = img->level; stimg->layer = img->layer; |