radeonsi: workaround for tesselation on SI
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 6 May 2016 16:52:17 +0000 (11:52 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 9 May 2016 16:52:46 +0000 (11:52 -0500)
We request more than 32KB of LDS here, which SI doesn't have. Since LLVM
recently started checking the size of declared LDS allocations, all shaders
involved in tesselation fail to compile on SI.

Note that the entire calculation here seems wrong, given how we calculate
indices for generic attributes, so the number ends up wrong on CI+ as well.
A proper solution is clearly needed, but this patch should serve as a band-aid
for SI in the meantime.

Also note that the real size of the LDS allocation in hardware is independent
from what we tell LLVM, so this is really more of a "cosmetic" change.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95198
Cc: "11.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_shader.c

index 211db9f6f2fea2778e6c266f4385ad12ba480d61..12ccbab04e1813f7a919dd973a5c7568bdcc09c9 100644 (file)
@@ -4952,6 +4952,14 @@ static void declare_tess_lds(struct si_shader_context *ctx)
        unsigned patch_dw_size = vertex_data_dw_size*2 + patch_data_dw_size;
        unsigned lds_dwords = patch_dw_size;
 
+       if (ctx->screen->b.chip_class <= SI) {
+               /* This is a horrible temporary workaround to make tesselation
+                * not be completely broken on SI now that LLVM checks that
+                * the declared LDS size fits into the device maximum of 32KB.
+                */
+               lds_dwords = 8 * 1024;
+       }
+
        /* The actual size is computed outside of the shader to reduce
         * the number of shader variants. */
        ctx->lds =