panfrost: Remove dirty tracking

We never really respected it and it doesn't quite make sense for Mali
the way it was previously setup. The correct solution is to do push as
much code into CSO creation as possible.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3855>
This commit is contained in:
Alyssa Rosenzweig
2020-02-18 10:03:44 -05:00
parent fe5c5507bd
commit aed052f703
3 changed files with 6 additions and 57 deletions
@@ -154,9 +154,6 @@ panfrost_bind_blend_state(struct pipe_context *pipe,
if (screen->quirks & MIDGARD_SFBD) {
SET_BIT(ctx->fragment_shader_core.unknown2_4, MALI_NO_DITHER, !blend->dither);
}
/* Shader itself is not dirty, but the shader core is */
ctx->dirty |= PAN_DIRTY_FS;
}
static void
+6 -40
View File
@@ -177,12 +177,6 @@ panfrost_invalidate_frame(struct panfrost_context *ctx)
for (unsigned i = 0; i < PIPE_SHADER_TYPES; ++i)
ctx->payloads[i].postfix.shared_memory = 0;
if (ctx->rasterizer)
ctx->dirty |= PAN_DIRTY_RASTERIZER;
/* XXX */
ctx->dirty |= PAN_DIRTY_SAMPLERS | PAN_DIRTY_TEXTURES;
/* TODO: When does this need to be handled? */
ctx->active_queries = true;
}
@@ -846,9 +840,9 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
panfrost_emit_varying_descriptor(ctx, total_count);
}
bool msaa = ctx->rasterizer->base.multisample;
if (ctx->dirty & PAN_DIRTY_RASTERIZER) {
if (ctx->rasterizer) {
bool msaa = ctx->rasterizer->base.multisample;
ctx->payloads[PIPE_SHADER_FRAGMENT].gl_enables = ctx->rasterizer->tiler_gl_enables;
/* TODO: Sample size */
@@ -866,7 +860,7 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
panfrost_patch_shader_state(ctx, PIPE_SHADER_VERTEX);
panfrost_patch_shader_state(ctx, PIPE_SHADER_COMPUTE);
if (ctx->dirty & (PAN_DIRTY_RASTERIZER | PAN_DIRTY_VS)) {
if (ctx->shader[PIPE_SHADER_VERTEX] && ctx->shader[PIPE_SHADER_FRAGMENT]) {
/* Check if we need to link the gl_PointSize varying */
if (!panfrost_writes_point_size(ctx)) {
/* If the size is constant, write it out. Otherwise,
@@ -881,12 +875,7 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
}
}
/* TODO: Maybe dirty track FS, maybe not. For now, it's transient. */
if (ctx->shader[PIPE_SHADER_FRAGMENT])
ctx->dirty |= PAN_DIRTY_FS;
if (ctx->dirty & PAN_DIRTY_FS) {
assert(ctx->shader[PIPE_SHADER_FRAGMENT]);
if (ctx->shader[PIPE_SHADER_FRAGMENT]) {
struct panfrost_shader_state *variant = &ctx->shader[PIPE_SHADER_FRAGMENT]->variants[ctx->shader[PIPE_SHADER_FRAGMENT]->active_variant];
panfrost_patch_shader_state(ctx, PIPE_SHADER_FRAGMENT);
@@ -1034,11 +1023,8 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
if (ctx->vertex)
panfrost_stage_attributes(ctx);
if (ctx->dirty & PAN_DIRTY_SAMPLERS)
panfrost_upload_sampler_descriptors(ctx);
if (ctx->dirty & PAN_DIRTY_TEXTURES)
panfrost_upload_texture_descriptors(ctx);
panfrost_upload_sampler_descriptors(ctx);
panfrost_upload_texture_descriptors(ctx);
const struct pipe_viewport_state *vp = &ctx->pipe_viewport;
@@ -1212,8 +1198,6 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
panfrost_upload_transient(batch,
&view,
sizeof(struct mali_viewport));
ctx->dirty = 0;
}
/* Corresponds to exactly one draw, but does not submit anything */
@@ -1611,7 +1595,6 @@ panfrost_bind_rasterizer_state(
return;
ctx->rasterizer = hwcso;
ctx->dirty |= PAN_DIRTY_RASTERIZER;
ctx->fragment_shader_core.depth_units = ctx->rasterizer->base.offset_units * 2.0f;
ctx->fragment_shader_core.depth_factor = ctx->rasterizer->base.offset_scale;
@@ -1667,9 +1650,7 @@ panfrost_bind_vertex_elements_state(
void *hwcso)
{
struct panfrost_context *ctx = pan_context(pctx);
ctx->vertex = hwcso;
ctx->dirty |= PAN_DIRTY_VERTEX;
}
static void *
@@ -1801,8 +1782,6 @@ panfrost_bind_sampler_states(
/* XXX: Should upload, not just copy? */
ctx->sampler_count[shader] = num_sampler;
memcpy(ctx->samplers[shader], sampler, num_sampler * sizeof (void *));
ctx->dirty |= PAN_DIRTY_SAMPLERS;
}
static bool
@@ -1896,14 +1875,8 @@ panfrost_bind_shader_state(
enum pipe_shader_type type)
{
struct panfrost_context *ctx = pan_context(pctx);
ctx->shader[type] = hwcso;
if (type == PIPE_SHADER_FRAGMENT)
ctx->dirty |= PAN_DIRTY_FS;
else
ctx->dirty |= PAN_DIRTY_VS;
if (!hwcso) return;
/* Match the appropriate variant */
@@ -2055,9 +2028,6 @@ panfrost_set_stencil_ref(
{
struct panfrost_context *ctx = pan_context(pctx);
ctx->stencil_ref = *ref;
/* Shader core dirty */
ctx->dirty |= PAN_DIRTY_FS;
}
static enum mali_texture_type
@@ -2219,8 +2189,6 @@ panfrost_set_sampler_views(
NULL);
}
ctx->sampler_view_count[shader] = new_nr;
ctx->dirty |= PAN_DIRTY_TEXTURES;
}
static void
@@ -2334,8 +2302,6 @@ panfrost_bind_depth_stencil_state(struct pipe_context *pipe,
/* Bounds test not implemented */
assert(!depth_stencil->depth.bounds_test);
ctx->dirty |= PAN_DIRTY_FS;
}
static void
@@ -52,17 +52,6 @@ struct prim_convert_context;
#define MAX_VARYINGS 4096
//#define PAN_DIRTY_CLEAR (1 << 0)
#define PAN_DIRTY_RASTERIZER (1 << 2)
#define PAN_DIRTY_FS (1 << 3)
#define PAN_DIRTY_FRAG_CORE (PAN_DIRTY_FS) /* Dirty writes are tied */
#define PAN_DIRTY_VS (1 << 4)
#define PAN_DIRTY_VERTEX (1 << 5)
#define PAN_DIRTY_VERT_BUF (1 << 6)
//#define PAN_DIRTY_VIEWPORT (1 << 7)
#define PAN_DIRTY_SAMPLERS (1 << 8)
#define PAN_DIRTY_TEXTURES (1 << 9)
#define SET_BIT(lval, bit, cond) \
if (cond) \
lval |= (bit); \
@@ -135,9 +124,6 @@ struct panfrost_context {
struct mali_shader_meta fragment_shader_core;
/* Per-draw Dirty flags are setup like any other driver */
int dirty;
unsigned vertex_count;
unsigned instance_count;
enum pipe_prim_type active_prim;