mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 08:50:09 +01:00
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:
parent
f0a47d8602
commit
e6091cc578
4 changed files with 2 additions and 78 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue