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:
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user