lima: handle early-z and pixel kill better
authorVasily Khoruzhick <anarsoul@gmail.com>
Sat, 8 Feb 2020 10:05:24 +0000 (02:05 -0800)
committerMarge Bot <eric+marge@anholt.net>
Fri, 14 Feb 2020 10:03:01 +0000 (10:03 +0000)
[1] calls bit 12 of aux0 'pixel kill' which is likely forward pixel
kill described in [2]. Blob sets this bit if early-z is enabled and
blending is disabled and colormask is RGBA.

Bit 8 seems to be always enabled with bit 9 (early-z).

Let's mimic blob behavior.

[1] https://web.archive.org/web/20171026123213/http://limadriver.org/Render_State/
[2] https://community.arm.com/developer/tools-software/graphics/b/blog/posts/killing-pixels---a-new-optimization-for-shading-on-arm-mali-gpus

Reviewed-by: Andreas Baierl <ichgeh@imkreisrum.de>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3754>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3754>

src/gallium/drivers/lima/lima_draw.c

index b9dda6a446c5562f8ef51577789f5d3252790a81..2309cc6d33426f79cc07524c82bb6d6dff2f1a6e 100644 (file)
@@ -1136,6 +1136,8 @@ lima_pack_render_state(struct lima_context *ctx, const struct pipe_draw_info *in
    struct lima_render_state *render =
       lima_ctx_buff_alloc(ctx, lima_ctx_buff_pp_plb_rsw,
                           sizeof(*render));
+   bool early_z = true;
+   bool pixel_kill = true;
 
    /* do hw support RGBA independ blend?
     * PIPE_CAP_INDEP_BLEND_ENABLE
@@ -1239,15 +1241,27 @@ lima_pack_render_state(struct lima_context *ctx, const struct pipe_draw_info *in
 
    render->textures_address = 0x00000000;
 
-   /* more investigation */
-   render->aux0 = 0x00000100 | (ctx->vs->varying_stride >> 3);
+   render->aux0 = (ctx->vs->varying_stride >> 3);
    render->aux1 = 0x00001000;
    if (ctx->blend->base.dither)
       render->aux1 |= 0x00002000;
 
-   /* Enable Early-Z if shader doesn't have discard */
-   if (!fs->uses_discard)
-      render->aux0 |= 0x200;
+   if (fs->uses_discard) {
+      early_z = false;
+      pixel_kill = false;
+   }
+
+   if (rt->blend_enable)
+      pixel_kill = false;
+
+   if ((rt->colormask & PIPE_MASK_RGBA) != PIPE_MASK_RGBA)
+      pixel_kill = false;
+
+   if (early_z)
+      render->aux0 |= 0x300;
+
+   if (pixel_kill)
+      render->aux0 |= 0x1000;
 
    if (ctx->tex_stateobj.num_samplers) {
       render->textures_address =