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

Author: Karmjit Mahil <[email protected]>
Date:   Wed Jun 28 14:39:59 2023 +0100

pvr: Compile SPM EOT shader

Signed-off-by: Karmjit Mahil <[email protected]>
Reviewed-by: Frank Binns <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24138>

---

 src/imagination/vulkan/pvr_cmd_buffer.c |  9 ++++---
 src/imagination/vulkan/pvr_spm.c        | 44 ++++++++++++++++-----------------
 src/imagination/vulkan/pvr_spm.h        |  2 --
 src/imagination/vulkan/usc/pvr_uscgen.c | 15 ++++++-----
 src/imagination/vulkan/usc/pvr_uscgen.h |  9 ++++---
 5 files changed, 39 insertions(+), 40 deletions(-)

diff --git a/src/imagination/vulkan/pvr_cmd_buffer.c 
b/src/imagination/vulkan/pvr_cmd_buffer.c
index b2d9090d5cf..71b7fa7c5b1 100644
--- a/src/imagination/vulkan/pvr_cmd_buffer.c
+++ b/src/imagination/vulkan/pvr_cmd_buffer.c
@@ -506,10 +506,11 @@ static VkResult 
pvr_sub_cmd_gfx_per_job_fragment_programs_create_and_upload(
 
    assert(emit_count > 0);
 
-   pvr_uscgen_per_job_eot(emit_count,
-                          pbe_cs_words,
-                          &usc_temp_count,
-                          &eot_program_bin);
+   pvr_uscgen_eot("per-job EOT",
+                  emit_count,
+                  pbe_cs_words,
+                  &usc_temp_count,
+                  &eot_program_bin);
 
    result = pvr_cmd_buffer_upload_usc(cmd_buffer,
                                       eot_program_bin.data,
diff --git a/src/imagination/vulkan/pvr_spm.c b/src/imagination/vulkan/pvr_spm.c
index 6ebe0a048ca..62060ab802e 100644
--- a/src/imagination/vulkan/pvr_spm.c
+++ b/src/imagination/vulkan/pvr_spm.c
@@ -42,6 +42,7 @@
 #include "pvr_static_shaders.h"
 #include "pvr_tex_state.h"
 #include "pvr_types.h"
+#include "pvr_uscgen.h"
 #include "util/bitscan.h"
 #include "util/macros.h"
 #include "util/simple_mtx.h"
@@ -610,23 +611,22 @@ pvr_spm_init_eot_state(struct pvr_device *device,
                        const struct pvr_renderpass_hwsetup_render *hw_render,
                        uint32_t *emit_count_out)
 {
-   const struct pvr_device_info *dev_info = &device->pdevice->dev_info;
-   struct pvr_pds_upload pds_eot_program;
-   uint64_t mem_stored;
-   VkResult result;
-
    const VkExtent2D framebuffer_size = {
       .width = framebuffer->width,
       .height = framebuffer->height,
    };
+   uint32_t pbe_state_words[PVR_MAX_COLOR_ATTACHMENTS]
+                           [ROGUE_NUM_PBESTATE_STATE_WORDS];
+   const struct pvr_device_info *dev_info = &device->pdevice->dev_info;
    uint32_t total_render_target_used = 0;
+   struct pvr_pds_upload pds_eot_program;
+   struct util_dynarray usc_shader_binary;
+   uint32_t usc_temp_count;
+   VkResult result;
 
    pvr_dev_addr_t next_scratch_buffer_addr =
       framebuffer->scratch_buffer->bo->vma->dev_addr;
-
-   /* FIXME: Remove this hard coding. */
-   uint32_t empty_eot_program[8] = { 0 };
-   uint32_t usc_temp_count = 0;
+   uint64_t mem_stored;
 
    /* TODO: See if instead of having a separate path for devices with 8 output
     * regs we can instead do this in a loop and dedup some stuff.
@@ -645,8 +645,8 @@ pvr_spm_init_eot_state(struct pvr_device *device,
          USC_MRT_RESOURCE_TYPE_OUTPUT_REG,
          0,
          next_scratch_buffer_addr,
-         spm_eot_state->pbe_cs_words[total_render_target_used],
-         spm_eot_state->pbe_cs_words[total_render_target_used + 1],
+         pbe_state_words[total_render_target_used],
+         pbe_state_words[total_render_target_used + 1],
          spm_eot_state->pbe_reg_words[total_render_target_used],
          spm_eot_state->pbe_reg_words[total_render_target_used + 1],
          &render_targets_used);
@@ -670,8 +670,8 @@ pvr_spm_init_eot_state(struct pvr_device *device,
             USC_MRT_RESOURCE_TYPE_MEMORY,
             i,
             next_scratch_buffer_addr,
-            spm_eot_state->pbe_cs_words[total_render_target_used],
-            spm_eot_state->pbe_cs_words[total_render_target_used + 1],
+            pbe_state_words[total_render_target_used],
+            pbe_state_words[total_render_target_used + 1],
             spm_eot_state->pbe_reg_words[total_render_target_used],
             spm_eot_state->pbe_reg_words[total_render_target_used + 1],
             &render_targets_used);
@@ -689,7 +689,7 @@ pvr_spm_init_eot_state(struct pvr_device *device,
          PVR_PBE_STARTPOS_BIT0,
          hw_render->sample_count,
          next_scratch_buffer_addr,
-         spm_eot_state->pbe_cs_words[total_render_target_used],
+         pbe_state_words[total_render_target_used],
          spm_eot_state->pbe_reg_words[total_render_target_used]);
 
       PVR_DEV_ADDR_ADVANCE(next_scratch_buffer_addr, mem_stored);
@@ -711,7 +711,7 @@ pvr_spm_init_eot_state(struct pvr_device *device,
             PVR_PBE_STARTPOS_BIT0,
             hw_render->sample_count,
             next_scratch_buffer_addr,
-            spm_eot_state->pbe_cs_words[total_render_target_used],
+            pbe_state_words[total_render_target_used],
             spm_eot_state->pbe_reg_words[total_render_target_used]);
 
          PVR_DEV_ADDR_ADVANCE(next_scratch_buffer_addr, mem_stored);
@@ -720,16 +720,16 @@ pvr_spm_init_eot_state(struct pvr_device *device,
       }
    }
 
-   /* TODO: The PBE state words likely only get used by the compiler to be
-    * embedded into the shader so we should probably remove it from
-    * spm_eot_state.
-    */
-   /* FIXME: Compile the EOT shader based on the mrt_setup configured above. */
+   pvr_uscgen_eot("SPM EOT",
+                  total_render_target_used,
+                  pbe_state_words[0],
+                  &usc_temp_count,
+                  &usc_shader_binary);
 
    /* TODO: Create a #define in the compiler code to replace the 16. */
    result = pvr_gpu_upload_usc(device,
-                               empty_eot_program,
-                               sizeof(empty_eot_program),
+                               usc_shader_binary.data,
+                               usc_shader_binary.size,
                                16,
                                &spm_eot_state->usc_eot_program);
    if (result != VK_SUCCESS)
diff --git a/src/imagination/vulkan/pvr_spm.h b/src/imagination/vulkan/pvr_spm.h
index 50a280df919..4390d25637d 100644
--- a/src/imagination/vulkan/pvr_spm.h
+++ b/src/imagination/vulkan/pvr_spm.h
@@ -59,8 +59,6 @@ struct pvr_spm_scratch_buffer_store {
 };
 
 struct pvr_spm_eot_state {
-   uint32_t pbe_cs_words[PVR_MAX_COLOR_ATTACHMENTS]
-                        [ROGUE_NUM_PBESTATE_STATE_WORDS];
    uint64_t pbe_reg_words[PVR_MAX_COLOR_ATTACHMENTS]
                          [ROGUE_NUM_PBESTATE_REG_WORDS];
 
diff --git a/src/imagination/vulkan/usc/pvr_uscgen.c 
b/src/imagination/vulkan/usc/pvr_uscgen.c
index 0ed14cb1555..fa7387936cd 100644
--- a/src/imagination/vulkan/usc/pvr_uscgen.c
+++ b/src/imagination/vulkan/usc/pvr_uscgen.c
@@ -29,13 +29,12 @@
 
 #include <stdbool.h>
 
-void pvr_uscgen_per_job_eot(
-   uint32_t emit_count,
-   const uint32_t *emit_state, /* Expects emit_count *
-                                  ROGUE_NUM_PBESTATE_STATE_WORDS
-                                  entries */
-   unsigned *temps_used,
-   struct util_dynarray *binary)
+/* Expects emit_count ROGUE_NUM_PBESTATE_STATE_WORDS entries */
+void pvr_uscgen_eot(const char *name,
+                    uint32_t emit_count,
+                    const uint32_t *emit_state,
+                    unsigned *temps_used,
+                    struct util_dynarray *binary)
 {
    rogue_builder b;
    rogue_shader *shader = rogue_shader_create(NULL, MESA_SHADER_NONE);
@@ -43,7 +42,7 @@ void pvr_uscgen_per_job_eot(
    rogue_reg *state_word_1 = rogue_temp_reg(shader, 1);
    rogue_backend_instr *emitpix = NULL;
 
-   rogue_set_shader_name(shader, "per-job EOT");
+   rogue_set_shader_name(shader, name);
    rogue_builder_init(&b, shader);
    rogue_push_block(&b);
 
diff --git a/src/imagination/vulkan/usc/pvr_uscgen.h 
b/src/imagination/vulkan/usc/pvr_uscgen.h
index 103df838e2e..ebb8af08f07 100644
--- a/src/imagination/vulkan/usc/pvr_uscgen.h
+++ b/src/imagination/vulkan/usc/pvr_uscgen.h
@@ -137,10 +137,11 @@ struct pvr_tq_frag_sh_reg_layout {
 
 /* TODO: Shader caching (not pipeline caching) support. */
 
-void pvr_uscgen_per_job_eot(uint32_t emit_count,
-                            const uint32_t *emit_state,
-                            unsigned *temps_used,
-                            struct util_dynarray *binary);
+void pvr_uscgen_eot(const char *name,
+                    uint32_t emit_count,
+                    const uint32_t *emit_state,
+                    unsigned *temps_used,
+                    struct util_dynarray *binary);
 
 void pvr_uscgen_nop(struct util_dynarray *binary);
 

Reply via email to