st/dri: simplify dri_get_egl_image by reusing dri2_format_table
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 6 Jun 2019 23:47:23 +0000 (19:47 -0400)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 31 Jul 2019 22:11:15 +0000 (15:11 -0700)
this makes dri2_get_mapping_by_fourcc accessible from dri_helpers.h
and does a direct lookup on the fourcc id to match the pipe format

v2 (Ken): Allow map to be NULL, use img->texture->format.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/gallium/state_trackers/dri/dri2.c
src/gallium/state_trackers/dri/dri_helpers.h
src/gallium/state_trackers/dri/dri_screen.c

index 7b6fc37c0f60b58e3d2140c515c568ce2ee54246..1a7c6d0a0ae4fb22927f6bc26dcdf8ba05df7eff 100644 (file)
@@ -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++) {
index 76f024fd67ce5cf46f7b25b9b499916746941513..e8425bf5616235fc48bc6e8c9d930a3e1ce94036 100644 (file)
 #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);
 
index 188d50dc6e3b791553ecb4339969497f95b99bed..5a555eacd09790142136f0ed84894fadd56a73bf 100644 (file)
@@ -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;