Mesa (main): iris: Split iris_upload_shader in two

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 28 18:00:26 UTC 2021


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

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Mon Jun 28 11:51:10 2021 -0700

iris: Split iris_upload_shader in two

Now the part that uploads the shader and the part that finishes the
creation of the shader are separated.  Each now has a more reasonable
number of parameters.

Suggested-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11229>

---

 src/gallium/drivers/iris/iris_context.h       | 18 ++++----
 src/gallium/drivers/iris/iris_disk_cache.c    |  8 ++--
 src/gallium/drivers/iris/iris_program.c       | 65 +++++++++++++++++++++------
 src/gallium/drivers/iris/iris_program_cache.c | 40 +++++------------
 4 files changed, 76 insertions(+), 55 deletions(-)

diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h
index c94217c5033..d820cb094c9 100644
--- a/src/gallium/drivers/iris/iris_context.h
+++ b/src/gallium/drivers/iris/iris_context.h
@@ -963,6 +963,15 @@ struct iris_compiled_shader *iris_create_shader_variant(const struct iris_screen
                                                         uint32_t key_size,
                                                         const void *key);
 
+void iris_finalize_program(struct iris_compiled_shader *shader,
+                           struct brw_stage_prog_data *prog_data,
+                           uint32_t *streamout,
+                           enum brw_param_builtin *system_values,
+                           unsigned num_system_values,
+                           unsigned kernel_input_size,
+                           unsigned num_cbufs,
+                           const struct iris_binding_table *bt);
+
 void iris_upload_shader(struct iris_screen *screen,
                         struct iris_uncompiled_shader *,
                         struct iris_compiled_shader *,
@@ -971,14 +980,7 @@ void iris_upload_shader(struct iris_screen *screen,
                         enum iris_program_cache_id,
                         uint32_t key_size,
                         const void *key,
-                        const void *assembly,
-                        struct brw_stage_prog_data *,
-                        uint32_t *streamout,
-                        enum brw_param_builtin *sysv,
-                        unsigned num_system_values,
-                        unsigned kernel_input_size,
-                        unsigned num_cbufs,
-                        const struct iris_binding_table *bt);
+                        const void *assembly);
 void iris_delete_shader_variant(struct iris_compiled_shader *shader);
 
 void iris_destroy_shader_state(struct pipe_context *ctx, void *state);
diff --git a/src/gallium/drivers/iris/iris_disk_cache.c b/src/gallium/drivers/iris/iris_disk_cache.c
index 62313edde31..a62cf5db612 100644
--- a/src/gallium/drivers/iris/iris_disk_cache.c
+++ b/src/gallium/drivers/iris/iris_disk_cache.c
@@ -239,14 +239,16 @@ iris_disk_cache_retrieve(struct iris_screen *screen,
    if (num_system_values || kernel_input_size)
       num_cbufs++;
 
+   iris_finalize_program(shader, prog_data, so_decls, system_values,
+                         num_system_values, kernel_input_size, num_cbufs,
+                         &bt);
+
    assert(stage < ARRAY_SIZE(cache_id_for_stage));
    enum iris_program_cache_id cache_id = cache_id_for_stage[stage];
 
    /* Upload our newly read shader to the in-memory program cache. */
    iris_upload_shader(screen, ish, shader, NULL, uploader,
-                      cache_id, key_size, prog_key, assembly,
-                      prog_data, so_decls, system_values,
-                      num_system_values, kernel_input_size, num_cbufs, &bt);
+                      cache_id, key_size, prog_key, assembly);
 
    free(buffer);
 
diff --git a/src/gallium/drivers/iris/iris_program.c b/src/gallium/drivers/iris/iris_program.c
index 1bd83baa938..384d331f21c 100644
--- a/src/gallium/drivers/iris/iris_program.c
+++ b/src/gallium/drivers/iris/iris_program.c
@@ -69,6 +69,32 @@ get_new_program_id(struct iris_screen *screen)
    return p_atomic_inc_return(&screen->program_id);
 }
 
+void
+iris_finalize_program(struct iris_compiled_shader *shader,
+                      struct brw_stage_prog_data *prog_data,
+                      uint32_t *streamout,
+                      enum brw_param_builtin *system_values,
+                      unsigned num_system_values,
+                      unsigned kernel_input_size,
+                      unsigned num_cbufs,
+                      const struct iris_binding_table *bt)
+{
+   shader->prog_data = prog_data;
+   shader->streamout = streamout;
+   shader->system_values = system_values;
+   shader->num_system_values = num_system_values;
+   shader->kernel_input_size = kernel_input_size;
+   shader->num_cbufs = num_cbufs;
+   shader->bt = *bt;
+
+   ralloc_steal(shader, shader->prog_data);
+   ralloc_steal(shader->prog_data, (void *)prog_data->relocs);
+   ralloc_steal(shader->prog_data, prog_data->param);
+   ralloc_steal(shader->prog_data, prog_data->pull_param);
+   ralloc_steal(shader, shader->streamout);
+   ralloc_steal(shader, shader->system_values);
+}
+
 static struct brw_vs_prog_key
 iris_to_brw_vs_key(const struct intel_device_info *devinfo,
                    const struct iris_vs_prog_key *key)
@@ -1296,9 +1322,11 @@ iris_compile_vs(struct iris_screen *screen,
       screen->vtbl.create_so_decl_list(&ish->stream_output,
                                     &vue_prog_data->vue_map);
 
+   iris_finalize_program(shader, prog_data, so_decls, system_values,
+                         num_system_values, 0, num_cbufs, &bt);
+
    iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_VS,
-                      sizeof(*key), key, program, prog_data, so_decls,
-                      system_values, num_system_values, 0, num_cbufs, &bt);
+                      sizeof(*key), key, program);
 
    iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key));
 
@@ -1491,10 +1519,11 @@ iris_compile_tcs(struct iris_screen *screen,
 
    iris_debug_recompile(screen, dbg, ish, &brw_key.base);
 
+   iris_finalize_program(shader, prog_data, NULL, system_values,
+                         num_system_values, 0, num_cbufs, &bt);
+
    iris_upload_shader(screen, ish, shader, passthrough_ht, uploader,
-                      IRIS_CACHE_TCS, sizeof(*key), key, program, prog_data,
-                      NULL, system_values, num_system_values, 0, num_cbufs,
-                      &bt);
+                      IRIS_CACHE_TCS, sizeof(*key), key, program);
 
    if (ish)
       iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key));
@@ -1651,9 +1680,11 @@ iris_compile_tes(struct iris_screen *screen,
       screen->vtbl.create_so_decl_list(&ish->stream_output,
                                     &vue_prog_data->vue_map);
 
+   iris_finalize_program(shader, prog_data, so_decls, system_values,
+                         num_system_values, 0, num_cbufs, &bt);
+
    iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_TES,
-                      sizeof(*key), key, program, prog_data, so_decls,
-                      system_values, num_system_values, 0, num_cbufs, &bt);
+                      sizeof(*key), key, program);
 
    iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key));
 
@@ -1782,9 +1813,11 @@ iris_compile_gs(struct iris_screen *screen,
       screen->vtbl.create_so_decl_list(&ish->stream_output,
                                     &vue_prog_data->vue_map);
 
+   iris_finalize_program(shader, prog_data, so_decls, system_values,
+                         num_system_values, 0, num_cbufs, &bt);
+
    iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_GS,
-                      sizeof(*key), key, program, prog_data, so_decls,
-                      system_values, num_system_values, 0, num_cbufs, &bt);
+                      sizeof(*key), key, program);
 
    iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key));
 
@@ -1916,9 +1949,11 @@ iris_compile_fs(struct iris_screen *screen,
 
    iris_debug_recompile(screen, dbg, ish, &brw_key.base);
 
+   iris_finalize_program(shader, prog_data, NULL, system_values,
+                         num_system_values, 0, num_cbufs, &bt);
+
    iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_FS,
-                      sizeof(*key), key, program, prog_data, NULL,
-                      system_values, num_system_values, 0, num_cbufs, &bt);
+                      sizeof(*key), key, program);
 
    iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key));
 
@@ -2186,10 +2221,12 @@ iris_compile_cs(struct iris_screen *screen,
 
    iris_debug_recompile(screen, dbg, ish, &brw_key.base);
 
+   iris_finalize_program(shader, prog_data, NULL, system_values,
+                         num_system_values, ish->kernel_input_size, num_cbufs,
+                         &bt);
+
    iris_upload_shader(screen, ish, shader, NULL, uploader, IRIS_CACHE_CS,
-                      sizeof(*key), key, program, prog_data, NULL,
-                      system_values, num_system_values, ish->kernel_input_size,
-                      num_cbufs, &bt);
+                      sizeof(*key), key, program);
 
    iris_disk_cache_store(screen->disk_cache, ish, shader, key, sizeof(*key));
 
diff --git a/src/gallium/drivers/iris/iris_program_cache.c b/src/gallium/drivers/iris/iris_program_cache.c
index bb8795403cb..d31ba7785f1 100644
--- a/src/gallium/drivers/iris/iris_program_cache.c
+++ b/src/gallium/drivers/iris/iris_program_cache.c
@@ -155,26 +155,19 @@ iris_upload_shader(struct iris_screen *screen,
                    enum iris_program_cache_id cache_id,
                    uint32_t key_size,
                    const void *key,
-                   const void *assembly,
-                   struct brw_stage_prog_data *prog_data,
-                   uint32_t *streamout,
-                   enum brw_param_builtin *system_values,
-                   unsigned num_system_values,
-                   unsigned kernel_input_size,
-                   unsigned num_cbufs,
-                   const struct iris_binding_table *bt)
+                   const void *assembly)
 {
    const struct intel_device_info *devinfo = &screen->devinfo;
 
-   u_upload_alloc(uploader, 0, prog_data->program_size, 64,
+   u_upload_alloc(uploader, 0, shader->prog_data->program_size, 64,
                   &shader->assembly.offset, &shader->assembly.res,
                   &shader->map);
-   memcpy(shader->map, assembly, prog_data->program_size);
+   memcpy(shader->map, assembly, shader->prog_data->program_size);
 
    struct iris_resource *res = (void *) shader->assembly.res;
    uint64_t shader_data_addr = res->bo->gtt_offset +
                                shader->assembly.offset +
-                               prog_data->const_data_offset;
+                               shader->prog_data->const_data_offset;
 
    struct brw_shader_reloc_value reloc_values[] = {
       {
@@ -186,23 +179,9 @@ iris_upload_shader(struct iris_screen *screen,
          .value = shader_data_addr >> 32,
       },
    };
-   brw_write_shader_relocs(&screen->devinfo, shader->map, prog_data,
-                           reloc_values, ARRAY_SIZE(reloc_values));
-
-   shader->prog_data = prog_data;
-   shader->streamout = streamout;
-   shader->system_values = system_values;
-   shader->num_system_values = num_system_values;
-   shader->kernel_input_size = kernel_input_size;
-   shader->num_cbufs = num_cbufs;
-   shader->bt = *bt;
-
-   ralloc_steal(shader, shader->prog_data);
-   ralloc_steal(shader->prog_data, (void *)prog_data->relocs);
-   ralloc_steal(shader->prog_data, prog_data->param);
-   ralloc_steal(shader->prog_data, prog_data->pull_param);
-   ralloc_steal(shader, shader->streamout);
-   ralloc_steal(shader, shader->system_values);
+   brw_write_shader_relocs(&screen->devinfo, shader->map,
+                           shader->prog_data, reloc_values,
+                           ARRAY_SIZE(reloc_values));
 
    /* Store the 3DSTATE shader packets and other derived state. */
    screen->vtbl.store_derived_program_state(devinfo, cache_id, shader);
@@ -262,10 +241,11 @@ iris_blorp_upload_shader(struct blorp_batch *blorp_batch, uint32_t stage,
       iris_create_shader_variant(screen, ice->shaders.cache, IRIS_CACHE_BLORP,
                                  key_size, key);
 
+   iris_finalize_program(shader, prog_data, NULL, NULL, 0, 0, 0, &bt);
+
    iris_upload_shader(screen, NULL, shader, ice->shaders.cache,
                       ice->shaders.uploader_driver,
-                      IRIS_CACHE_BLORP, key_size, key, kernel,
-                      prog_data, NULL, NULL, 0, 0, 0, &bt);
+                      IRIS_CACHE_BLORP, key_size, key, kernel);
 
    struct iris_bo *bo = iris_resource_bo(shader->assembly.res);
    *kernel_out =



More information about the mesa-commit mailing list