panfrost: Remove uncompiled_shader->active_variant

The active compiled shader (variant) is context state, it is inappropriate to
stash it on the uncompiled shader. Add compiled shader pointers to the context
and get rid of the active_variant mutation. Names from iris.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19363>
This commit is contained in:
Alyssa Rosenzweig
2022-10-14 15:44:48 -04:00
committed by Marge Bot
parent 52b4181eed
commit 7bc34fbe84
6 changed files with 55 additions and 71 deletions

View File

@@ -38,11 +38,11 @@ panfrost_blitter_save(struct panfrost_context *ctx, bool render_cond)
util_blitter_save_vertex_buffer_slot(blitter, ctx->vertex_buffers);
util_blitter_save_vertex_elements(blitter, ctx->vertex);
util_blitter_save_vertex_shader(blitter, ctx->shader[PIPE_SHADER_VERTEX]);
util_blitter_save_vertex_shader(blitter, ctx->uncompiled[PIPE_SHADER_VERTEX]);
util_blitter_save_rasterizer(blitter, ctx->rasterizer);
util_blitter_save_viewport(blitter, &ctx->pipe_viewport);
util_blitter_save_scissor(blitter, &ctx->scissor);
util_blitter_save_fragment_shader(blitter, ctx->shader[PIPE_SHADER_FRAGMENT]);
util_blitter_save_fragment_shader(blitter, ctx->uncompiled[PIPE_SHADER_FRAGMENT]);
util_blitter_save_blend(blitter, ctx->blend);
util_blitter_save_depth_stencil_alpha(blitter, ctx->depth_stencil);
util_blitter_save_stencil_ref(blitter, &ctx->stencil_ref);

View File

@@ -402,7 +402,7 @@ panfrost_emit_blend(struct panfrost_batch *batch, void *rts, mali_ptr *blend_sha
#if PAN_ARCH >= 6
const struct panfrost_device *dev = pan_device(ctx->base.screen);
struct panfrost_compiled_shader *fs =
panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
ctx->prog[PIPE_SHADER_FRAGMENT];
/* Words 2 and 3: Internal blend */
if (blend_shaders[i]) {
@@ -481,7 +481,7 @@ pan_allow_forward_pixel_to_kill(struct panfrost_context *ctx, struct panfrost_co
static mali_ptr
panfrost_emit_compute_shader_meta(struct panfrost_batch *batch, enum pipe_shader_type stage)
{
struct panfrost_compiled_shader *ss = panfrost_get_shader_state(batch->ctx, stage);
struct panfrost_compiled_shader *ss = batch->ctx->prog[stage];
panfrost_batch_add_bo(batch, ss->bin.bo, PIPE_SHADER_VERTEX);
panfrost_batch_add_bo(batch, ss->state.bo, PIPE_SHADER_VERTEX);
@@ -526,7 +526,7 @@ panfrost_prepare_fs_state(struct panfrost_context *ctx,
{
struct pipe_rasterizer_state *rast = &ctx->rasterizer->base;
const struct panfrost_zsa_state *zsa = ctx->depth_stencil;
struct panfrost_compiled_shader *fs = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
struct panfrost_compiled_shader *fs = ctx->prog[PIPE_SHADER_FRAGMENT];
struct panfrost_blend_state *so = ctx->blend;
bool alpha_to_coverage = ctx->blend->base.alpha_to_coverage;
bool msaa = rast->multisample;
@@ -661,7 +661,7 @@ panfrost_emit_frag_shader(struct panfrost_context *ctx,
const struct panfrost_zsa_state *zsa = ctx->depth_stencil;
const struct panfrost_rasterizer *rast = ctx->rasterizer;
struct panfrost_compiled_shader *fs =
panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
ctx->prog[PIPE_SHADER_FRAGMENT];
/* We need to merge several several partial renderer state descriptors,
* so stage to temporary storage rather than reading back write-combine
@@ -705,7 +705,7 @@ static mali_ptr
panfrost_emit_frag_shader_meta(struct panfrost_batch *batch)
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_compiled_shader *ss = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
struct panfrost_compiled_shader *ss = ctx->prog[PIPE_SHADER_FRAGMENT];
panfrost_batch_add_bo(batch, ss->bin.bo, PIPE_SHADER_FRAGMENT);
@@ -821,7 +821,7 @@ panfrost_emit_depth_stencil(struct panfrost_batch *batch)
struct panfrost_context *ctx = batch->ctx;
const struct panfrost_zsa_state *zsa = ctx->depth_stencil;
struct panfrost_rasterizer *rast = ctx->rasterizer;
struct panfrost_compiled_shader *fs = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
struct panfrost_compiled_shader *fs = ctx->prog[PIPE_SHADER_FRAGMENT];
bool back_enab = zsa->base.stencil[1].enabled;
struct panfrost_ptr T = pan_pool_alloc_desc(&batch->pool.base, DEPTH_STENCIL);
@@ -1324,7 +1324,7 @@ panfrost_upload_sysvals(struct panfrost_batch *batch,
{
unsigned buf = PAN_SYSVAL_ID(sysval);
struct panfrost_compiled_shader *vs =
panfrost_get_shader_state(batch->ctx, PIPE_SHADER_VERTEX);
batch->ctx->prog[PIPE_SHADER_VERTEX];
struct pipe_stream_output_info *so = &vs->stream_output;
unsigned stride = so->stride[buf] * 4;
@@ -1472,13 +1472,11 @@ panfrost_emit_const_buf(struct panfrost_batch *batch,
unsigned *pushed_words)
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_uncompiled_shader *all = ctx->shader[stage];
if (!all)
return 0;
struct panfrost_constant_buffer *buf = &ctx->constant_buffer[stage];
struct panfrost_compiled_shader *ss = &all->variants[all->active_variant];
struct panfrost_compiled_shader *ss = ctx->prog[stage];
if (!ss)
return 0;
/* Allocate room for the sysval and the uniforms */
size_t sys_size = sizeof(float) * 4 * ss->info.sysvals.sysval_count;
@@ -1489,7 +1487,7 @@ panfrost_emit_const_buf(struct panfrost_batch *batch,
panfrost_upload_sysvals(batch, &transfer, ss, stage);
/* Next up, attach UBOs. UBO count includes gaps but no sysval UBO */
struct panfrost_compiled_shader *shader = panfrost_get_shader_state(ctx, stage);
struct panfrost_compiled_shader *shader = ctx->prog[stage];
unsigned ubo_count = shader->info.ubo_count - (sys_size ? 1 : 0);
unsigned sysval_ubo = sys_size ? ubo_count : ~0;
struct panfrost_ptr ubos = { 0 };
@@ -1621,8 +1619,7 @@ panfrost_emit_shared_memory(struct panfrost_batch *batch,
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_device *dev = pan_device(ctx->base.screen);
struct panfrost_uncompiled_shader *all = ctx->shader[PIPE_SHADER_COMPUTE];
struct panfrost_compiled_shader *ss = &all->variants[all->active_variant];
struct panfrost_compiled_shader *ss = ctx->prog[PIPE_SHADER_COMPUTE];
struct panfrost_ptr t =
pan_pool_alloc_desc(&batch->pool.base, LOCAL_STORAGE);
@@ -1970,7 +1967,7 @@ panfrost_emit_image_attribs(struct panfrost_batch *batch,
enum pipe_shader_type type)
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_compiled_shader *shader = panfrost_get_shader_state(ctx, type);
struct panfrost_compiled_shader *shader = ctx->prog[type];
if (!shader->info.attribute_count) {
*buffers = 0;
@@ -2006,7 +2003,7 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch,
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_vertex_state *so = ctx->vertex;
struct panfrost_compiled_shader *vs = panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
bool instanced = ctx->indirect_draw || ctx->instance_count > 1;
uint32_t image_mask = ctx->image_mask[PIPE_SHADER_VERTEX];
unsigned nr_images = util_last_bit(image_mask);
@@ -2558,12 +2555,9 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
mali_ptr *psiz,
bool point_coord_replace)
{
/* Load the shaders */
struct panfrost_context *ctx = batch->ctx;
struct panfrost_compiled_shader *vs, *fs;
vs = panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
fs = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
struct panfrost_compiled_shader *fs = ctx->prog[PIPE_SHADER_FRAGMENT];
uint16_t point_coord_mask = 0;
@@ -2957,7 +2951,7 @@ panfrost_update_shader_state(struct panfrost_batch *batch,
enum pipe_shader_type st)
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_compiled_shader *ss = panfrost_get_shader_state(ctx, st);
struct panfrost_compiled_shader *ss = ctx->prog[st];
bool frag = (st == PIPE_SHADER_FRAGMENT);
unsigned dirty_3d = ctx->dirty;
@@ -3113,7 +3107,7 @@ panfrost_emit_primitive(struct panfrost_context *ctx,
cfg.job_task_split = 6;
#else
struct panfrost_compiled_shader *fs =
panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
ctx->prog[PIPE_SHADER_FRAGMENT];
cfg.allow_rotating_primitives = !(lines || fs->info.bifrost.uses_flat_shading);
cfg.primitive_restart = info->primitive_restart;
@@ -3274,7 +3268,7 @@ panfrost_emit_draw(void *out,
#if PAN_ARCH >= 9
struct panfrost_compiled_shader *fs =
panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
ctx->prog[PIPE_SHADER_FRAGMENT];
cfg.multisample_enable = rast->multisample;
cfg.sample_mask = rast->multisample ? ctx->sample_mask : 0xFFFF;
@@ -3406,12 +3400,8 @@ panfrost_emit_malloc_vertex(struct panfrost_batch *batch,
void *job)
{
struct panfrost_context *ctx = batch->ctx;
struct panfrost_compiled_shader *vs =
panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
struct panfrost_compiled_shader *fs =
panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
struct panfrost_compiled_shader *fs = ctx->prog[PIPE_SHADER_FRAGMENT];
bool fs_required = panfrost_fs_required(fs, ctx->blend,
&ctx->pipe_framebuffer,
@@ -3553,17 +3543,18 @@ panfrost_launch_xfb(struct panfrost_batch *batch,
perf_debug_ctx(batch->ctx, "Emulating transform feedback");
struct panfrost_compiled_shader *vs = panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
struct panfrost_uncompiled_shader *vs_uncompiled = ctx->uncompiled[PIPE_SHADER_VERTEX];
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
struct panfrost_uncompiled_shader v = { .variants = vs->xfb };
vs->xfb->stream_output = vs->stream_output;
struct panfrost_uncompiled_shader *saved_vs = ctx->shader[PIPE_SHADER_VERTEX];
mali_ptr saved_rsd = batch->rsd[PIPE_SHADER_VERTEX];
mali_ptr saved_ubo = batch->uniform_buffers[PIPE_SHADER_VERTEX];
mali_ptr saved_push = batch->push_uniforms[PIPE_SHADER_VERTEX];
ctx->shader[PIPE_SHADER_VERTEX] = &v;
ctx->uncompiled[PIPE_SHADER_VERTEX] = &v;
ctx->prog[PIPE_SHADER_VERTEX] = vs->xfb;
batch->rsd[PIPE_SHADER_VERTEX] = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_VERTEX);
#if PAN_ARCH >= 9
@@ -3611,7 +3602,8 @@ panfrost_launch_xfb(struct panfrost_batch *batch,
panfrost_add_job(&batch->pool.base, &batch->scoreboard, job_type,
true, false, 0, 0, &t, false);
ctx->shader[PIPE_SHADER_VERTEX] = saved_vs;
ctx->uncompiled[PIPE_SHADER_VERTEX] = vs_uncompiled;
ctx->prog[PIPE_SHADER_VERTEX] = vs;
batch->rsd[PIPE_SHADER_VERTEX] = saved_rsd;
batch->uniform_buffers[PIPE_SHADER_VERTEX] = saved_ubo;
batch->push_uniforms[PIPE_SHADER_VERTEX] = saved_push;
@@ -3650,7 +3642,7 @@ panfrost_direct_draw(struct panfrost_batch *batch,
ctx->active_prim = info->mode;
ctx->drawid = drawid_offset;
struct panfrost_compiled_shader *vs = panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
bool idvs = vs->info.vs.idvs;
bool secondary_shader = vs->info.vs.secondary_enable;
@@ -3816,7 +3808,7 @@ panfrost_indirect_draw(struct panfrost_batch *batch,
ctx->drawid = drawid_offset;
ctx->indirect_draw = true;
struct panfrost_compiled_shader *vs = panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
bool idvs = vs->info.vs.idvs;
bool secondary_shader = vs->info.vs.secondary_enable;
@@ -4149,8 +4141,7 @@ panfrost_launch_grid(struct pipe_context *pipe,
cfg.samplers = batch->samplers[PIPE_SHADER_COMPUTE];
}
#else
struct panfrost_compiled_shader *cs =
&ctx->shader[PIPE_SHADER_COMPUTE]->variants[0];
struct panfrost_compiled_shader *cs = ctx->prog[PIPE_SHADER_COMPUTE];
pan_section_pack(t.cpu, COMPUTE_JOB, PAYLOAD, cfg) {
cfg.workgroup_size_x = info->block[0];

View File

@@ -87,8 +87,8 @@ panfrost_clear(
bool
panfrost_writes_point_size(struct panfrost_context *ctx)
{
assert(ctx->shader[PIPE_SHADER_VERTEX]);
struct panfrost_compiled_shader *vs = panfrost_get_shader_state(ctx, PIPE_SHADER_VERTEX);
struct panfrost_compiled_shader *vs = ctx->prog[PIPE_SHADER_VERTEX];
assert(vs != NULL);
return vs->info.vs.writes_point_size && ctx->active_prim == PIPE_PRIM_POINTS;
}
@@ -208,7 +208,7 @@ panfrost_get_blend(struct panfrost_batch *batch, unsigned rti, struct panfrost_b
PIPE_SHADER_FRAGMENT, "Blend shader");
}
struct panfrost_compiled_shader *ss = panfrost_get_shader_state(ctx, PIPE_SHADER_FRAGMENT);
struct panfrost_compiled_shader *ss = ctx->prog[PIPE_SHADER_FRAGMENT];
/* Default for Midgard */
nir_alu_type col0_type = nir_type_float32;

View File

@@ -185,9 +185,11 @@ struct panfrost_context {
struct panfrost_constant_buffer constant_buffer[PIPE_SHADER_TYPES];
struct panfrost_rasterizer *rasterizer;
struct panfrost_uncompiled_shader *shader[PIPE_SHADER_TYPES];
struct panfrost_vertex_state *vertex;
struct panfrost_uncompiled_shader *uncompiled[PIPE_SHADER_TYPES];
struct panfrost_compiled_shader *prog[PIPE_SHADER_TYPES];
struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
uint32_t vb_mask;
@@ -327,9 +329,6 @@ struct panfrost_uncompiled_shader {
* shaders for desktop GL.
*/
uint32_t fixed_varying_mask;
/* The current active variant */
unsigned active_variant;
};
/** (Vertex buffer index, divisor) tuple that will become an Attribute Buffer
@@ -363,18 +362,6 @@ pan_so_target(struct pipe_stream_output_target *target)
return (struct panfrost_streamout_target *)target;
}
static inline struct panfrost_compiled_shader *
panfrost_get_shader_state(struct panfrost_context *ctx,
enum pipe_shader_type st)
{
struct panfrost_uncompiled_shader *all = ctx->shader[st];
if (!all)
return NULL;
return &all->variants[all->active_variant];
}
struct pipe_context *
panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags);

View File

@@ -873,9 +873,8 @@ panfrost_batch_adjust_stack_size(struct panfrost_batch *batch)
struct panfrost_context *ctx = batch->ctx;
for (unsigned i = 0; i < PIPE_SHADER_TYPES; ++i) {
struct panfrost_compiled_shader *ss;
struct panfrost_compiled_shader *ss = ctx->prog[i];
ss = panfrost_get_shader_state(ctx, i);
if (!ss)
continue;

View File

@@ -138,7 +138,7 @@ panfrost_build_key(struct panfrost_context *ctx,
struct panfrost_device *dev = pan_device(ctx->base.screen);
struct pipe_framebuffer_state *fb = &ctx->pipe_framebuffer;
struct pipe_rasterizer_state *rast = (void *) ctx->rasterizer;
struct panfrost_uncompiled_shader *vs = ctx->shader[MESA_SHADER_VERTEX];
struct panfrost_uncompiled_shader *vs = ctx->uncompiled[MESA_SHADER_VERTEX];
key->fs.nr_cbufs = fb->nr_cbufs;
@@ -262,7 +262,8 @@ panfrost_bind_shader_state(
enum pipe_shader_type type)
{
struct panfrost_context *ctx = pan_context(pctx);
ctx->shader[type] = hwcso;
ctx->uncompiled[type] = hwcso;
ctx->prog[type] = NULL;
ctx->dirty |= PAN_DIRTY_TLS_SIZE;
ctx->dirty_shader[type] |= PAN_DIRTY_STAGE_SHADER;
@@ -280,16 +281,16 @@ panfrost_update_shader_variant(struct panfrost_context *ctx,
return;
/* We need linking information, defer this */
if (type == PIPE_SHADER_FRAGMENT && !ctx->shader[PIPE_SHADER_VERTEX])
if (type == PIPE_SHADER_FRAGMENT && !ctx->uncompiled[PIPE_SHADER_VERTEX])
return;
/* Also defer, happens with GALLIUM_HUD */
if (!ctx->shader[type])
if (!ctx->uncompiled[type])
return;
/* Match the appropriate variant */
signed variant = -1;
struct panfrost_uncompiled_shader *variants = ctx->shader[type];
struct panfrost_uncompiled_shader *variants = ctx->uncompiled[type];
simple_mtx_lock(&variants->lock);
@@ -309,7 +310,7 @@ panfrost_update_shader_variant(struct panfrost_context *ctx,
if (variant == -1)
variant = panfrost_new_variant_locked(ctx, variants, &key);
variants->active_variant = variant;
ctx->prog[type] = &variants->variants[variant];
/* TODO: it would be more efficient to release the lock before
* compiling instead of after, but that can race if thread A compiles a
@@ -417,7 +418,6 @@ panfrost_create_compute_state(
so->variants = v;
so->variant_count = 1;
so->active_variant = 0;
assert(cso->ir_type == PIPE_SHADER_IR_NIR && "TGSI kernels unsupported");
@@ -432,7 +432,14 @@ static void
panfrost_bind_compute_state(struct pipe_context *pipe, void *cso)
{
struct panfrost_context *ctx = pan_context(pipe);
ctx->shader[PIPE_SHADER_COMPUTE] = cso;
struct panfrost_uncompiled_shader *uncompiled = cso;
ctx->uncompiled[PIPE_SHADER_COMPUTE] = uncompiled;
if (uncompiled)
ctx->prog[PIPE_SHADER_COMPUTE] = &uncompiled->variants[0];
else
ctx->prog[PIPE_SHADER_COMPUTE] = NULL;
}
static void