freedreno/ir3: refactor out helpers for comparing shader keys

Each of the ir3 users has *basically* the same logic for comparing the
previous and current shader key, to see which, if any, shader state
needs to be marked dirty due to shader variant change.

The difference between gen's was just that some lowering flags never get
set on certain generations.  But it doesn't really hurt to include the
extra checks (because both keys would have false).

Signed-off-by: Rob Clark <robdclark@gmail.com>
This commit is contained in:
Rob Clark 2017-04-18 10:24:38 -04:00
parent 6fb7935ded
commit 5845b20455
4 changed files with 63 additions and 79 deletions

View File

@ -100,32 +100,13 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
struct ir3_shader_key *last_key = &fd3_ctx->last_key;
if (!ir3_shader_key_equal(last_key, key)) {
if (last_key->has_per_samp || key->has_per_samp) {
if ((last_key->vsaturate_s != key->vsaturate_s) ||
(last_key->vsaturate_t != key->vsaturate_t) ||
(last_key->vsaturate_r != key->vsaturate_r))
ctx->dirty |= FD_SHADER_DIRTY_VP;
if ((last_key->fsaturate_s != key->fsaturate_s) ||
(last_key->fsaturate_t != key->fsaturate_t) ||
(last_key->fsaturate_r != key->fsaturate_r))
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (ir3_shader_key_changes_fs(last_key, key)) {
ctx->dirty |= FD_SHADER_DIRTY_FP;
}
if (last_key->vclamp_color != key->vclamp_color)
if (ir3_shader_key_changes_vs(last_key, key)) {
ctx->dirty |= FD_SHADER_DIRTY_VP;
if (last_key->fclamp_color != key->fclamp_color)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->color_two_side != key->color_two_side)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->half_precision != key->half_precision)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->ucp_enables != key->ucp_enables)
ctx->dirty |= FD_SHADER_DIRTY_FP | FD_SHADER_DIRTY_VP;
}
fd3_ctx->last_key = *key;
}

View File

@ -84,37 +84,13 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
struct ir3_shader_key *last_key = &fd4_ctx->last_key;
if (!ir3_shader_key_equal(last_key, key)) {
if (last_key->has_per_samp || key->has_per_samp) {
if ((last_key->vsaturate_s != key->vsaturate_s) ||
(last_key->vsaturate_t != key->vsaturate_t) ||
(last_key->vsaturate_r != key->vsaturate_r) ||
(last_key->vastc_srgb != key->vastc_srgb))
ctx->dirty |= FD_SHADER_DIRTY_VP;
if ((last_key->fsaturate_s != key->fsaturate_s) ||
(last_key->fsaturate_t != key->fsaturate_t) ||
(last_key->fsaturate_r != key->fsaturate_r) ||
(last_key->fastc_srgb != key->fastc_srgb))
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (ir3_shader_key_changes_fs(last_key, key)) {
ctx->dirty |= FD_SHADER_DIRTY_FP;
}
if (last_key->vclamp_color != key->vclamp_color)
if (ir3_shader_key_changes_vs(last_key, key)) {
ctx->dirty |= FD_SHADER_DIRTY_VP;
if (last_key->fclamp_color != key->fclamp_color)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->color_two_side != key->color_two_side)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->half_precision != key->half_precision)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->rasterflat != key->rasterflat)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->ucp_enables != key->ucp_enables)
ctx->dirty |= FD_SHADER_DIRTY_FP | FD_SHADER_DIRTY_VP;
}
fd4_ctx->last_key = *key;
}

View File

@ -77,37 +77,13 @@ fixup_shader_state(struct fd_context *ctx, struct ir3_shader_key *key)
struct ir3_shader_key *last_key = &fd5_ctx->last_key;
if (!ir3_shader_key_equal(last_key, key)) {
if (last_key->has_per_samp || key->has_per_samp) {
if ((last_key->vsaturate_s != key->vsaturate_s) ||
(last_key->vsaturate_t != key->vsaturate_t) ||
(last_key->vsaturate_r != key->vsaturate_r) ||
(last_key->vastc_srgb != key->vastc_srgb))
ctx->dirty |= FD_SHADER_DIRTY_VP;
if ((last_key->fsaturate_s != key->fsaturate_s) ||
(last_key->fsaturate_t != key->fsaturate_t) ||
(last_key->fsaturate_r != key->fsaturate_r) ||
(last_key->fastc_srgb != key->fastc_srgb))
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (ir3_shader_key_changes_fs(last_key, key)) {
ctx->dirty |= FD_SHADER_DIRTY_FP;
}
if (last_key->vclamp_color != key->vclamp_color)
if (ir3_shader_key_changes_vs(last_key, key)) {
ctx->dirty |= FD_SHADER_DIRTY_VP;
if (last_key->fclamp_color != key->fclamp_color)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->color_two_side != key->color_two_side)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->half_precision != key->half_precision)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->rasterflat != key->rasterflat)
ctx->dirty |= FD_SHADER_DIRTY_FP;
if (last_key->ucp_enables != key->ucp_enables)
ctx->dirty |= FD_SHADER_DIRTY_FP | FD_SHADER_DIRTY_VP;
}
fd5_ctx->last_key = *key;
}

View File

@ -105,6 +105,57 @@ ir3_shader_key_equal(struct ir3_shader_key *a, struct ir3_shader_key *b)
return a->global == b->global;
}
/* will the two keys produce different lowering for a fragment shader? */
static inline bool
ir3_shader_key_changes_fs(struct ir3_shader_key *key, struct ir3_shader_key *last_key)
{
if (last_key->has_per_samp || key->has_per_samp) {
if ((last_key->fsaturate_s != key->fsaturate_s) ||
(last_key->fsaturate_t != key->fsaturate_t) ||
(last_key->fsaturate_r != key->fsaturate_r) ||
(last_key->fastc_srgb != key->fastc_srgb))
return true;
}
if (last_key->fclamp_color != key->fclamp_color)
return true;
if (last_key->color_two_side != key->color_two_side)
return true;
if (last_key->half_precision != key->half_precision)
return true;
if (last_key->rasterflat != key->rasterflat)
return true;
if (last_key->ucp_enables != key->ucp_enables)
return true;
return false;
}
/* will the two keys produce different lowering for a vertex shader? */
static inline bool
ir3_shader_key_changes_vs(struct ir3_shader_key *key, struct ir3_shader_key *last_key)
{
if (last_key->has_per_samp || key->has_per_samp) {
if ((last_key->vsaturate_s != key->vsaturate_s) ||
(last_key->vsaturate_t != key->vsaturate_t) ||
(last_key->vsaturate_r != key->vsaturate_r) ||
(last_key->vastc_srgb != key->vastc_srgb))
return true;
}
if (last_key->vclamp_color != key->vclamp_color)
return true;
if (last_key->ucp_enables != key->ucp_enables)
return true;
return false;
}
struct ir3_shader_variant {
struct fd_bo *bo;