Revert "st/dri: simplify dri_get_egl_image by reusing dri2_format_table"
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 31 Jul 2019 18:05:49 +0000 (11:05 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 31 Jul 2019 18:06:32 +0000 (11:06 -0700)
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.)

src/gallium/state_trackers/dri/dri2.c
src/gallium/state_trackers/dri/dri_helpers.h
src/gallium/state_trackers/dri/dri_screen.c

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