From fb56a162a960b070c1007b2257fdf8277793b586 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 16 Aug 2019 16:21:45 -0700 Subject: [PATCH] panfrost: Set workgroups z to 32 for non-instanced graphics This is a blob quirk; in so much as I know, the hardware doesn't care. But we're trying to be bit-identical to take as much entropy out of traces as possible, so let's introduce the quirk. Signed-off-by: Alyssa Rosenzweig --- src/gallium/drivers/panfrost/pan_compute.c | 2 +- src/panfrost/encoder/pan_encoder.h | 3 ++- src/panfrost/encoder/pan_invocation.c | 12 ++++++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_compute.c b/src/gallium/drivers/panfrost/pan_compute.c index d0b2e132295..50e70cd8298 100644 --- a/src/gallium/drivers/panfrost/pan_compute.c +++ b/src/gallium/drivers/panfrost/pan_compute.c @@ -119,7 +119,7 @@ panfrost_launch_grid(struct pipe_context *pipe, panfrost_pack_work_groups_compute(&payload->prefix, info->grid[0], info->grid[1], info->grid[2], - info->block[0], info->block[1], info->block[2]); + info->block[0], info->block[1], info->block[2], false); /* Upload the payload */ diff --git a/src/panfrost/encoder/pan_encoder.h b/src/panfrost/encoder/pan_encoder.h index 4d8ab61e46d..aba3ebacf2c 100644 --- a/src/panfrost/encoder/pan_encoder.h +++ b/src/panfrost/encoder/pan_encoder.h @@ -39,7 +39,8 @@ panfrost_pack_work_groups_compute( unsigned num_z, unsigned size_x, unsigned size_y, - unsigned size_z); + unsigned size_z, + bool quirk_graphics); void panfrost_pack_work_groups_fused( diff --git a/src/panfrost/encoder/pan_invocation.c b/src/panfrost/encoder/pan_invocation.c index 810fed3a969..96efd190d82 100644 --- a/src/panfrost/encoder/pan_invocation.c +++ b/src/panfrost/encoder/pan_invocation.c @@ -47,7 +47,8 @@ panfrost_pack_work_groups_compute( unsigned num_z, unsigned size_x, unsigned size_y, - unsigned size_z) + unsigned size_z, + bool quirk_graphics) { /* First of all, all 6 values are off-by-one (strictly positive). * Account for that, first by ensuring all values are strictly positive @@ -98,6 +99,13 @@ panfrost_pack_work_groups_compute( out->workgroups_y_shift = shifts[4]; out->workgroups_z_shift = shifts[5]; + /* Quirk: for non-instanced graphics, the blob sets workgroups_z_shift + * = 32. This doesn't appear to matter to the hardware, but it's good + * to be bit-identical. */ + + if (quirk_graphics && (num_z <= 1)) + out->workgroups_z_shift = 32; + /* Special fields */ out->workgroups_x_shift_2 = MAX2(out->workgroups_x_shift, 2); out->workgroups_x_shift_3 = out->workgroups_x_shift_2; @@ -115,7 +123,7 @@ panfrost_pack_work_groups_fused( unsigned size_y, unsigned size_z) { - panfrost_pack_work_groups_compute(vertex, num_x, num_y, num_z, size_x, size_y, size_z); + panfrost_pack_work_groups_compute(vertex, num_x, num_y, num_z, size_x, size_y, size_z, true); /* Copy results over */ tiler->invocation_count = vertex->invocation_count; -- 2.30.2