<html><head></head><body>Seems like you missed zink<br><br><div class="gmail_quote">On February 5, 2020 9:36:26 PM GMT+01:00, James Jones <jajones@nvidia.com> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">Rather than hard-code a list of all the format<br>modifiers supported by any gallium driver in<br>the dri state tracker, add a screen proc that<br>queries the number of auxiliary planes required<br>for a given modifier+format pair.<br><br>Since the only format modifier that requires<br>auxiliary planes currently is the iris driver's<br>I915_FORMAT_MOD_Y_TILED_CCS, provide a generic<br>implementation of this screen proc as a utility<br>function, and use that in every driver besides<br>the iris driver, which requires a trivial<br>customization on top of it.<br><br>Signed-off-by: James Jones <jajones@nvidia.com><hr> src/gallium/auxiliary/util/u_screen.c         | 35 ++++++++++++++++++<br> src/gallium/auxiliary/util/u_screen.h         |  7 ++++<br> src/gallium/drivers/etnaviv/etnaviv_screen.c  |  1 +<br> .../drivers/freedreno/freedreno_screen.c      |  1 +<br> src/gallium/drivers/iris/iris_resource.c      | 17 +++++++++<br> src/gallium/drivers/lima/lima_screen.c        |  1 +<br> .../drivers/nouveau/nvc0/nvc0_resource.c      |  2 ++<br> src/gallium/drivers/tegra/tegra_screen.c      | 12 +++++++<br> src/gallium/drivers/v3d/v3d_screen.c          |  1 +<br> src/gallium/drivers/vc4/vc4_screen.c          |  1 +<br> src/gallium/include/pipe/p_screen.h           | 15 ++++++++<br> src/gallium/state_trackers/dri/dri2.c         | 36 ++++++++-----------<br> 12 files changed, 107 insertions(+), 22 deletions(-)<br><br>diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c<br>index 785d1bd3e24..0697d483372 100644<br>--- a/src/gallium/auxiliary/util/u_screen.c<br>+++ b/src/gallium/auxiliary/util/u_screen.c<br>@@ -412,3 +412,38 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,<br>       unreachable("bad PIPE_CAP_*");<br>    }<br> }<br>+<br>+bool<br>+u_pipe_screen_get_modifier_aux_planes(struct pipe_screen *pscreen,<br>+                                      uint64_t modifier,<br>+                                      enum pipe_format format,<br>+                                      unsigned *num_aux_planes)<br>+{<br>+   int num_mods, i;<br>+   uint64_t *supported_mods;<br>+<br>+   pscreen->query_dmabuf_modifiers(pscreen, format, 0, NULL, NULL,<br>+                                   &num_mods);<br>+<br>+   if (!num_mods)<br>+      return false;<br>+<br>+   supported_mods = malloc(num_mods * sizeof(supported_mods[0]));<br>+<br>+   if (!supported_mods)<br>+      return false;<br>+<br>+   pscreen->query_dmabuf_modifiers(pscreen, format, num_mods, supported_mods,<br>+                                   NULL, &num_mods);<br>+<br>+   for (i = 0; i < num_mods && supported_mods[i] != modifier; i++);<br>+<br>+   free(supported_mods);<br>+<br>+   if (i == num_mods)<br>+      return false;<br>+<br>+   *num_aux_planes = 0;<br>+<br>+   return true;<br>+}<br>diff --git a/src/gallium/auxiliary/util/u_screen.h b/src/gallium/auxiliary/util/u_screen.h<br>index 3952a11f2ca..0abcfd282b1 100644<br>--- a/src/gallium/auxiliary/util/u_screen.h<br>+++ b/src/gallium/auxiliary/util/u_screen.h<br>@@ -23,6 +23,7 @@<br> <br> struct pipe_screen;<br> enum pipe_cap;<br>+enum pipe_format;<br> <br> #ifdef __cplusplus<br> extern "C" {<br>@@ -32,6 +33,12 @@ int<br> u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,<br>                                  enum pipe_cap param);<br> <br>+bool<br>+u_pipe_screen_get_modifier_aux_planes(struct pipe_screen *pscreen,<br>+                                      uint64_t modifier,<br>+                                      enum pipe_format format,<br>+                                      unsigned *num_aux_planes);<br>+<br> #ifdef __cplusplus<br> };<br> #endif<br>diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c<br>index dcceddc4729..32909a4e5ea 100644<br>--- a/src/gallium/drivers/etnaviv/etnaviv_screen.c<br>+++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c<br>@@ -1019,6 +1019,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,<br>    pscreen->context_create = etna_context_create;<br>    pscreen->is_format_supported = etna_screen_is_format_supported;<br>    pscreen->query_dmabuf_modifiers = etna_screen_query_dmabuf_modifiers;<br>+   pscreen->get_modifier_aux_planes = u_pipe_screen_get_modifier_aux_planes;<br> <br>    etna_fence_screen_init(pscreen);<br>    etna_query_screen_init(pscreen);<br>diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c<br>index 3c0ed69a9cb..5d25df02ebf 100644<br>--- a/src/gallium/drivers/freedreno/freedreno_screen.c<br>+++ b/src/gallium/drivers/freedreno/freedreno_screen.c<br>@@ -984,6 +984,7 @@ fd_screen_create(struct fd_device *dev, struct renderonly *ro)<br>  pscreen->fence_get_fd = fd_fence_get_fd;<br> <br>        pscreen->query_dmabuf_modifiers = fd_screen_query_dmabuf_modifiers;<br>+       pscreen->get_modifier_aux_planes = u_pipe_screen_get_modifier_aux_planes;<br> <br>       if (!screen->supported_modifiers) {<br>                static const uint64_t supported_modifiers[] = {<br>diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c<br>index bdd715df2c9..a3b0e87070f 100644<br>--- a/src/gallium/drivers/iris/iris_resource.c<br>+++ b/src/gallium/drivers/iris/iris_resource.c<br>@@ -38,6 +38,7 @@<br> #include "util/u_cpu_detect.h"<br> #include "util/u_inlines.h"<br> #include "util/format/u_format.h"<br>+#include "util/u_screen.h"<br> #include "util/u_threaded_context.h"<br> #include "util/u_transfer.h"<br> #include "util/u_transfer_helper.h"<br>@@ -193,6 +194,21 @@ iris_query_dmabuf_modifiers(struct pipe_screen *pscreen,<br>    *count = supported_mods;<br> }<br> <br>+static bool<br>+iris_get_modifier_aux_planes(struct pipe_screen *pscreen,<br>+                             uint64_t modifier,<br>+                             enum pipe_format format,<br>+                             unsigned *num_aux_planes)<br>+{<br>+   bool ret = u_pipe_screen_get_modifier_aux_planes(pscreen, modifier, format,<br>+                                                    num_aux_planes);<br>+<br>+   if (ret && modifier == I915_FORMAT_MOD_Y_TILED_CCS)<br>+      *num_aux_planes = 1;<br>+<br>+   return ret;<br>+}<br>+<br> static isl_surf_usage_flags_t<br> pipe_bind_to_isl_usage(unsigned bindings)<br> {<br>@@ -2075,6 +2091,7 @@ void<br> iris_init_screen_resource_functions(struct pipe_screen *pscreen)<br> {<br>    pscreen->query_dmabuf_modifiers = iris_query_dmabuf_modifiers;<br>+   pscreen->get_modifier_aux_planes = iris_get_modifier_aux_planes;<br>    pscreen->resource_create_with_modifiers =<br>       iris_resource_create_with_modifiers;<br>    pscreen->resource_create = u_transfer_helper_resource_create;<br>diff --git a/src/gallium/drivers/lima/lima_screen.c b/src/gallium/drivers/lima/lima_screen.c<br>index 0995ac86e6d..19ff3deeda1 100644<br>--- a/src/gallium/drivers/lima/lima_screen.c<br>+++ b/src/gallium/drivers/lima/lima_screen.c<br>@@ -598,6 +598,7 @@ lima_screen_create(int fd, struct renderonly *ro)<br>    screen->base.is_format_supported = lima_screen_is_format_supported;<br>    screen->base.get_compiler_options = lima_screen_get_compiler_options;<br>    screen->base.query_dmabuf_modifiers = lima_screen_query_dmabuf_modifiers;<br>+   screen->base.get_modifier_aux_planes = u_pipe_screen_get_modifier_aux_planes;<br> <br>    lima_resource_screen_init(screen);<br>    lima_fence_screen_init(screen);<br>diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c<br>index d73ecf71624..ab7bc69022c 100644<br>--- a/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c<br>+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_resource.c<br>@@ -3,6 +3,7 @@<br> #include "pipe/p_context.h"<br> #include "nvc0/nvc0_resource.h"<br> #include "nouveau_screen.h"<br>+#include "util/u_screen.h"<br> <br> <br> static struct pipe_resource *<br>@@ -117,6 +118,7 @@ nvc0_screen_init_resource_functions(struct pipe_screen *pscreen)<br>    pscreen->resource_create = nvc0_resource_create;<br>    pscreen->resource_create_with_modifiers = nvc0_resource_create_with_modifiers;<br>    pscreen->query_dmabuf_modifiers = nvc0_query_dmabuf_modifiers;<br>+   pscreen->get_modifier_aux_planes = u_pipe_screen_get_modifier_aux_planes;<br>    pscreen->resource_from_handle = nvc0_resource_from_handle;<br>    pscreen->resource_get_handle = u_resource_get_handle_vtbl;<br>    pscreen->resource_destroy = u_resource_destroy_vtbl;<br>diff --git a/src/gallium/drivers/tegra/tegra_screen.c b/src/gallium/drivers/tegra/tegra_screen.c<br>index 9ec3f6fe1d4..638f9b12797 100644<br>--- a/src/gallium/drivers/tegra/tegra_screen.c<br>+++ b/src/gallium/drivers/tegra/tegra_screen.c<br>@@ -514,6 +514,17 @@ static void tegra_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,<br>                                        external_only, count);<br> }<br> <br>+static bool tegra_screen_get_modifier_aux_planes(struct pipe_screen *pscreen,<br>+                                                 uint64_t modifier,<br>+                                                 enum pipe_format format,<br>+                                                 unsigned *num_aux_planes)<br>+{<br>+   struct tegra_screen *screen = to_tegra_screen(pscreen);<br>+<br>+   return screen->gpu->get_modifier_aux_planes(screen->gpu, modifier, format,<br>+                                               num_aux_planes);<br>+}<br>+<br> static struct pipe_memory_object *<br> tegra_screen_memobj_create_from_handle(struct pipe_screen *pscreen,<br>                                        struct winsys_handle *handle,<br>@@ -592,6 +603,7 @@ tegra_screen_create(int fd)<br> <br>    screen->base.resource_create_with_modifiers = tegra_screen_resource_create_with_modifiers;<br>    screen->base.query_dmabuf_modifiers = tegra_screen_query_dmabuf_modifiers;<br>+   screen->base.get_modifier_aux_planes = tegra_screen_get_modifier_aux_planes;<br>    screen->base.memobj_create_from_handle = tegra_screen_memobj_create_from_handle;<br> <br>    return &screen->base;<br>diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c<br>index 1b0c219cb58..c818edc158c 100644<br>--- a/src/gallium/drivers/v3d/v3d_screen.c<br>+++ b/src/gallium/drivers/v3d/v3d_screen.c<br>@@ -719,6 +719,7 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config,<br>         pscreen->get_device_vendor = v3d_screen_get_vendor;<br>         pscreen->get_compiler_options = v3d_screen_get_compiler_options;<br>         pscreen->query_dmabuf_modifiers = v3d_screen_query_dmabuf_modifiers;<br>+        pscreen->get_modifier_aux_planes = u_pipe_screen_get_modifier_aux_planes;<br> <br>         return pscreen;<br> <br>diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c<br>index 2be0b6c3fbe..8e4d6e24ea6 100644<br>--- a/src/gallium/drivers/vc4/vc4_screen.c<br>+++ b/src/gallium/drivers/vc4/vc4_screen.c<br>@@ -566,6 +566,7 @@ vc4_screen_create(int fd, struct renderonly *ro)<br>         pscreen->get_device_vendor = vc4_screen_get_vendor;<br>         pscreen->get_compiler_options = vc4_screen_get_compiler_options;<br>         pscreen->query_dmabuf_modifiers = vc4_screen_query_dmabuf_modifiers;<br>+        pscreen->get_modifier_aux_planes = u_pipe_screen_get_modifier_aux_planes;<br> <br>         if (screen->has_perfmon_ioctl) {<br>                 pscreen->get_driver_query_group_info = vc4_get_driver_query_group_info;<br>diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h<br>index 0f2831b6eda..596056091c0 100644<br>--- a/src/gallium/include/pipe/p_screen.h<br>+++ b/src/gallium/include/pipe/p_screen.h<br>@@ -511,6 +511,21 @@ struct pipe_screen {<br>     *                  should be.<br>     */<br>    void (*finalize_nir)(struct pipe_screen *screen, void *nir, bool optimize);<br>+<br>+   /**<br>+    * Get the number of aux planes required for a given modifier/format pair.<br>+    *<br>+    * If this function returns true, \p num_aux_planes will contain the number<br>+    * of additional planes needed (beyond the standard number dictated by<br>+    * \p format) to store auxiliary image data for the image layout defined by<br>+    * \p modifier.<br>+    *<br>+    * \return true if the format+modifier pair is supported on \p screen, false<br>+    *         otherwise.<br>+    */<br>+   bool (*get_modifier_aux_planes)(struct pipe_screen *screen,<br>+                                   uint64_t modifier, enum pipe_format format,<br>+                                   unsigned *num_aux_planes);<br> };<br> <br> <br>diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c<br>index 05ebb4ef1d7..5e688042122 100644<br>--- a/src/gallium/state_trackers/dri/dri2.c<br>+++ b/src/gallium/state_trackers/dri/dri2.c<br>@@ -839,38 +839,29 @@ dri2_create_image_from_name(__DRIscreen *_screen,<br> }<br> <br> static unsigned<br>-dri2_get_modifier_num_planes(uint64_t modifier, int fourcc)<br>+dri2_get_modifier_num_planes(__DRIscreen *_screen,<br>+                             uint64_t modifier, int fourcc)<br> {<br>+   struct pipe_screen *pscreen = dri_screen(_screen)->base.screen;<br>    const struct dri2_format_mapping *map = dri2_get_mapping_by_fourcc(fourcc);<br>+   unsigned num_aux_planes;<br> <br>    if (!map)<br>       return 0;<br> <br>    switch (modifier) {<br>-   case I915_FORMAT_MOD_Y_TILED_CCS:<br>-      return 2;<br>-   case DRM_FORMAT_MOD_BROADCOM_UIF:<br>-   case DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED:<br>    case DRM_FORMAT_MOD_LINEAR:<br>    /* DRM_FORMAT_MOD_NONE is the same as LINEAR */<br>-   case DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB:<br>-   case DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB:<br>-   case DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB:<br>-   case DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB:<br>-   case DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB:<br>-   case DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB:<br>-   case DRM_FORMAT_MOD_QCOM_COMPRESSED:<br>-   case DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED:<br>-   case DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED:<br>-   case DRM_FORMAT_MOD_VIVANTE_SUPER_TILED:<br>-   case DRM_FORMAT_MOD_VIVANTE_TILED:<br>-   /* FD_FORMAT_MOD_QCOM_TILED is not in drm_fourcc.h */<br>-   case I915_FORMAT_MOD_X_TILED:<br>-   case I915_FORMAT_MOD_Y_TILED:<br>    case DRM_FORMAT_MOD_INVALID:<br>       return map->nplanes;<br>    default:<br>-      return 0;<br>+      if (!pscreen->get_modifier_aux_planes ||<br>+          !pscreen->get_modifier_aux_planes(pscreen, modifier, map->pipe_format,<br>+                                            &num_aux_planes)) {<br>+         return 0;<br>+      }<br>+<br>+      return map->nplanes + num_aux_planes;<br>    }<br> }<br> <br>@@ -886,7 +877,7 @@ dri2_create_image_from_fd(__DRIscreen *_screen,<br>    __DRIimage *img = NULL;<br>    unsigned err = __DRI_IMAGE_ERROR_SUCCESS;<br>    int i, expected_num_fds;<br>-   int num_handles = dri2_get_modifier_num_planes(modifier, fourcc);<br>+   int num_handles = dri2_get_modifier_num_planes(_screen, modifier, fourcc);<br> <br>    if (!map || num_handles == 0) {<br>       err = __DRI_IMAGE_ERROR_BAD_MATCH;<br>@@ -1415,7 +1406,8 @@ dri2_query_dma_buf_format_modifier_attribs(__DRIscreen *_screen,<br> {<br>    switch (attrib) {<br>    case __DRI_IMAGE_FORMAT_MODIFIER_ATTRIB_PLANE_COUNT: {<br>-      uint64_t mod_planes = dri2_get_modifier_num_planes(modifier, fourcc);<br>+      uint64_t mod_planes = dri2_get_modifier_num_planes(_screen, modifier,<br>+                                                         fourcc);<br>       if (mod_planes > 0)<br>          *value = mod_planes;<br>       return mod_planes > 0;</pre></blockquote></div><br>-- <br>Sent from my Android device with K-9 Mail. Please excuse my brevity.</body></html>