radeonsi/gfx10: distinguish between merged shaders and multi-part shaders
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 17 Nov 2017 12:40:18 +0000 (13:40 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 3 Jul 2019 19:51:12 +0000 (15:51 -0400)
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/gallium/drivers/radeonsi/si_shader.c

index fdb4346f7fde32f2aa7bfb8915f061f5eb4617e2..b6410c624489da57c461f1733e2bc1c91b522e14 100644 (file)
@@ -83,7 +83,8 @@ static bool llvm_type_is_64bit(struct si_shader_context *ctx,
        return false;
 }
 
-static bool is_merged_shader(struct si_shader_context *ctx)
+/** Whether the shader runs as a combination of multiple API shaders */
+static bool is_multi_part_shader(struct si_shader_context *ctx)
 {
        if (ctx->screen->info.chip_class <= GFX8)
                return false;
@@ -94,6 +95,12 @@ static bool is_merged_shader(struct si_shader_context *ctx)
               ctx->type == PIPE_SHADER_GEOMETRY;
 }
 
+/** Whether the shader runs on a merged HW stage (LSHS or ESGS) */
+static bool is_merged_shader(struct si_shader_context *ctx)
+{
+       return ctx->shader->key.as_ngg || is_multi_part_shader(ctx);
+}
+
 void si_init_function_info(struct si_function_info *fninfo)
 {
        fninfo->num_params = 0;
@@ -6543,7 +6550,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
 
                /* Merged shaders are executed conditionally depending
                 * on the number of enabled threads passed in the input SGPRs. */
-               if (is_merged_shader(ctx) && part == 0) {
+               if (is_multi_part_shader(ctx) && part == 0) {
                        LLVMValueRef ena, count = initial[3];
 
                        count = LLVMBuildAnd(builder, count,
@@ -6605,7 +6612,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
 
                ret = ac_build_call(&ctx->ac, parts[part], in, num_params);
 
-               if (is_merged_shader(ctx) &&
+               if (is_multi_part_shader(ctx) &&
                    part + 1 == next_shader_first_part) {
                        lp_build_endif(&if_state);