Mesa (main): st/pbo: add the image format in the download FS

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 3 16:10:52 UTC 2021


Module: Mesa
Branch: main
Commit: fd47c939f447657387f051c50837997598240eb8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fd47c939f447657387f051c50837997598240eb8

Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date:   Wed Oct 13 12:56:15 2021 +0200

st/pbo: add the image format in the download FS

In the V3D driver there is a NIR lowering step for `image_store`
intrinsic, where the image store format is required for doing the proper
lowering.

Thus, let's define it for the download FS instead of
keeping it as NONE.

v2 (Illia)
 - Use format only for drivers not supporting format-less writing.

v4 (Illia):
 - Use PIPE_CAP_IMAGE_STORE_FORMATTED to reduce combinations.

v5 (Ilia):
 - Use indirect array for download FS in not formatless-store support
   drivers.

Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13409>

---

 .../compiler/v3d_nir_lower_image_load_store.c      |  1 +
 src/mesa/state_tracker/st_context.h                |  7 ++++
 src/mesa/state_tracker/st_pbo.c                    | 41 ++++++++++++++++++----
 3 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/src/broadcom/compiler/v3d_nir_lower_image_load_store.c b/src/broadcom/compiler/v3d_nir_lower_image_load_store.c
index 2706432d5ef..6b459e1afa9 100644
--- a/src/broadcom/compiler/v3d_nir_lower_image_load_store.c
+++ b/src/broadcom/compiler/v3d_nir_lower_image_load_store.c
@@ -88,6 +88,7 @@ static void
 v3d_nir_lower_image_store(nir_builder *b, nir_intrinsic_instr *instr)
 {
         enum pipe_format format = nir_intrinsic_format(instr);
+        assert(format != PIPE_FORMAT_NONE);
         const struct util_format_description *desc =
                 util_format_description(format);
         const struct util_format_channel_description *r_chan = &desc->channel[0];
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 4f2a02054b4..9a2be69d709 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -326,6 +326,13 @@ struct st_context
       void *vs;
       void *gs;
       void *upload_fs[5][2];
+      /**
+       * For drivers supporting formatless storing
+       * (PIPE_CAP_IMAGE_STORE_FORMATTED) it is a pointer to the download FS;
+       * for those not supporting it, it is a pointer to an array of
+       * PIPE_FORMAT_COUNT elements, where each element is a pointer to the
+       * download FS using that PIPE_FORMAT as the storing format.
+       */
       void *download_fs[5][PIPE_MAX_TEXTURE_TYPES][2];
       struct hash_table *shaders;
       bool upload_enabled;
diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c
index a3fb0e65208..51a29e8bcfa 100644
--- a/src/mesa/state_tracker/st_pbo.c
+++ b/src/mesa/state_tracker/st_pbo.c
@@ -33,6 +33,7 @@
 #include "state_tracker/st_pbo.h"
 #include "state_tracker/st_cb_bufferobjects.h"
 
+#include "main/context.h"
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_screen.h"
@@ -407,6 +408,7 @@ static void *
 create_fs(struct st_context *st, bool download,
           enum pipe_texture_target target,
           enum st_pbo_conversion conversion,
+          enum pipe_format format,
           bool need_layer)
 {
    struct pipe_screen *screen = st->screen;
@@ -552,6 +554,7 @@ create_fs(struct st_context *st, bool download,
       img_var->data.access = ACCESS_NON_READABLE;
       img_var->data.explicit_binding = true;
       img_var->data.binding = 0;
+      img_var->data.image.format = format;
       nir_deref_instr *img_deref = nir_build_deref_var(&b, img_var);
 
       nir_image_deref_store(&b, &img_deref->dest.ssa,
@@ -601,7 +604,7 @@ st_pbo_get_upload_fs(struct st_context *st,
    enum st_pbo_conversion conversion = get_pbo_conversion(src_format, dst_format);
 
    if (!st->pbo.upload_fs[conversion][need_layer])
-      st->pbo.upload_fs[conversion][need_layer] = create_fs(st, false, 0, conversion, need_layer);
+      st->pbo.upload_fs[conversion][need_layer] = create_fs(st, false, 0, conversion, PIPE_FORMAT_NONE, need_layer);
 
    return st->pbo.upload_fs[conversion][need_layer];
 }
@@ -615,12 +618,26 @@ st_pbo_get_download_fs(struct st_context *st, enum pipe_texture_target target,
    STATIC_ASSERT(ARRAY_SIZE(st->pbo.download_fs) == ST_NUM_PBO_CONVERSIONS);
    assert(target < PIPE_MAX_TEXTURE_TYPES);
 
+   struct pipe_screen *screen = st->screen;
    enum st_pbo_conversion conversion = get_pbo_conversion(src_format, dst_format);
-
-   if (!st->pbo.download_fs[conversion][target][need_layer])
-      st->pbo.download_fs[conversion][target][need_layer] = create_fs(st, true, target, conversion, need_layer);
-
-   return st->pbo.download_fs[conversion][target][need_layer];
+   bool formatless_store = screen->get_param(screen, PIPE_CAP_IMAGE_STORE_FORMATTED);
+
+   /* For drivers not supporting formatless storing, download FS is stored in an
+    * indirect dynamically allocated array of storing formats.
+    */
+   if (!formatless_store && !st->pbo.download_fs[conversion][target][need_layer])
+      st->pbo.download_fs[conversion][target][need_layer] = calloc(sizeof(void *), PIPE_FORMAT_COUNT);
+
+   if (formatless_store) {
+      if (!st->pbo.download_fs[conversion][target][need_layer])
+         st->pbo.download_fs[conversion][target][need_layer] = create_fs(st, true, target, conversion, PIPE_FORMAT_NONE, need_layer);
+      return st->pbo.download_fs[conversion][target][need_layer];
+   } else {
+      void **fs_array = (void **)st->pbo.download_fs[conversion][target][need_layer];
+      if (!fs_array[dst_format])
+         fs_array[dst_format] = create_fs(st, true, target, conversion, dst_format, need_layer);
+      return fs_array[dst_format];
+   }
 }
 
 void
@@ -675,6 +692,8 @@ st_init_pbo_helpers(struct st_context *st)
 void
 st_destroy_pbo_helpers(struct st_context *st)
 {
+   struct pipe_screen *screen = st->screen;
+   bool formatless_store = screen->get_param(screen, PIPE_CAP_IMAGE_STORE_FORMATTED);
    unsigned i;
 
    for (i = 0; i < ARRAY_SIZE(st->pbo.upload_fs); ++i) {
@@ -690,7 +709,15 @@ st_destroy_pbo_helpers(struct st_context *st)
       for (unsigned j = 0; j < ARRAY_SIZE(st->pbo.download_fs[0]); ++j) {
          for (unsigned k = 0; k < ARRAY_SIZE(st->pbo.download_fs[0][0]); k++) {
             if (st->pbo.download_fs[i][j][k]) {
-               st->pipe->delete_fs_state(st->pipe, st->pbo.download_fs[i][j][k]);
+               if (formatless_store) {
+                  st->pipe->delete_fs_state(st->pipe, st->pbo.download_fs[i][j][k]);
+               } else {
+                  void **fs_array = (void **)st->pbo.download_fs[i][j][k];
+                  for (unsigned l = 0; l < PIPE_FORMAT_COUNT; l++)
+                     if (fs_array[l])
+                        st->pipe->delete_fs_state(st->pipe, fs_array[l]);
+                  free(st->pbo.download_fs[i][j][k]);
+               }
                st->pbo.download_fs[i][j][k] = NULL;
             }
          }



More information about the mesa-commit mailing list