panvk: Get rid of the per-pipeline sysvals BO

This is a micro-optimization and probably not a correct one at that.
The cost involved in re-uploading the viewport is tiny compared to the
mental overhead from trying to do this juggle.

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16276>
This commit is contained in:
Jason Ekstrand 2022-04-28 15:51:51 -05:00 committed by Marge Bot
parent f0a47d8602
commit e6091cc578
4 changed files with 2 additions and 78 deletions

View file

@ -872,9 +872,7 @@ struct panvk_pipeline {
struct {
unsigned ubo_idx;
mali_ptr ubo;
struct panfrost_sysvals ids;
uint32_t dirty_mask;
} sysvals[MESA_SHADER_STAGES];
unsigned tls_size;

View file

@ -398,8 +398,7 @@ panvk_cmd_prepare_sysvals(struct panvk_cmd_buffer *cmdbuf,
for (unsigned i = 0; i < ARRAY_SIZE(desc_state->sysvals); i++) {
unsigned sysval_count = pipeline->sysvals[i].ids.sysval_count;
if (!sysval_count || pipeline->sysvals[i].ubo ||
(desc_state->sysvals[i] && !(dirty & pipeline->sysvals[i].dirty_mask)))
if (!sysval_count || desc_state->sysvals[i])
continue;
struct panfrost_ptr sysvals =

View file

@ -422,7 +422,7 @@ panvk_per_arch(emit_ubos)(const struct panvk_pipeline *pipeline,
if (!pipeline->sysvals[i].ids.sysval_count)
continue;
panvk_per_arch(emit_ubo)(pipeline->sysvals[i].ubo ? : state->sysvals[i],
panvk_per_arch(emit_ubo)(state->sysvals[i],
pipeline->sysvals[i].ids.sysval_count * 16,
&ubos[pipeline->sysvals[i].ubo_idx]);
}

View file

@ -58,7 +58,6 @@ struct panvk_pipeline_builder
struct {
uint32_t shader_offset;
uint32_t rsd_offset;
uint32_t sysvals_offset;
} stages[MESA_SHADER_STAGES];
uint32_t blend_shader_offsets[MAX_RTS];
uint32_t shader_total_size;
@ -233,41 +232,6 @@ panvk_pipeline_builder_alloc_static_state_bo(struct panvk_pipeline_builder *buil
bo_size += pan_size(VIEWPORT);
}
for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++) {
const struct panvk_shader *shader = builder->shaders[i];
if (!shader || !shader->info.sysvals.sysval_count)
continue;
bool static_sysvals = true;
for (unsigned s = 0; s < shader->info.sysvals.sysval_count; s++) {
unsigned id = shader->info.sysvals.sysvals[i];
static_sysvals &= panvk_pipeline_static_sysval(pipeline, id);
switch (PAN_SYSVAL_TYPE(id)) {
case PAN_SYSVAL_VIEWPORT_SCALE:
case PAN_SYSVAL_VIEWPORT_OFFSET:
pipeline->sysvals[i].dirty_mask |= PANVK_DYNAMIC_VIEWPORT;
break;
case PAN_SYSVAL_SSBO:
pipeline->sysvals[i].dirty_mask |= PANVK_DYNAMIC_SSBO;
break;
case PAN_SYSVAL_VERTEX_INSTANCE_OFFSETS:
pipeline->sysvals[i].dirty_mask |= PANVK_DYNAMIC_VERTEX_INSTANCE_OFFSETS;
break;
default:
break;
}
}
if (!static_sysvals) {
builder->stages[i].sysvals_offset = ~0;
continue;
}
bo_size = ALIGN_POT(bo_size, 16);
builder->stages[i].sysvals_offset = bo_size;
bo_size += shader->info.sysvals.sysval_count * 16;
}
if (bo_size) {
pipeline->state_bo =
panfrost_bo_create(pdev, bo_size, 0, "Pipeline descriptors");
@ -275,25 +239,6 @@ panvk_pipeline_builder_alloc_static_state_bo(struct panvk_pipeline_builder *buil
}
}
static void
panvk_pipeline_builder_upload_sysval(struct panvk_pipeline_builder *builder,
struct panvk_pipeline *pipeline,
unsigned id, union panvk_sysval_data *data)
{
switch (PAN_SYSVAL_TYPE(id)) {
case PAN_SYSVAL_VIEWPORT_SCALE:
panvk_sysval_upload_viewport_scale(builder->create_info.gfx->pViewportState->pViewports,
data);
break;
case PAN_SYSVAL_VIEWPORT_OFFSET:
panvk_sysval_upload_viewport_offset(builder->create_info.gfx->pViewportState->pViewports,
data);
break;
default:
unreachable("Invalid static sysval");
}
}
static void
panvk_pipeline_builder_init_sysvals(struct panvk_pipeline_builder *builder,
struct panvk_pipeline *pipeline,
@ -303,24 +248,6 @@ panvk_pipeline_builder_init_sysvals(struct panvk_pipeline_builder *builder,
pipeline->sysvals[stage].ids = shader->info.sysvals;
pipeline->sysvals[stage].ubo_idx = shader->sysval_ubo;
if (!shader->info.sysvals.sysval_count ||
builder->stages[stage].sysvals_offset == ~0)
return;
union panvk_sysval_data *static_data =
pipeline->state_bo->ptr.cpu + builder->stages[stage].sysvals_offset;
pipeline->sysvals[stage].ubo =
pipeline->state_bo->ptr.gpu + builder->stages[stage].sysvals_offset;
for (unsigned i = 0; i < shader->info.sysvals.sysval_count; i++) {
unsigned id = shader->info.sysvals.sysvals[i];
panvk_pipeline_builder_upload_sysval(builder,
pipeline,
id, &static_data[i]);
}
}
static void