summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/radeonsi/si_shader.c
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2016-05-06 21:06:14 +0200
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>2016-05-10 20:14:55 +0200
commit3d21720d31a6d51702411b9aa2c0afc2639867bf (patch)
tree41057f63b784dd145e2764d65568b6be3ddb7f1a /src/gallium/drivers/radeonsi/si_shader.c
parent8623e599fc050e33a1e19bc7f5aac59bc7fa3ae3 (diff)
downloadexternal_mesa3d-3d21720d31a6d51702411b9aa2c0afc2639867bf.zip
external_mesa3d-3d21720d31a6d51702411b9aa2c0afc2639867bf.tar.gz
external_mesa3d-3d21720d31a6d51702411b9aa2c0afc2639867bf.tar.bz2
radeonsi: Set declared tessellation LDS size to hardware size.
The calculated limit gave problems on SI as it was > 32 KiB and the hardware LDS size on SI is only 32 KiB. It isn't correct anyway when processing multiple patches in a threadgroup. As we potentially have any number of patches such that the used LDS is at most the hardware LDS size, and exact size per patch is not known at compile time, this seems like the only valid bound. Signed-off-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Diffstat (limited to 'src/gallium/drivers/radeonsi/si_shader.c')
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c18
1 files changed, 2 insertions, 16 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 12ccbab..448c145 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -4944,27 +4944,13 @@ static void declare_tess_lds(struct si_shader_context *ctx)
{
struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
LLVMTypeRef i32 = ctx->radeon_bld.soa.bld_base.uint_bld.elem_type;
-
- /* This is the upper bound, maximum is 32 inputs times 32 vertices */
- unsigned vertex_data_dw_size = 32*32*4;
- unsigned patch_data_dw_size = 32*4;
- /* The formula is: TCS inputs + TCS outputs + TCS patch outputs. */
- 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;
- }
+ unsigned lds_size = ctx->screen->b.chip_class >= CIK ? 65536 : 32768;
/* The actual size is computed outside of the shader to reduce
* the number of shader variants. */
ctx->lds =
LLVMAddGlobalInAddressSpace(gallivm->module,
- LLVMArrayType(i32, lds_dwords),
+ LLVMArrayType(i32, lds_size / 4),
"tess_lds",
LOCAL_ADDR_SPACE);
}