tree-wide: replace MAYBE_UNUSED with ASSERTED
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.c
index 75f2c241d3380695894484c4b87af3a18d3822d0..5d7a30e306f89c388dd40223c86c554706420ada 100644 (file)
@@ -49,7 +49,8 @@ static const char scratch_rsrc_dword1_symbol[] =
 
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
-                              struct ac_llvm_compiler *compiler);
+                              struct ac_llvm_compiler *compiler,
+                              unsigned wave_size);
 
 static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                                 struct lp_build_tgsi_context *bld_base,
@@ -133,7 +134,7 @@ static void add_arg_assign_checked(struct si_function_info *fninfo,
                                   enum si_arg_regfile regfile, LLVMTypeRef type,
                                   LLVMValueRef *assign, unsigned idx)
 {
-       MAYBE_UNUSED unsigned actual = add_arg_assign(fninfo, regfile, type, assign);
+       ASSERTED unsigned actual = add_arg_assign(fninfo, regfile, type, assign);
        assert(actual == idx);
 }
 
@@ -2168,7 +2169,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_SUBGROUP_SIZE:
-               value = LLVMConstInt(ctx->i32, 64, 0);
+               value = LLVMConstInt(ctx->i32, ctx->ac.wave_size, 0);
                break;
 
        case TGSI_SEMANTIC_SUBGROUP_INVOCATION:
@@ -2178,8 +2179,12 @@ void si_load_system_value(struct si_shader_context *ctx,
        case TGSI_SEMANTIC_SUBGROUP_EQ_MASK:
        {
                LLVMValueRef id = ac_get_thread_id(&ctx->ac);
-               id = LLVMBuildZExt(ctx->ac.builder, id, ctx->i64, "");
-               value = LLVMBuildShl(ctx->ac.builder, LLVMConstInt(ctx->i64, 1, 0), id, "");
+               if (ctx->ac.wave_size == 64)
+                       id = LLVMBuildZExt(ctx->ac.builder, id, ctx->i64, "");
+               value = LLVMBuildShl(ctx->ac.builder,
+                                    LLVMConstInt(ctx->ac.iN_wavemask, 1, 0), id, "");
+               if (ctx->ac.wave_size == 32)
+                       value = LLVMBuildZExt(ctx->ac.builder, value, ctx->i64, "");
                value = LLVMBuildBitCast(ctx->ac.builder, value, ctx->v2i32, "");
                break;
        }
@@ -2193,16 +2198,19 @@ void si_load_system_value(struct si_shader_context *ctx,
                if (decl->Semantic.Name == TGSI_SEMANTIC_SUBGROUP_GT_MASK ||
                    decl->Semantic.Name == TGSI_SEMANTIC_SUBGROUP_LE_MASK) {
                        /* All bits set except LSB */
-                       value = LLVMConstInt(ctx->i64, -2, 0);
+                       value = LLVMConstInt(ctx->ac.iN_wavemask, -2, 0);
                } else {
                        /* All bits set */
-                       value = LLVMConstInt(ctx->i64, -1, 0);
+                       value = LLVMConstInt(ctx->ac.iN_wavemask, -1, 0);
                }
-               id = LLVMBuildZExt(ctx->ac.builder, id, ctx->i64, "");
+               if (ctx->ac.wave_size == 64)
+                       id = LLVMBuildZExt(ctx->ac.builder, id, ctx->i64, "");
                value = LLVMBuildShl(ctx->ac.builder, value, id, "");
                if (decl->Semantic.Name == TGSI_SEMANTIC_SUBGROUP_LE_MASK ||
                    decl->Semantic.Name == TGSI_SEMANTIC_SUBGROUP_LT_MASK)
                        value = LLVMBuildNot(ctx->ac.builder, value, "");
+               if (ctx->ac.wave_size == 32)
+                       value = LLVMBuildZExt(ctx->ac.builder, value, ctx->i64, "");
                value = LLVMBuildBitCast(ctx->ac.builder, value, ctx->v2i32, "");
                break;
        }
@@ -2704,7 +2712,6 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
        struct pipe_stream_output_info *so = &sel->so;
        LLVMBuilderRef builder = ctx->ac.builder;
        int i;
-       struct lp_build_if_state if_ctx;
 
        /* Get bits [22:16], i.e. (so_param >> 16) & 127; */
        LLVMValueRef so_vtx_count =
@@ -2719,7 +2726,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
        /* Emit the streamout code conditionally. This actually avoids
         * out-of-bounds buffer access. The hw tells us via the SGPR
         * (so_vtx_count) which threads are allowed to emit streamout data. */
-       lp_build_if(&if_ctx, &ctx->gallivm, can_emit);
+       ac_build_ifcc(&ctx->ac, can_emit, 6501);
        {
                /* The buffer offset is computed as follows:
                 *   ByteOffset = streamout_offset[buffer_id]*4 +
@@ -2773,7 +2780,7 @@ static void si_llvm_emit_streamout(struct si_shader_context *ctx,
                                                 &so->output[i], &outputs[reg]);
                }
        }
-       lp_build_endif(&if_ctx);
+       ac_build_endif(&ctx->ac, 6501);
 }
 
 static void si_export_param(struct si_shader_context *ctx, unsigned index,
@@ -2868,8 +2875,7 @@ static void si_vertex_color_clamping(struct si_shader_context *ctx,
        LLVMValueRef cond = LLVMGetParam(ctx->main_fn, ctx->param_vs_state_bits);
        cond = LLVMBuildTrunc(ctx->ac.builder, cond, ctx->i1, "");
 
-       struct lp_build_if_state if_ctx;
-       lp_build_if(&if_ctx, &ctx->gallivm, cond);
+       ac_build_ifcc(&ctx->ac, cond, 6502);
 
        /* Store clamped colors to alloca variables within the conditional block. */
        for (unsigned i = 0; i < noutput; i++) {
@@ -2883,7 +2889,7 @@ static void si_vertex_color_clamping(struct si_shader_context *ctx,
                                       addr[i][j]);
                }
        }
-       lp_build_endif(&if_ctx);
+       ac_build_endif(&ctx->ac, 6502);
 
        /* Load clamped colors */
        for (unsigned i = 0; i < noutput; i++) {
@@ -2964,11 +2970,11 @@ void si_llvm_export_vs(struct si_shader_context *ctx,
 
        /* Write the misc vector (point size, edgeflag, layer, viewport). */
        if (shader->selector->info.writes_psize ||
-           shader->selector->info.writes_edgeflag ||
+           shader->selector->pos_writes_edgeflag ||
            shader->selector->info.writes_viewport_index ||
            shader->selector->info.writes_layer) {
                pos_args[1].enabled_channels = shader->selector->info.writes_psize |
-                                              (shader->selector->info.writes_edgeflag << 1) |
+                                              (shader->selector->pos_writes_edgeflag << 1) |
                                               (shader->selector->info.writes_layer << 2);
 
                pos_args[1].valid_mask = 0; /* EXEC mask */
@@ -2983,7 +2989,7 @@ void si_llvm_export_vs(struct si_shader_context *ctx,
                if (shader->selector->info.writes_psize)
                        pos_args[1].out[0] = psize_value;
 
-               if (shader->selector->info.writes_edgeflag) {
+               if (shader->selector->pos_writes_edgeflag) {
                        /* The output is a float, but the hw expects an integer
                         * with the first bit containing the edge flag. */
                        edgeflag_value = LLVMBuildFPToUI(ctx->ac.builder,
@@ -3110,7 +3116,6 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
        LLVMValueRef lds_base, lds_inner, lds_outer, byteoffset, buffer;
        LLVMValueRef out[6], vec0, vec1, tf_base, inner[4], outer[4];
        unsigned stride, outer_comps, inner_comps, i, offset;
-       struct lp_build_if_state if_ctx, inner_if_ctx;
 
        /* Add a barrier before loading tess factors from LDS. */
        if (!shader->key.part.tcs.epilog.invoc0_tess_factors_are_def)
@@ -3122,9 +3127,9 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
         * This can't jump, because invocation 0 executes this. It should
         * at least mask out the loads and stores for other invocations.
         */
-       lp_build_if(&if_ctx, &ctx->gallivm,
-                   LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
-                                 invocation_id, ctx->i32_0, ""));
+       ac_build_ifcc(&ctx->ac,
+                     LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
+                                   invocation_id, ctx->i32_0, ""), 6503);
 
        /* Determine the layout of one tess factor element in the buffer. */
        switch (shader->key.part.tcs.epilog.prim_mode) {
@@ -3209,9 +3214,9 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
        byteoffset = LLVMBuildMul(ctx->ac.builder, rel_patch_id,
                                  LLVMConstInt(ctx->i32, 4 * stride, 0), "");
 
-       lp_build_if(&inner_if_ctx, &ctx->gallivm,
-                   LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
-                                 rel_patch_id, ctx->i32_0, ""));
+       ac_build_ifcc(&ctx->ac,
+                     LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ,
+                                   rel_patch_id, ctx->i32_0, ""), 6504);
 
        /* Store the dynamic HS control word. */
        offset = 0;
@@ -3223,7 +3228,7 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                offset += 4;
        }
 
-       lp_build_endif(&inner_if_ctx);
+       ac_build_endif(&ctx->ac, 6504);
 
        /* Store the tessellation factors. */
        ac_build_buffer_store_dword(&ctx->ac, buffer, vec0,
@@ -3271,7 +3276,7 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                }
        }
 
-       lp_build_endif(&if_ctx);
+       ac_build_endif(&ctx->ac, 6503);
 }
 
 static LLVMValueRef
@@ -3324,11 +3329,11 @@ static void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi,
        if (ctx->screen->info.chip_class >= GFX9) {
                LLVMBasicBlockRef blocks[2] = {
                        LLVMGetInsertBlock(builder),
-                       ctx->merged_wrap_if_state.entry_block
+                       ctx->merged_wrap_if_entry_block
                };
                LLVMValueRef values[2];
 
-               lp_build_endif(&ctx->merged_wrap_if_state);
+               ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label);
 
                values[0] = rel_patch_id;
                values[1] = LLVMGetUndef(ctx->i32);
@@ -3548,7 +3553,7 @@ static void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi,
                LLVMValueRef wave_idx = si_unpack_param(ctx, ctx->param_merged_wave_info, 24, 4);
                vertex_idx = LLVMBuildOr(ctx->ac.builder, vertex_idx,
                                         LLVMBuildMul(ctx->ac.builder, wave_idx,
-                                                     LLVMConstInt(ctx->i32, 64, false), ""), "");
+                                                     LLVMConstInt(ctx->i32, ctx->ac.wave_size, false), ""), "");
                lds_base = LLVMBuildMul(ctx->ac.builder, vertex_idx,
                                        LLVMConstInt(ctx->i32, itemsize_dw, 0), "");
        }
@@ -3612,7 +3617,7 @@ static void emit_gs_epilogue(struct si_shader_context *ctx)
                         si_get_gs_wave_id(ctx));
 
        if (ctx->screen->info.chip_class >= GFX9)
-               lp_build_endif(&ctx->merged_wrap_if_state);
+               ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label);
 }
 
 static void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi,
@@ -4186,10 +4191,15 @@ static void ballot_emit(
 
        tmp = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X);
        tmp = ac_build_ballot(&ctx->ac, tmp);
-       tmp = LLVMBuildBitCast(builder, tmp, ctx->v2i32, "");
 
-       emit_data->output[0] = LLVMBuildExtractElement(builder, tmp, ctx->i32_0, "");
-       emit_data->output[1] = LLVMBuildExtractElement(builder, tmp, ctx->i32_1, "");
+       emit_data->output[0] = LLVMBuildTrunc(builder, tmp, ctx->i32, "");
+
+       if (ctx->ac.wave_size == 32) {
+               emit_data->output[1] = ctx->i32_0;
+       } else {
+               tmp = LLVMBuildLShr(builder, tmp, LLVMConstInt(ctx->i64, 32, 0), "");
+               emit_data->output[1] = LLVMBuildTrunc(builder, tmp, ctx->i32, "");
+       }
 }
 
 static void read_lane_emit(
@@ -4253,7 +4263,6 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
 
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
        struct si_shader *shader = ctx->shader;
-       struct lp_build_if_state if_state;
        LLVMValueRef soffset = LLVMGetParam(ctx->main_fn,
                                            ctx->param_gs2vs_offset);
        LLVMValueRef gs_next_vertex;
@@ -4282,7 +4291,7 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
        if (use_kill) {
                ac_build_kill_if_false(&ctx->ac, can_emit);
        } else {
-               lp_build_if(&if_state, &ctx->gallivm, can_emit);
+               ac_build_ifcc(&ctx->ac, can_emit, 6505);
        }
 
        offset = 0;
@@ -4322,7 +4331,7 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
        }
 
        if (!use_kill)
-               lp_build_endif(&if_state);
+               ac_build_endif(&ctx->ac, 6505);
 }
 
 /* Emit one vertex from the geometry shader */
@@ -4484,10 +4493,10 @@ static unsigned si_get_max_workgroup_size(const struct si_shader *shader)
        case PIPE_SHADER_TESS_CTRL:
                /* Return this so that LLVM doesn't remove s_barrier
                 * instructions on chips where we use s_barrier. */
-               return shader->selector->screen->info.chip_class >= GFX7 ? 128 : 64;
+               return shader->selector->screen->info.chip_class >= GFX7 ? 128 : 0;
 
        case PIPE_SHADER_GEOMETRY:
-               return shader->selector->screen->info.chip_class >= GFX9 ? 128 : 64;
+               return shader->selector->screen->info.chip_class >= GFX9 ? 128 : 0;
 
        case PIPE_SHADER_COMPUTE:
                break; /* see below */
@@ -5125,14 +5134,14 @@ static void preload_ring_buffers(struct si_shader_context *ctx)
                        /* Limit on the stride field for <= GFX7. */
                        assert(stride < (1 << 14));
 
-                       num_records = 64;
+                       num_records = ctx->ac.wave_size;
 
                        ring = LLVMBuildBitCast(builder, base_ring, v2i64, "");
                        tmp = LLVMBuildExtractElement(builder, ring, ctx->i32_0, "");
                        tmp = LLVMBuildAdd(builder, tmp,
                                           LLVMConstInt(ctx->i64,
                                                        stream_offset, 0), "");
-                       stream_offset += stride * 64;
+                       stream_offset += stride * ctx->ac.wave_size;
 
                        ring = LLVMBuildInsertElement(builder, ring, tmp, ctx->i32_0, "");
                        ring = LLVMBuildBitCast(builder, ring, ctx->v4i32, "");
@@ -5212,7 +5221,6 @@ 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;
@@ -5258,7 +5266,8 @@ 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),
+                       .shader_type = tgsi_processor_to_shader_stage(sel->type),
+                       .wave_size = si_get_shader_wave_size(shader),
                        .num_parts = num_parts,
                        .elf_ptrs = part_elfs,
                        .elf_sizes = part_sizes,
@@ -5345,6 +5354,7 @@ bool si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader
 static void si_shader_dump_disassembly(struct si_screen *screen,
                                       const struct si_shader_binary *binary,
                                       enum pipe_shader_type shader_type,
+                                      unsigned wave_size,
                                       struct pipe_debug_callback *debug,
                                       const char *name, FILE *file)
 {
@@ -5353,6 +5363,7 @@ static void si_shader_dump_disassembly(struct si_screen *screen,
        if (!ac_rtld_open(&rtld_binary, (struct ac_rtld_open_info){
                        .info = &screen->info,
                        .shader_type = tgsi_processor_to_shader_stage(shader_type),
+                       .wave_size = wave_size,
                        .num_parts = 1,
                        .elf_ptrs = &binary->elf_buffer,
                        .elf_sizes = &binary->elf_size }))
@@ -5436,7 +5447,8 @@ static void si_calculate_max_simd_waves(struct si_shader *shader)
                        unsigned max_workgroup_size =
                                si_get_max_workgroup_size(shader);
                        lds_per_wave = (conf->lds_size * lds_increment) /
-                                      DIV_ROUND_UP(max_workgroup_size, 64);
+                                      DIV_ROUND_UP(max_workgroup_size,
+                                                   sscreen->compute_wave_size);
                }
                break;
        default:;
@@ -5469,6 +5481,7 @@ void si_shader_dump_stats_for_shader_db(struct si_screen *screen,
        if (screen->options.debug_disassembly)
                si_shader_dump_disassembly(screen, &shader->binary,
                                           shader->selector->type,
+                                          si_get_shader_wave_size(shader),
                                           debug, "main", NULL);
 
        pipe_debug_message(debug, SHADER_INFO,
@@ -5488,12 +5501,10 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
                                 bool check_debug_option)
 {
        const struct ac_shader_config *conf = &shader->config;
-       enum pipe_shader_type shader_type =
-               shader->selector ? shader->selector->type : PIPE_SHADER_COMPUTE;
 
        if (!check_debug_option ||
-           si_can_dump_shader(sscreen, shader_type)) {
-               if (shader_type == PIPE_SHADER_FRAGMENT) {
+           si_can_dump_shader(sscreen, shader->selector->type)) {
+               if (shader->selector->type == PIPE_SHADER_FRAGMENT) {
                        fprintf(file, "*** SHADER CONFIG ***\n"
                                "SPI_PS_INPUT_ADDR = 0x%04x\n"
                                "SPI_PS_INPUT_ENA  = 0x%04x\n",
@@ -5522,10 +5533,7 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
 
 const char *si_get_shader_name(const struct si_shader *shader)
 {
-       enum pipe_shader_type shader_type =
-               shader->selector ? shader->selector->type : PIPE_SHADER_COMPUTE;
-
-       switch (shader_type) {
+       switch (shader->selector->type) {
        case PIPE_SHADER_VERTEX:
                if (shader->key.as_es)
                        return "Vertex Shader as ES";
@@ -5564,8 +5572,7 @@ void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader,
                    struct pipe_debug_callback *debug,
                    FILE *file, bool check_debug_option)
 {
-       enum pipe_shader_type shader_type =
-               shader->selector ? shader->selector->type : PIPE_SHADER_COMPUTE;
+       enum pipe_shader_type shader_type = shader->selector->type;
 
        if (!check_debug_option ||
            si_can_dump_shader(sscreen, shader_type))
@@ -5587,23 +5594,26 @@ void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader,
        if (!check_debug_option ||
            (si_can_dump_shader(sscreen, shader_type) &&
             !(sscreen->debug_flags & DBG(NO_ASM)))) {
+               unsigned wave_size = si_get_shader_wave_size(shader);
+
                fprintf(file, "\n%s:\n", si_get_shader_name(shader));
 
                if (shader->prolog)
                        si_shader_dump_disassembly(sscreen, &shader->prolog->binary,
-                                                  shader_type, debug, "prolog", file);
+                                                  shader_type, wave_size, debug, "prolog", file);
                if (shader->previous_stage)
                        si_shader_dump_disassembly(sscreen, &shader->previous_stage->binary,
-                                                  shader_type, debug, "previous stage", file);
+                                                  shader_type, wave_size, debug, "previous stage", file);
                if (shader->prolog2)
                        si_shader_dump_disassembly(sscreen, &shader->prolog2->binary,
-                                                  shader_type, debug, "prolog2", file);
+                                                  shader_type, wave_size, debug, "prolog2", file);
 
-               si_shader_dump_disassembly(sscreen, &shader->binary, shader_type, debug, "main", file);
+               si_shader_dump_disassembly(sscreen, &shader->binary, shader_type,
+                                          wave_size, debug, "main", file);
 
                if (shader->epilog)
                        si_shader_dump_disassembly(sscreen, &shader->epilog->binary,
-                                                  shader_type, debug, "epilog", file);
+                                                  shader_type, wave_size, debug, "epilog", file);
                fprintf(file, "\n");
        }
 
@@ -5617,6 +5627,7 @@ static int si_compile_llvm(struct si_screen *sscreen,
                           LLVMModuleRef mod,
                           struct pipe_debug_callback *debug,
                           enum pipe_shader_type shader_type,
+                          unsigned wave_size,
                           const char *name,
                           bool less_optimized)
 {
@@ -5640,7 +5651,7 @@ static int si_compile_llvm(struct si_screen *sscreen,
 
        if (!si_replace_shader(count, binary)) {
                unsigned r = si_llvm_compile(mod, binary, compiler, debug,
-                                            less_optimized);
+                                            less_optimized, wave_size);
                if (r)
                        return r;
        }
@@ -5649,6 +5660,7 @@ static int si_compile_llvm(struct si_screen *sscreen,
        if (!ac_rtld_open(&rtld, (struct ac_rtld_open_info){
                        .info = &sscreen->info,
                        .shader_type = tgsi_processor_to_shader_stage(shader_type),
+                       .wave_size = wave_size,
                        .num_parts = 1,
                        .elf_ptrs = &binary->elf_buffer,
                        .elf_sizes = &binary->elf_size }))
@@ -5710,7 +5722,8 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        shader->selector = gs_selector;
        shader->is_gs_copy_shader = true;
 
-       si_init_shader_ctx(&ctx, sscreen, compiler);
+       si_init_shader_ctx(&ctx, sscreen, compiler,
+                          si_get_wave_size(sscreen, PIPE_SHADER_VERTEX, false, false));
        ctx.shader = shader;
        ctx.type = PIPE_SHADER_VERTEX;
 
@@ -5809,7 +5822,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        if (si_compile_llvm(sscreen, &ctx.shader->binary,
                            &ctx.shader->config, ctx.compiler,
                            ctx.ac.module,
-                           debug, PIPE_SHADER_GEOMETRY,
+                           debug, PIPE_SHADER_GEOMETRY, ctx.ac.wave_size,
                            "GS Copy Shader", false) == 0) {
                if (si_can_dump_shader(sscreen, PIPE_SHADER_GEOMETRY))
                        fprintf(stderr, "GS Copy Shader:\n");
@@ -5863,8 +5876,7 @@ static void si_dump_shader_key_vs(const struct si_shader_key *key,
 static void si_dump_shader_key(const struct si_shader *shader, FILE *f)
 {
        const struct si_shader_key *key = &shader->key;
-       enum pipe_shader_type shader_type =
-               shader->selector ? shader->selector->type : PIPE_SHADER_COMPUTE;
+       enum pipe_shader_type shader_type = shader->selector->type;
 
        fprintf(f, "SHADER KEY\n");
 
@@ -5965,11 +5977,12 @@ static void si_dump_shader_key(const struct si_shader *shader, FILE *f)
 
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
-                              struct ac_llvm_compiler *compiler)
+                              struct ac_llvm_compiler *compiler,
+                              unsigned wave_size)
 {
        struct lp_build_tgsi_context *bld_base;
 
-       si_llvm_context_init(ctx, sscreen, compiler);
+       si_llvm_context_init(ctx, sscreen, compiler, wave_size);
 
        bld_base = &ctx->bld_base;
        bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = fetch_constant;
@@ -6101,6 +6114,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
                ctx->abi.lookup_interp_param = si_nir_lookup_interp_param;
                ctx->abi.load_sample_position = load_sample_position;
                ctx->abi.load_sample_mask_in = load_sample_mask_in;
+               ctx->abi.emit_fbfetch = si_nir_emit_fbfetch;
                ctx->abi.emit_kill = si_llvm_emit_kill;
                break;
        case PIPE_SHADER_COMPUTE:
@@ -6133,9 +6147,9 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
                if (shader->key.as_ngg) {
                        for (unsigned i = 0; i < 4; ++i) {
                                ctx->gs_curprim_verts[i] =
-                                       lp_build_alloca(&ctx->gallivm, ctx->ac.i32, "");
+                                       ac_build_alloca(&ctx->ac, ctx->ac.i32, "");
                                ctx->gs_generated_prims[i] =
-                                       lp_build_alloca(&ctx->gallivm, ctx->ac.i32, "");
+                                       ac_build_alloca(&ctx->ac, ctx->ac.i32, "");
                        }
 
                        unsigned scratch_size = 8;
@@ -6155,7 +6169,8 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
                }
        }
 
-       if (shader->key.as_ngg && ctx->type != PIPE_SHADER_GEOMETRY) {
+       if (ctx->type != PIPE_SHADER_GEOMETRY &&
+           (shader->key.as_ngg && !shader->key.as_es)) {
                /* Unconditionally declare scratch space base for streamout and
                 * vertex compaction. Whether space is actually allocated is
                 * determined during linking / PM4 creation.
@@ -6202,13 +6217,13 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
                                                ctx->param_merged_wave_info, 0);
                } else if (ctx->type == PIPE_SHADER_TESS_CTRL ||
                           ctx->type == PIPE_SHADER_GEOMETRY ||
-                          shader->key.as_ngg) {
+                          (shader->key.as_ngg && !shader->key.as_es)) {
                        LLVMValueRef num_threads;
                        bool nested_barrier;
 
                        if (!shader->is_monolithic ||
                            (ctx->type == PIPE_SHADER_TESS_EVAL &&
-                            shader->key.as_ngg))
+                            (shader->key.as_ngg && !shader->key.as_es)))
                                ac_init_exec_full_mask(&ctx->ac);
 
                        if (ctx->type == PIPE_SHADER_TESS_CTRL ||
@@ -6231,7 +6246,10 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
                        LLVMValueRef ena =
                                LLVMBuildICmp(ctx->ac.builder, LLVMIntULT,
                                            ac_get_thread_id(&ctx->ac), num_threads, "");
-                       lp_build_if(&ctx->merged_wrap_if_state, &ctx->gallivm, ena);
+
+                       ctx->merged_wrap_if_entry_block = LLVMGetInsertBlock(ctx->ac.builder);
+                       ctx->merged_wrap_if_label = 11500;
+                       ac_build_ifcc(&ctx->ac, ena, ctx->merged_wrap_if_label);
 
                        if (nested_barrier) {
                                /* Execute a barrier before the second shader in
@@ -6631,11 +6649,10 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
        LLVMTypeRef function_type;
        unsigned num_first_params;
        unsigned num_out, initial_num_out;
-       MAYBE_UNUSED unsigned num_out_sgpr; /* used in debug checks */
-       MAYBE_UNUSED unsigned initial_num_out_sgpr; /* used in debug checks */
+       ASSERTED unsigned num_out_sgpr; /* used in debug checks */
+       ASSERTED unsigned initial_num_out_sgpr; /* used in debug checks */
        unsigned num_sgprs, num_vgprs;
        unsigned gprs;
-       struct lp_build_if_state if_state;
 
        si_init_function_info(&fninfo);
 
@@ -6753,7 +6770,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
        initial_num_out_sgpr = num_out_sgpr;
 
        /* Now chain the parts. */
-       LLVMValueRef ret;
+       LLVMValueRef ret = NULL;
        for (unsigned part = 0; part < num_parts; ++part) {
                LLVMValueRef in[48];
                LLVMTypeRef ret_type;
@@ -6769,7 +6786,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
                                             LLVMConstInt(ctx->i32, 0x7f, 0), "");
                        ena = LLVMBuildICmp(builder, LLVMIntULT,
                                            ac_get_thread_id(&ctx->ac), count, "");
-                       lp_build_if(&if_state, &ctx->gallivm, ena);
+                       ac_build_ifcc(&ctx->ac, ena, 6506);
                }
 
                /* Derive arguments for the next part from outputs of the
@@ -6826,7 +6843,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
 
                if (is_multi_part_shader(ctx) &&
                    part + 1 == next_shader_first_part) {
-                       lp_build_endif(&if_state);
+                       ac_build_endif(&ctx->ac, 6506);
 
                        /* The second half of the merged shader should use
                         * the inputs from the toplevel (wrapper) function,
@@ -6910,7 +6927,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                si_dump_streamout(&sel->so);
        }
 
-       si_init_shader_ctx(&ctx, sscreen, compiler);
+       si_init_shader_ctx(&ctx, sscreen, compiler, si_get_shader_wave_size(shader));
        si_llvm_context_set_tgsi(&ctx, shader);
 
        memset(shader->info.vs_output_param_offset, AC_EXP_PARAM_UNDEFINED,
@@ -7023,6 +7040,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                        memset(&gs_prolog_key, 0, sizeof(gs_prolog_key));
                        gs_prolog_key.gs_prolog.states = shader->key.part.gs.prolog;
                        gs_prolog_key.gs_prolog.is_monolithic = true;
+                       gs_prolog_key.gs_prolog.as_ngg = shader->key.as_ngg;
                        si_build_gs_prolog_function(&ctx, &gs_prolog_key);
                        gs_prolog = ctx.main_fn;
 
@@ -7030,6 +7048,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                        struct si_shader shader_es = {};
                        shader_es.selector = es;
                        shader_es.key.as_es = 1;
+                       shader_es.key.as_ngg = shader->key.as_ngg;
                        shader_es.key.mono = shader->key.mono;
                        shader_es.key.opt = shader->key.opt;
                        shader_es.is_monolithic = true;
@@ -7125,7 +7144,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 
        /* Compile to bytecode. */
        r = si_compile_llvm(sscreen, &shader->binary, &shader->config, compiler,
-                           ctx.ac.module, debug, ctx.type,
+                           ctx.ac.module, debug, ctx.type, ctx.ac.wave_size,
                            si_get_shader_name(shader),
                            si_should_optimize_less(compiler, shader->selector));
        si_llvm_dispose(&ctx);
@@ -7138,7 +7157,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
         * LLVM 3.9svn has this bug.
         */
        if (sel->type == PIPE_SHADER_COMPUTE) {
-               unsigned wave_size = 64;
+               unsigned wave_size = sscreen->compute_wave_size;
                unsigned max_vgprs = 256;
                unsigned max_sgprs = sscreen->info.chip_class >= GFX8 ? 800 : 512;
                unsigned max_sgprs_per_wave = 128;
@@ -7260,11 +7279,6 @@ si_get_shader_part(struct si_screen *sscreen,
        result->key = *key;
 
        struct si_shader shader = {};
-       struct si_shader_context ctx;
-
-       si_init_shader_ctx(&ctx, sscreen, compiler);
-       ctx.shader = &shader;
-       ctx.type = type;
 
        switch (type) {
        case PIPE_SHADER_VERTEX:
@@ -7278,6 +7292,7 @@ si_get_shader_part(struct si_screen *sscreen,
                break;
        case PIPE_SHADER_GEOMETRY:
                assert(prolog);
+               shader.key.as_ngg = key->gs_prolog.as_ngg;
                break;
        case PIPE_SHADER_FRAGMENT:
                if (prolog)
@@ -7289,13 +7304,21 @@ si_get_shader_part(struct si_screen *sscreen,
                unreachable("bad shader part");
        }
 
+       struct si_shader_context ctx;
+       si_init_shader_ctx(&ctx, sscreen, compiler,
+                          si_get_wave_size(sscreen, type, shader.key.as_ngg,
+                                           shader.key.as_es));
+       ctx.shader = &shader;
+       ctx.type = type;
+
        build(&ctx, key);
 
        /* Compile. */
        si_llvm_optimize_module(&ctx);
 
        if (si_compile_llvm(sscreen, &result->binary, &result->config, compiler,
-                           ctx.ac.module, debug, ctx.type, name, false)) {
+                           ctx.ac.module, debug, ctx.type, ctx.ac.wave_size,
+                           name, false)) {
                FREE(result);
                result = NULL;
                goto out;
@@ -7442,9 +7465,9 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                                           key->vs_prolog.num_input_sgprs + i, "");
        }
 
-       struct lp_build_if_state wrap_if_state;
        LLVMValueRef original_ret = ret;
        bool wrapped = false;
+       LLVMBasicBlockRef if_entry_block = NULL;
 
        if (key->vs_prolog.is_monolithic && key->vs_prolog.as_ngg) {
                LLVMValueRef num_threads;
@@ -7453,7 +7476,8 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                num_threads = si_unpack_param(ctx, 3, 0, 8);
                ena = LLVMBuildICmp(ctx->ac.builder, LLVMIntULT,
                                        ac_get_thread_id(&ctx->ac), num_threads, "");
-               lp_build_if(&wrap_if_state, &ctx->gallivm, ena);
+               if_entry_block = LLVMGetInsertBlock(ctx->ac.builder);
+               ac_build_ifcc(&ctx->ac, ena, 11501);
                wrapped = true;
        }
 
@@ -7513,16 +7537,16 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
        }
 
        if (wrapped) {
-               lp_build_endif(&wrap_if_state);
+               LLVMBasicBlockRef bbs[2] = {
+                       LLVMGetInsertBlock(ctx->ac.builder),
+                       if_entry_block,
+               };
+               ac_build_endif(&ctx->ac, 11501);
 
                LLVMValueRef values[2] = {
                        ret,
                        original_ret
                };
-               LLVMBasicBlockRef bbs[2] = {
-                       wrap_if_state.true_block,
-                       wrap_if_state.entry_block
-               };
                ret = ac_build_phi(&ctx->ac, LLVMTypeOf(ret), 2, values, bbs);
        }
 
@@ -7624,7 +7648,7 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
 
        /* Create the function. */
        si_create_function(ctx, "tcs_epilog", NULL, 0, &fninfo,
-                          ctx->screen->info.chip_class >= GFX7 ? 128 : 64);
+                          ctx->screen->info.chip_class >= GFX7 ? 128 : 0);
        ac_declare_lds_as_pointer(&ctx->ac);
        func = ctx->main_fn;
 
@@ -7682,10 +7706,15 @@ static bool si_shader_select_gs_parts(struct si_screen *sscreen,
                                      struct pipe_debug_callback *debug)
 {
        if (sscreen->info.chip_class >= GFX9) {
-               struct si_shader *es_main_part =
-                       shader->key.part.gs.es->main_shader_part_es;
+               struct si_shader *es_main_part;
+               enum pipe_shader_type es_type = shader->key.part.gs.es->type;
+
+               if (es_type == PIPE_SHADER_TESS_EVAL && shader->key.as_ngg)
+                       es_main_part = shader->key.part.gs.es->main_shader_part_ngg_es;
+               else
+                       es_main_part = shader->key.part.gs.es->main_shader_part_es;
 
-               if (shader->key.part.gs.es->type == PIPE_SHADER_VERTEX &&
+               if (es_type == PIPE_SHADER_VERTEX &&
                    !si_get_vs_prolog(sscreen, compiler, shader, debug, es_main_part,
                                      &shader->key.part.gs.vs_prolog))
                        return false;
@@ -7699,6 +7728,7 @@ static bool si_shader_select_gs_parts(struct si_screen *sscreen,
        union si_shader_part_key prolog_key;
        memset(&prolog_key, 0, sizeof(prolog_key));
        prolog_key.gs_prolog.states = shader->key.part.gs.prolog;
+       prolog_key.gs_prolog.as_ngg = shader->key.as_ngg;
 
        shader->prolog2 = si_get_shader_part(sscreen, &sscreen->gs_prologs,
                                            PIPE_SHADER_GEOMETRY, true,
@@ -8214,7 +8244,7 @@ static void si_fix_resource_usage(struct si_screen *sscreen,
        shader->config.num_sgprs = MAX2(shader->config.num_sgprs, min_sgprs);
 
        if (shader->selector->type == PIPE_SHADER_COMPUTE &&
-           si_get_max_workgroup_size(shader) > 64) {
+           si_get_max_workgroup_size(shader) > sscreen->compute_wave_size) {
                si_multiwave_lds_size_workaround(sscreen,
                                                 &shader->config.lds_size);
        }