From b64bd5887ee508c5db2aa5636f955974ce0b0ed2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 21 May 2019 19:17:34 -0400 Subject: [PATCH] ac/rtld: check correct LDS max size MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Tested-by: Dieter Nützel --- src/amd/common/ac_rtld.c | 8 +++++++- src/amd/common/ac_rtld.h | 2 ++ src/gallium/drivers/radeonsi/si_shader.c | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/amd/common/ac_rtld.c b/src/amd/common/ac_rtld.c index c750dbfa9cb..18f198f8af2 100644 --- a/src/amd/common/ac_rtld.c +++ b/src/amd/common/ac_rtld.c @@ -280,7 +280,13 @@ bool ac_rtld_open(struct ac_rtld_binary *binary, util_dynarray_foreach(&binary->lds_symbols, struct ac_rtld_symbol, symbol) symbol->part_idx = ~0u; - unsigned max_lds_size = i.info->chip_class >= GFX7 ? 64 * 1024 : 32 * 1024; + unsigned max_lds_size = 64 * 1024; + + if (i.info->chip_class == GFX6 || + (i.shader_type != MESA_SHADER_COMPUTE && + i.shader_type != MESA_SHADER_FRAGMENT)) + max_lds_size = 32 * 1024; + uint64_t shared_lds_size = 0; if (!layout_symbols(binary->lds_symbols.data, i.num_shared_lds_symbols, &shared_lds_size)) goto fail; diff --git a/src/amd/common/ac_rtld.h b/src/amd/common/ac_rtld.h index b13270b181d..3f60444f85e 100644 --- a/src/amd/common/ac_rtld.h +++ b/src/amd/common/ac_rtld.h @@ -29,6 +29,7 @@ #include #include "util/u_dynarray.h" +#include "compiler/shader_enums.h" struct ac_rtld_part; struct ac_shader_config; @@ -84,6 +85,7 @@ typedef bool (*ac_rtld_get_external_symbol_cb)( struct ac_rtld_open_info { const struct radeon_info *info; struct ac_rtld_options options; + gl_shader_stage shader_type; unsigned num_parts; const char * const *elf_ptrs; /* in-memory ELF objects of each part */ diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 231cb8c1cd1..eb75e2a77a4 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -28,6 +28,7 @@ #include "tgsi/tgsi_strings.h" #include "tgsi/tgsi_util.h" #include "tgsi/tgsi_dump.h" +#include "tgsi/tgsi_from_mesa.h" #include "ac_binary.h" #include "ac_exp_param.h" @@ -5098,6 +5099,7 @@ static bool si_shader_binary_open(struct si_screen *screen, struct ac_rtld_binary *rtld) { const struct si_shader_selector *sel = shader->selector; + enum pipe_shader_type shader_type = sel ? sel->type : PIPE_SHADER_COMPUTE; const char *part_elfs[5]; size_t part_sizes[5]; unsigned num_parts = 0; @@ -5136,6 +5138,7 @@ static bool si_shader_binary_open(struct si_screen *screen, .options = { .halt_at_entry = screen->options.halt_shaders, }, + .shader_type = tgsi_processor_to_shader_stage(shader_type), .num_parts = num_parts, .elf_ptrs = part_elfs, .elf_sizes = part_sizes, -- 2.30.2