pvr: Compile SPM EOT shader

Signed-off-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Reviewed-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24138>
This commit is contained in:
Karmjit Mahil
2023-06-28 14:39:59 +01:00
committed by Marge Bot
parent bf5c529f97
commit ad0ca7a879
5 changed files with 39 additions and 40 deletions
+5 -4
View File
@@ -506,10 +506,11 @@ static VkResult pvr_sub_cmd_gfx_per_job_fragment_programs_create_and_upload(
assert(emit_count > 0); assert(emit_count > 0);
pvr_uscgen_per_job_eot(emit_count, pvr_uscgen_eot("per-job EOT",
pbe_cs_words, emit_count,
&usc_temp_count, pbe_cs_words,
&eot_program_bin); &usc_temp_count,
&eot_program_bin);
result = pvr_cmd_buffer_upload_usc(cmd_buffer, result = pvr_cmd_buffer_upload_usc(cmd_buffer,
eot_program_bin.data, eot_program_bin.data,
+22 -22
View File
@@ -42,6 +42,7 @@
#include "pvr_static_shaders.h" #include "pvr_static_shaders.h"
#include "pvr_tex_state.h" #include "pvr_tex_state.h"
#include "pvr_types.h" #include "pvr_types.h"
#include "pvr_uscgen.h"
#include "util/bitscan.h" #include "util/bitscan.h"
#include "util/macros.h" #include "util/macros.h"
#include "util/simple_mtx.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, const struct pvr_renderpass_hwsetup_render *hw_render,
uint32_t *emit_count_out) 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 = { const VkExtent2D framebuffer_size = {
.width = framebuffer->width, .width = framebuffer->width,
.height = framebuffer->height, .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; 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 = pvr_dev_addr_t next_scratch_buffer_addr =
framebuffer->scratch_buffer->bo->vma->dev_addr; framebuffer->scratch_buffer->bo->vma->dev_addr;
uint64_t mem_stored;
/* FIXME: Remove this hard coding. */
uint32_t empty_eot_program[8] = { 0 };
uint32_t usc_temp_count = 0;
/* TODO: See if instead of having a separate path for devices with 8 output /* 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. * 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, USC_MRT_RESOURCE_TYPE_OUTPUT_REG,
0, 0,
next_scratch_buffer_addr, 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_cs_words[total_render_target_used + 1], 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],
spm_eot_state->pbe_reg_words[total_render_target_used + 1], spm_eot_state->pbe_reg_words[total_render_target_used + 1],
&render_targets_used); &render_targets_used);
@@ -670,8 +670,8 @@ pvr_spm_init_eot_state(struct pvr_device *device,
USC_MRT_RESOURCE_TYPE_MEMORY, USC_MRT_RESOURCE_TYPE_MEMORY,
i, i,
next_scratch_buffer_addr, 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_cs_words[total_render_target_used + 1], 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],
spm_eot_state->pbe_reg_words[total_render_target_used + 1], spm_eot_state->pbe_reg_words[total_render_target_used + 1],
&render_targets_used); &render_targets_used);
@@ -689,7 +689,7 @@ pvr_spm_init_eot_state(struct pvr_device *device,
PVR_PBE_STARTPOS_BIT0, PVR_PBE_STARTPOS_BIT0,
hw_render->sample_count, hw_render->sample_count,
next_scratch_buffer_addr, 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]); spm_eot_state->pbe_reg_words[total_render_target_used]);
PVR_DEV_ADDR_ADVANCE(next_scratch_buffer_addr, mem_stored); 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, PVR_PBE_STARTPOS_BIT0,
hw_render->sample_count, hw_render->sample_count,
next_scratch_buffer_addr, 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]); spm_eot_state->pbe_reg_words[total_render_target_used]);
PVR_DEV_ADDR_ADVANCE(next_scratch_buffer_addr, mem_stored); 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 pvr_uscgen_eot("SPM EOT",
* embedded into the shader so we should probably remove it from total_render_target_used,
* spm_eot_state. pbe_state_words[0],
*/ &usc_temp_count,
/* FIXME: Compile the EOT shader based on the mrt_setup configured above. */ &usc_shader_binary);
/* TODO: Create a #define in the compiler code to replace the 16. */ /* TODO: Create a #define in the compiler code to replace the 16. */
result = pvr_gpu_upload_usc(device, result = pvr_gpu_upload_usc(device,
empty_eot_program, usc_shader_binary.data,
sizeof(empty_eot_program), usc_shader_binary.size,
16, 16,
&spm_eot_state->usc_eot_program); &spm_eot_state->usc_eot_program);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
-2
View File
@@ -59,8 +59,6 @@ struct pvr_spm_scratch_buffer_store {
}; };
struct pvr_spm_eot_state { 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] uint64_t pbe_reg_words[PVR_MAX_COLOR_ATTACHMENTS]
[ROGUE_NUM_PBESTATE_REG_WORDS]; [ROGUE_NUM_PBESTATE_REG_WORDS];
+7 -8
View File
@@ -29,13 +29,12 @@
#include <stdbool.h> #include <stdbool.h>
void pvr_uscgen_per_job_eot( /* Expects emit_count ROGUE_NUM_PBESTATE_STATE_WORDS entries */
uint32_t emit_count, void pvr_uscgen_eot(const char *name,
const uint32_t *emit_state, /* Expects emit_count * uint32_t emit_count,
ROGUE_NUM_PBESTATE_STATE_WORDS const uint32_t *emit_state,
entries */ unsigned *temps_used,
unsigned *temps_used, struct util_dynarray *binary)
struct util_dynarray *binary)
{ {
rogue_builder b; rogue_builder b;
rogue_shader *shader = rogue_shader_create(NULL, MESA_SHADER_NONE); 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_reg *state_word_1 = rogue_temp_reg(shader, 1);
rogue_backend_instr *emitpix = NULL; 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_builder_init(&b, shader);
rogue_push_block(&b); rogue_push_block(&b);
+5 -4
View File
@@ -137,10 +137,11 @@ struct pvr_tq_frag_sh_reg_layout {
/* TODO: Shader caching (not pipeline caching) support. */ /* TODO: Shader caching (not pipeline caching) support. */
void pvr_uscgen_per_job_eot(uint32_t emit_count, void pvr_uscgen_eot(const char *name,
const uint32_t *emit_state, uint32_t emit_count,
unsigned *temps_used, const uint32_t *emit_state,
struct util_dynarray *binary); unsigned *temps_used,
struct util_dynarray *binary);
void pvr_uscgen_nop(struct util_dynarray *binary); void pvr_uscgen_nop(struct util_dynarray *binary);