From ad0ca7a8794b1a9ad4e9dd9cecbb98354fcdae61 Mon Sep 17 00:00:00 2001 From: Karmjit Mahil Date: Wed, 28 Jun 2023 14:39:59 +0100 Subject: [PATCH] pvr: Compile SPM EOT shader Signed-off-by: Karmjit Mahil Reviewed-by: Frank Binns Part-of: --- 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 -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);