panfrost: Flesh out pixel kill / zs update

Add some notes on what the useful combinations do and flesh out the
logic. Fixes fails in
dEQP-GLES31.functional.image_load_store.early_fragment_tests.*

It's still not entirely clear to me what the difference between "force
early" and "weak early" is from the driver's perspective, though I
suspect there are performance implications to getting it wrong. Follow
what the blob does in case of doubt..

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9105>
This commit is contained in:
Alyssa Rosenzweig 2021-02-16 13:23:34 -05:00 committed by Marge Bot
parent a25b9cd8d0
commit b3e3daa603
1 changed files with 46 additions and 12 deletions

View File

@ -60,6 +60,50 @@ pan_shader_prepare_midgard_rsd(const struct pan_shader_info *info,
rsd->properties.midgard.work_register_count = info->work_reg_count;
}
/* Classify a shader into the following pixel kill categories:
*
* (force early, strong early): no side effects/depth/stencil/coverage writes (force)
* (weak early, weak early): no side effects/depth/stencil/coverage writes
* (weak early, force late): no side effects/depth/stencil writes
* (force late, weak early): side effects but no depth/stencil/coverage writes
* (force late, force early): only run for side effects
* (force late, force late): depth/stencil writes
*
* Note that discard is considered a coverage write. TODO: what about
* alpha-to-coverage?
* */
#define SET_PIXEL_KILL(kill, update) do { \
rsd->properties.bifrost.pixel_kill_operation = MALI_PIXEL_KILL_## kill; \
rsd->properties.bifrost.zs_update_operation = MALI_PIXEL_KILL_## update; \
} while(0)
static inline void
pan_shader_classify_pixel_kill_coverage(const struct pan_shader_info *info,
struct MALI_RENDERER_STATE *rsd)
{
bool force_early = info->fs.early_fragment_tests;
bool sidefx = info->writes_global;
bool coverage = info->fs.writes_coverage || info->fs.can_discard;
bool depth = info->fs.writes_depth;
bool stencil = info->fs.writes_stencil;
rsd->properties.bifrost.shader_modifies_coverage = coverage;
if (force_early)
SET_PIXEL_KILL(FORCE_EARLY, STRONG_EARLY);
else if (depth || stencil || (sidefx && coverage))
SET_PIXEL_KILL(FORCE_LATE, FORCE_LATE);
else if (sidefx)
SET_PIXEL_KILL(FORCE_LATE, WEAK_EARLY);
else if (coverage)
SET_PIXEL_KILL(WEAK_EARLY, FORCE_LATE);
else
SET_PIXEL_KILL(WEAK_EARLY, WEAK_EARLY);
}
#undef SET_PIXEL_KILL
static inline void
pan_shader_prepare_bifrost_rsd(const struct pan_shader_info *info,
struct MALI_RENDERER_STATE *rsd)
@ -77,19 +121,9 @@ pan_shader_prepare_bifrost_rsd(const struct pan_shader_info *info,
break;
case MESA_SHADER_FRAGMENT:
/* Early-Z set at draw-time */
if (info->fs.writes_depth || info->fs.writes_stencil) {
rsd->properties.bifrost.zs_update_operation = MALI_PIXEL_KILL_FORCE_LATE;
rsd->properties.bifrost.pixel_kill_operation = MALI_PIXEL_KILL_FORCE_LATE;
} else if (info->fs.can_discard) {
rsd->properties.bifrost.zs_update_operation = MALI_PIXEL_KILL_FORCE_LATE;
rsd->properties.bifrost.pixel_kill_operation = MALI_PIXEL_KILL_WEAK_EARLY;
} else {
rsd->properties.bifrost.zs_update_operation = MALI_PIXEL_KILL_STRONG_EARLY;
rsd->properties.bifrost.pixel_kill_operation = MALI_PIXEL_KILL_FORCE_EARLY;
}
pan_shader_classify_pixel_kill_coverage(info, rsd);
rsd->properties.uniform_buffer_count = info->ubo_count;
rsd->properties.bifrost.shader_modifies_coverage = info->fs.can_discard;
rsd->properties.bifrost.shader_wait_dependency_6 = info->bifrost.wait_6;
rsd->properties.bifrost.shader_wait_dependency_7 = info->bifrost.wait_7;