radeonsi/nir: always lower ballot masks as 64-bit, codegen handles it
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.c
index 7bc22fcfa4f717f1ec60b5ed7eaec8b208366004..64d7ec08348f9f7454b12e2ece0351ff13c628c2 100644 (file)
@@ -49,14 +49,15 @@ 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,
+                              bool nir);
 
 static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                                 struct lp_build_tgsi_context *bld_base,
                                 struct lp_build_emit_data *emit_data);
 
-static void si_dump_shader_key(unsigned processor, const struct si_shader *shader,
-                              FILE *f);
+static void si_dump_shader_key(const struct si_shader *shader, FILE *f);
 
 static void si_build_vs_prolog_function(struct si_shader_context *ctx,
                                        union si_shader_part_key *key);
@@ -134,7 +135,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);
 }
 
@@ -189,35 +190,39 @@ unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index,
 
                assert(!"invalid generic index");
                return 0;
-       case TGSI_SEMANTIC_PSIZE:
-               return SI_MAX_IO_GENERIC + 1;
-       case TGSI_SEMANTIC_CLIPDIST:
-               assert(index <= 1);
-               return SI_MAX_IO_GENERIC + 2 + index;
        case TGSI_SEMANTIC_FOG:
-               return SI_MAX_IO_GENERIC + 4;
-       case TGSI_SEMANTIC_LAYER:
-               return SI_MAX_IO_GENERIC + 5;
-       case TGSI_SEMANTIC_VIEWPORT_INDEX:
-               return SI_MAX_IO_GENERIC + 6;
-       case TGSI_SEMANTIC_PRIMID:
-               return SI_MAX_IO_GENERIC + 7;
+               return SI_MAX_IO_GENERIC + 1;
        case TGSI_SEMANTIC_COLOR:
                assert(index < 2);
-               return SI_MAX_IO_GENERIC + 8 + index;
+               return SI_MAX_IO_GENERIC + 2 + index;
        case TGSI_SEMANTIC_BCOLOR:
                assert(index < 2);
                /* If it's a varying, COLOR and BCOLOR alias. */
                if (is_varying)
-                       return SI_MAX_IO_GENERIC + 8 + index;
+                       return SI_MAX_IO_GENERIC + 2 + index;
                else
-                       return SI_MAX_IO_GENERIC + 10 + index;
+                       return SI_MAX_IO_GENERIC + 4 + index;
        case TGSI_SEMANTIC_TEXCOORD:
                assert(index < 8);
-               STATIC_ASSERT(SI_MAX_IO_GENERIC + 12 + 8 <= 63);
-               return SI_MAX_IO_GENERIC + 12 + index;
+               return SI_MAX_IO_GENERIC + 6 + index;
+
+       /* These are rarely used between LS and HS or ES and GS. */
+       case TGSI_SEMANTIC_CLIPDIST:
+               assert(index < 2);
+               return SI_MAX_IO_GENERIC + 6 + 8 + index;
        case TGSI_SEMANTIC_CLIPVERTEX:
-               return 63;
+               return SI_MAX_IO_GENERIC + 6 + 8 + 2;
+       case TGSI_SEMANTIC_PSIZE:
+               return SI_MAX_IO_GENERIC + 6 + 8 + 3;
+
+       /* These can't be written by LS, HS, and ES. */
+       case TGSI_SEMANTIC_LAYER:
+               return SI_MAX_IO_GENERIC + 6 + 8 + 4;
+       case TGSI_SEMANTIC_VIEWPORT_INDEX:
+               return SI_MAX_IO_GENERIC + 6 + 8 + 5;
+       case TGSI_SEMANTIC_PRIMID:
+               STATIC_ASSERT(SI_MAX_IO_GENERIC + 6 + 8 + 6 <= 63);
+               return SI_MAX_IO_GENERIC + 6 + 8 + 6;
        default:
                fprintf(stderr, "invalid semantic name = %u\n", semantic_name);
                assert(!"invalid semantic name");
@@ -438,7 +443,7 @@ void si_llvm_load_input_vs(
        LLVMValueRef out[4])
 {
        const struct tgsi_shader_info *info = &ctx->shader->selector->info;
-       unsigned vs_blit_property = info->properties[TGSI_PROPERTY_VS_BLIT_SGPRS];
+       unsigned vs_blit_property = info->properties[TGSI_PROPERTY_VS_BLIT_SGPRS_AMD];
 
        if (vs_blit_property) {
                LLVMValueRef vertex_id = ctx->abi.vertex_id;
@@ -541,8 +546,7 @@ void si_llvm_load_input_vs(
                tmp = ac_build_opencoded_load_format(
                                &ctx->ac, fix_fetch.u.log_size, fix_fetch.u.num_channels_m1 + 1,
                                fix_fetch.u.format, fix_fetch.u.reverse, !opencode,
-                               t_list, vertex_index, ctx->ac.i32_0, ctx->ac.i32_0,
-                               false, false, true);
+                               t_list, vertex_index, ctx->ac.i32_0, ctx->ac.i32_0, 0, true);
                for (unsigned i = 0; i < 4; ++i)
                        out[i] = LLVMBuildExtractElement(ctx->ac.builder, tmp, LLVMConstInt(ctx->i32, i, false), "");
                return;
@@ -568,7 +572,7 @@ void si_llvm_load_input_vs(
        for (unsigned i = 0; i < num_fetches; ++i) {
                LLVMValueRef voffset = LLVMConstInt(ctx->i32, fetch_stride * i, 0);
                fetches[i] = ac_build_buffer_load_format(&ctx->ac, t_list, vertex_index, voffset,
-                                                        channels_per_fetch, false, true);
+                                                        channels_per_fetch, 0, true);
        }
 
        if (num_fetches == 1 && channels_per_fetch > 1) {
@@ -967,14 +971,14 @@ static LLVMValueRef buffer_load(struct lp_build_tgsi_context *bld_base,
 
        if (swizzle == ~0) {
                value = ac_build_buffer_load(&ctx->ac, buffer, 4, NULL, base, offset,
-                                            0, 1, 0, can_speculate, false);
+                                            0, ac_glc, can_speculate, false);
 
                return LLVMBuildBitCast(ctx->ac.builder, value, vec_type, "");
        }
 
        if (!llvm_type_is_64bit(ctx, type)) {
                value = ac_build_buffer_load(&ctx->ac, buffer, 4, NULL, base, offset,
-                                            0, 1, 0, can_speculate, false);
+                                            0, ac_glc, can_speculate, false);
 
                value = LLVMBuildBitCast(ctx->ac.builder, value, vec_type, "");
                return LLVMBuildExtractElement(ctx->ac.builder, value,
@@ -982,10 +986,10 @@ static LLVMValueRef buffer_load(struct lp_build_tgsi_context *bld_base,
        }
 
        value = ac_build_buffer_load(&ctx->ac, buffer, 1, NULL, base, offset,
-                                 swizzle * 4, 1, 0, can_speculate, false);
+                                 swizzle * 4, ac_glc, can_speculate, false);
 
        value2 = ac_build_buffer_load(&ctx->ac, buffer, 1, NULL, base, offset,
-                                  swizzle * 4 + 4, 1, 0, can_speculate, false);
+                                  swizzle * 4 + 4, ac_glc, can_speculate, false);
 
        return si_llvm_emit_fetch_64bit(bld_base, type, value, value2);
 }
@@ -1358,7 +1362,7 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
                if (reg->Register.WriteMask != 0xF && !is_tess_factor) {
                        ac_build_buffer_store_dword(&ctx->ac, buffer, value, 1,
                                                    buf_addr, base,
-                                                   4 * chan_index, 1, 0, false);
+                                                   4 * chan_index, ac_glc, false);
                }
 
                /* Write tess factors into VGPRs for the epilog. */
@@ -1378,7 +1382,7 @@ static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
                LLVMValueRef value = ac_build_gather_values(&ctx->ac,
                                                            values, 4);
                ac_build_buffer_store_dword(&ctx->ac, buffer, value, 4, buf_addr,
-                                           base, 0, 1, 0, false);
+                                           base, 0, ac_glc, false);
        }
 }
 
@@ -1486,7 +1490,7 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi,
                        ac_build_buffer_store_dword(&ctx->ac, buffer, value, 1,
                                                    addr, base,
                                                    4 * buffer_store_offset,
-                                                    1, 0, false);
+                                                    ac_glc, false);
                }
 
                /* Write tess factors into VGPRs for the epilog. */
@@ -1506,7 +1510,7 @@ static void si_nir_store_output_tcs(struct ac_shader_abi *abi,
                LLVMValueRef value = ac_build_gather_values(&ctx->ac,
                                                            values, 4);
                ac_build_buffer_store_dword(&ctx->ac, buffer, value, 4, addr,
-                                           base, 0, 1, 0, false);
+                                           base, 0, ac_glc, false);
        }
 }
 
@@ -1589,14 +1593,14 @@ LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi,
        soffset = LLVMConstInt(ctx->i32, (param * 4 + swizzle) * 256, 0);
 
        value = ac_build_buffer_load(&ctx->ac, ctx->esgs_ring, 1, ctx->i32_0,
-                                    vtx_offset, soffset, 0, 1, 0, true, false);
+                                    vtx_offset, soffset, 0, ac_glc, true, false);
        if (llvm_type_is_64bit(ctx, type)) {
                LLVMValueRef value2;
                soffset = LLVMConstInt(ctx->i32, (param * 4 + swizzle + 1) * 256, 0);
 
                value2 = ac_build_buffer_load(&ctx->ac, ctx->esgs_ring, 1,
                                              ctx->i32_0, vtx_offset, soffset,
-                                             0, 1, 0, true, false);
+                                             0, ac_glc, true, false);
                return si_llvm_emit_fetch_64bit(bld_base, type, value, value2);
        }
        return LLVMBuildBitCast(ctx->ac.builder, value, type, "");
@@ -1908,7 +1912,7 @@ static LLVMValueRef buffer_load_const(struct si_shader_context *ctx,
                                      LLVMValueRef offset)
 {
        return ac_build_buffer_load(&ctx->ac, resource, 1, NULL, offset, NULL,
-                                   0, 0, 0, true, true);
+                                   0, 0, true, true);
 }
 
 static LLVMValueRef load_sample_position(struct ac_shader_abi *abi, LLVMValueRef sample_id)
@@ -1974,12 +1978,44 @@ static LLVMValueRef load_tess_level(struct si_shader_context *ctx,
 
 }
 
+static LLVMValueRef load_tess_level_default(struct si_shader_context *ctx,
+                                           unsigned semantic_name)
+{
+       LLVMValueRef buf, slot, val[4];
+       int i, offset;
+
+       slot = LLVMConstInt(ctx->i32, SI_HS_CONST_DEFAULT_TESS_LEVELS, 0);
+       buf = LLVMGetParam(ctx->main_fn, ctx->param_rw_buffers);
+       buf = ac_build_load_to_sgpr(&ctx->ac, buf, slot);
+       offset = semantic_name == TGSI_SEMANTIC_TESS_DEFAULT_INNER_LEVEL ? 4 : 0;
+
+       for (i = 0; i < 4; i++)
+               val[i] = buffer_load_const(ctx, buf,
+                                          LLVMConstInt(ctx->i32, (offset + i) * 4, 0));
+       return ac_build_gather_values(&ctx->ac, val, 4);
+}
+
 static LLVMValueRef si_load_tess_level(struct ac_shader_abi *abi,
-                                      unsigned varying_id)
+                                      unsigned varying_id,
+                                      bool load_default_state)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        unsigned semantic_name;
 
+       if (load_default_state) {
+               switch (varying_id) {
+               case VARYING_SLOT_TESS_LEVEL_INNER:
+                       semantic_name = TGSI_SEMANTIC_TESS_DEFAULT_INNER_LEVEL;
+                       break;
+               case VARYING_SLOT_TESS_LEVEL_OUTER:
+                       semantic_name = TGSI_SEMANTIC_TESS_DEFAULT_OUTER_LEVEL;
+                       break;
+               default:
+                       unreachable("unknown tess level");
+               }
+               return load_tess_level_default(ctx, semantic_name);
+       }
+
        switch (varying_id) {
        case VARYING_SLOT_TESS_LEVEL_INNER:
                semantic_name = TGSI_SEMANTIC_TESSINNER;
@@ -2044,12 +2080,19 @@ void si_load_system_value(struct si_shader_context *ctx,
                break;
 
        case TGSI_SEMANTIC_INVOCATIONID:
-               if (ctx->type == PIPE_SHADER_TESS_CTRL)
+               if (ctx->type == PIPE_SHADER_TESS_CTRL) {
                        value = unpack_llvm_param(ctx, ctx->abi.tcs_rel_ids, 8, 5);
-               else if (ctx->type == PIPE_SHADER_GEOMETRY)
-                       value = ctx->abi.gs_invocation_id;
-               else
+               } else if (ctx->type == PIPE_SHADER_GEOMETRY) {
+                       if (ctx->screen->info.chip_class >= GFX10) {
+                               value = LLVMBuildAnd(ctx->ac.builder,
+                                                    ctx->abi.gs_invocation_id,
+                                                    LLVMConstInt(ctx->i32, 127, 0), "");
+                       } else {
+                               value = ctx->abi.gs_invocation_id;
+                       }
+               } else {
                        assert(!"INVOCATIONID not implemented");
+               }
                break;
 
        case TGSI_SEMANTIC_POSITION:
@@ -2106,23 +2149,10 @@ void si_load_system_value(struct si_shader_context *ctx,
                value = load_tess_level(ctx, decl->Semantic.Name);
                break;
 
-       case TGSI_SEMANTIC_DEFAULT_TESSOUTER_SI:
-       case TGSI_SEMANTIC_DEFAULT_TESSINNER_SI:
-       {
-               LLVMValueRef buf, slot, val[4];
-               int i, offset;
-
-               slot = LLVMConstInt(ctx->i32, SI_HS_CONST_DEFAULT_TESS_LEVELS, 0);
-               buf = LLVMGetParam(ctx->main_fn, ctx->param_rw_buffers);
-               buf = ac_build_load_to_sgpr(&ctx->ac, buf, slot);
-               offset = decl->Semantic.Name == TGSI_SEMANTIC_DEFAULT_TESSINNER_SI ? 4 : 0;
-
-               for (i = 0; i < 4; i++)
-                       val[i] = buffer_load_const(ctx, buf,
-                                                  LLVMConstInt(ctx->i32, (offset + i) * 4, 0));
-               value = ac_build_gather_values(&ctx->ac, val, 4);
+       case TGSI_SEMANTIC_TESS_DEFAULT_OUTER_LEVEL:
+       case TGSI_SEMANTIC_TESS_DEFAULT_INNER_LEVEL:
+               value = load_tess_level_default(ctx, decl->Semantic.Name);
                break;
-       }
 
        case TGSI_SEMANTIC_PRIMID:
                value = si_get_primitive_id(ctx, 0);
@@ -2159,7 +2189,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:
@@ -2169,8 +2199,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;
        }
@@ -2184,21 +2218,24 @@ 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;
        }
 
-       case TGSI_SEMANTIC_CS_USER_DATA:
+       case TGSI_SEMANTIC_CS_USER_DATA_AMD:
                value = LLVMGetParam(ctx->main_fn, ctx->param_cs_user_data);
                break;
 
@@ -2680,7 +2717,7 @@ void si_emit_streamout_output(struct si_shader_context *ctx,
                                    vdata, num_comps,
                                    so_write_offsets[buf_idx],
                                    ctx->i32_0,
-                                   stream_out->dst_offset * 4, 1, 1, false);
+                                   stream_out->dst_offset * 4, ac_glc | ac_slc, false);
 }
 
 /**
@@ -2695,7 +2732,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 =
@@ -2710,7 +2746,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 +
@@ -2764,7 +2800,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,
@@ -2859,8 +2895,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++) {
@@ -2874,7 +2909,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++) {
@@ -2955,11 +2990,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 */
@@ -2974,7 +3009,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,
@@ -3084,7 +3119,7 @@ static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
                LLVMValueRef value = lshs_lds_load(bld_base, ctx->ac.i32, ~0, lds_ptr);
 
                ac_build_buffer_store_dword(&ctx->ac, buffer, value, 4, buffer_addr,
-                                           buffer_offset, 0, 1, 0, false);
+                                           buffer_offset, 0, ac_glc, false);
        }
 }
 
@@ -3101,7 +3136,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)
@@ -3113,9 +3147,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) {
@@ -3200,9 +3234,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;
@@ -3210,21 +3244,21 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                ac_build_buffer_store_dword(&ctx->ac, buffer,
                                            LLVMConstInt(ctx->i32, 0x80000000, 0),
                                            1, ctx->i32_0, tf_base,
-                                           offset, 1, 0, false);
+                                           offset, ac_glc, false);
                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,
                                    MIN2(stride, 4), byteoffset, tf_base,
-                                   offset, 1, 0, false);
+                                   offset, ac_glc, false);
        offset += 16;
        if (vec1)
                ac_build_buffer_store_dword(&ctx->ac, buffer, vec1,
                                            stride - 4, byteoffset, tf_base,
-                                           offset, 1, 0, false);
+                                           offset, ac_glc, false);
 
        /* Store the tess factors into the offchip buffer if TES reads them. */
        if (shader->key.part.tcs.epilog.tes_reads_tess_factors) {
@@ -3247,7 +3281,7 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
 
                ac_build_buffer_store_dword(&ctx->ac, buf, outer_vec,
                                            outer_comps, tf_outer_offset,
-                                           base, 0, 1, 0, false);
+                                           base, 0, ac_glc, false);
                if (inner_comps) {
                        param_inner = si_shader_io_get_unique_index_patch(
                                              TGSI_SEMANTIC_TESSINNER, 0);
@@ -3258,11 +3292,11 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
                                    ac_build_gather_values(&ctx->ac, inner, inner_comps);
                        ac_build_buffer_store_dword(&ctx->ac, buf, inner_vec,
                                                    inner_comps, tf_inner_offset,
-                                                   base, 0, 1, 0, false);
+                                                   base, 0, ac_glc, false);
                }
        }
 
-       lp_build_endif(&if_ctx);
+       ac_build_endif(&ctx->ac, 6503);
 }
 
 static LLVMValueRef
@@ -3315,11 +3349,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);
@@ -3446,6 +3480,10 @@ static void si_set_es_return_value_for_gs(struct si_shader_context *ctx)
        ret = si_insert_input_ptr(ctx, ret,
                                  ctx->param_bindless_samplers_and_images,
                                  8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
+       if (ctx->screen->use_ngg) {
+               ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits,
+                                         8 + SI_SGPR_VS_STATE_BITS);
+       }
 
        unsigned vgpr;
        if (ctx->type == PIPE_SHADER_VERTEX)
@@ -3535,7 +3573,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), "");
        }
@@ -3569,7 +3607,7 @@ static void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi,
                                                    ctx->esgs_ring,
                                                    out_val, 1, NULL, soffset,
                                                    (4 * param + chan) * 4,
-                                                   1, 1, true);
+                                                   ac_glc | ac_slc, true);
                }
        }
 
@@ -3592,11 +3630,14 @@ static void emit_gs_epilogue(struct si_shader_context *ctx)
                return;
        }
 
+       if (ctx->screen->info.chip_class >= GFX10)
+               LLVMBuildFence(ctx->ac.builder, LLVMAtomicOrderingRelease, false, "");
+
        ac_build_sendmsg(&ctx->ac, AC_SENDMSG_GS_OP_NOP | AC_SENDMSG_GS_DONE,
                         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,
@@ -3645,7 +3686,8 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
                }
        }
 
-       if (ctx->shader->selector->so.num_outputs)
+       if (!ctx->screen->use_ngg_streamout &&
+           ctx->shader->selector->so.num_outputs)
                si_llvm_emit_streamout(ctx, outputs, i, 0);
 
        /* Export PrimitiveID. */
@@ -3896,21 +3938,20 @@ static void membar_emit(
        struct si_shader_context *ctx = si_shader_context(bld_base);
        LLVMValueRef src0 = lp_build_emit_fetch(bld_base, emit_data->inst, 0, 0);
        unsigned flags = LLVMConstIntGetZExtValue(src0);
-       unsigned waitcnt = NOOP_WAITCNT;
+       unsigned wait_flags = 0;
 
        if (flags & TGSI_MEMBAR_THREAD_GROUP)
-               waitcnt &= VM_CNT & LGKM_CNT;
+               wait_flags |= AC_WAIT_LGKM | AC_WAIT_VLOAD | AC_WAIT_VSTORE;
 
        if (flags & (TGSI_MEMBAR_ATOMIC_BUFFER |
                     TGSI_MEMBAR_SHADER_BUFFER |
                     TGSI_MEMBAR_SHADER_IMAGE))
-               waitcnt &= VM_CNT;
+               wait_flags |= AC_WAIT_VLOAD | AC_WAIT_VSTORE;
 
        if (flags & TGSI_MEMBAR_SHARED)
-               waitcnt &= LGKM_CNT;
+               wait_flags |= AC_WAIT_LGKM;
 
-       if (waitcnt != NOOP_WAITCNT)
-               ac_build_waitcnt(&ctx->ac, waitcnt);
+       ac_build_waitcnt(&ctx->ac, wait_flags);
 }
 
 static void clock_emit(
@@ -4170,10 +4211,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(
@@ -4237,7 +4283,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;
@@ -4266,7 +4311,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;
@@ -4292,7 +4337,7 @@ static void si_llvm_emit_vertex(struct ac_shader_abi *abi,
                                                    ctx->gsvs_ring[stream],
                                                    out_val, 1,
                                                    voffset, soffset, 0,
-                                                   1, 1, true);
+                                                   ac_glc | ac_slc, true);
                }
        }
 
@@ -4306,7 +4351,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 */
@@ -4360,7 +4405,7 @@ static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
         */
        if (ctx->screen->info.chip_class == GFX6 &&
            ctx->type == PIPE_SHADER_TESS_CTRL) {
-               ac_build_waitcnt(&ctx->ac, LGKM_CNT & VM_CNT);
+               ac_build_waitcnt(&ctx->ac, AC_WAIT_LGKM | AC_WAIT_VLOAD | AC_WAIT_VSTORE);
                return;
        }
 
@@ -4415,29 +4460,14 @@ void si_create_function(struct si_shader_context *ctx,
        LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
                                           "no-signed-zeros-fp-math",
                                           "true");
-
-       if (ctx->screen->debug_flags & DBG(UNSAFE_MATH)) {
-               /* These were copied from some LLVM test. */
-               LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
-                                                  "less-precise-fpmad",
-                                                  "true");
-               LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
-                                                  "no-infs-fp-math",
-                                                  "true");
-               LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
-                                                  "no-nans-fp-math",
-                                                  "true");
-               LLVMAddTargetDependentFunctionAttr(ctx->main_fn,
-                                                  "unsafe-fp-math",
-                                                  "true");
-       }
 }
 
 static void declare_streamout_params(struct si_shader_context *ctx,
                                     struct pipe_stream_output_info *so,
                                     struct si_function_info *fninfo)
 {
-       int i;
+       if (ctx->screen->use_ngg_streamout)
+               return;
 
        /* Streamout SGPRs. */
        if (so->num_outputs) {
@@ -4449,7 +4479,7 @@ static void declare_streamout_params(struct si_shader_context *ctx,
                ctx->param_streamout_write_index = add_arg(fninfo, ARG_SGPR, ctx->ac.i32);
        }
        /* A streamout buffer offset is loaded if the stride is non-zero. */
-       for (i = 0; i < 4; i++) {
+       for (int i = 0; i < 4; i++) {
                if (!so->stride[i])
                        continue;
 
@@ -4467,10 +4497,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 */
@@ -4568,10 +4598,9 @@ static void declare_vs_input_vgprs(struct si_shader_context *ctx,
                        add_arg_assign(fninfo, ARG_VGPR, ctx->i32, &ctx->abi.instance_id);
                        add_arg(fninfo, ARG_VGPR, ctx->i32); /* unused */
                }
-       } else if (ctx->screen->info.chip_class == GFX10 &&
-                  !shader->is_gs_copy_shader) {
-               add_arg(fninfo, ARG_VGPR, ctx->i32); /* user vgpr */
+       } else if (ctx->screen->info.chip_class >= GFX10) {
                add_arg(fninfo, ARG_VGPR, ctx->i32); /* user vgpr */
+               ctx->param_vs_prim_id = add_arg(fninfo, ARG_VGPR, ctx->i32); /* user vgpr or PrimID (legacy) */
                add_arg_assign(fninfo, ARG_VGPR, ctx->i32, &ctx->abi.instance_id);
        } else {
                add_arg_assign(fninfo, ARG_VGPR, ctx->i32, &ctx->abi.instance_id);
@@ -4637,7 +4666,7 @@ static void create_function(struct si_shader_context *ctx)
        unsigned num_prolog_vgprs = 0;
        unsigned type = ctx->type;
        unsigned vs_blit_property =
-               shader->selector->info.properties[TGSI_PROPERTY_VS_BLIT_SGPRS];
+               shader->selector->info.properties[TGSI_PROPERTY_VS_BLIT_SGPRS_AMD];
 
        si_init_function_info(&fninfo);
 
@@ -4953,7 +4982,7 @@ static void create_function(struct si_shader_context *ctx)
                        ctx->param_block_size = add_arg(&fninfo, ARG_SGPR, v3i32);
 
                unsigned cs_user_data_dwords =
-                       shader->selector->info.properties[TGSI_PROPERTY_CS_USER_DATA_DWORDS];
+                       shader->selector->info.properties[TGSI_PROPERTY_CS_USER_DATA_COMPONENTS_AMD];
                if (cs_user_data_dwords) {
                        ctx->param_cs_user_data = add_arg(&fninfo, ARG_SGPR,
                                                          LLVMVectorType(ctx->i32, cs_user_data_dwords));
@@ -5108,14 +5137,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, "");
@@ -5195,7 +5224,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;
@@ -5217,26 +5245,15 @@ static bool si_shader_binary_open(struct si_screen *screen,
 
        struct ac_rtld_symbol lds_symbols[2];
        unsigned num_lds_symbols = 0;
-       unsigned esgs_ring_size = 0;
-
-       if (sel && screen->info.chip_class >= GFX9 &&
-           sel->type == PIPE_SHADER_GEOMETRY && !shader->is_gs_copy_shader) {
-               esgs_ring_size = shader->gs_info.esgs_ring_size;;
-       }
 
-       if (sel && shader->key.as_ngg && sel->so.num_outputs) {
-               unsigned esgs_vertex_bytes = 4 * (4 * sel->info.num_outputs + 1);
-               esgs_ring_size = MAX2(esgs_ring_size,
-                                     shader->ngg.max_out_verts * esgs_vertex_bytes);
-       }
-
-       if (esgs_ring_size) {
+       if (sel && screen->info.chip_class >= GFX9 && !shader->is_gs_copy_shader &&
+           (sel->type == PIPE_SHADER_GEOMETRY || shader->key.as_ngg)) {
                /* We add this symbol even on LLVM <= 8 to ensure that
                 * shader->config.lds_size is set correctly below.
                 */
                struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++];
                sym->name = "esgs_ring";
-               sym->size = esgs_ring_size;
+               sym->size = shader->gs_info.esgs_ring_size;
                sym->align = 64 * 1024;
        }
 
@@ -5252,7 +5269,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,
@@ -5338,6 +5356,8 @@ 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)
 {
@@ -5345,6 +5365,8 @@ 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 }))
@@ -5428,9 +5450,11 @@ 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:;
        }
 
        /* Compute the per-SIMD wave counts. */
@@ -5458,7 +5482,10 @@ void si_shader_dump_stats_for_shader_db(struct si_screen *screen,
        const struct ac_shader_config *conf = &shader->config;
 
        if (screen->options.debug_disassembly)
-               si_shader_dump_disassembly(screen, &shader->binary, debug, "main", NULL);
+               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,
                           "Shader Stats: SGPRS: %d VGPRS: %d Code Size: %d "
@@ -5473,15 +5500,14 @@ void si_shader_dump_stats_for_shader_db(struct si_screen *screen,
 
 static void si_shader_dump_stats(struct si_screen *sscreen,
                                 struct si_shader *shader,
-                                unsigned processor,
                                 FILE *file,
                                 bool check_debug_option)
 {
        const struct ac_shader_config *conf = &shader->config;
 
        if (!check_debug_option ||
-           si_can_dump_shader(sscreen, processor)) {
-               if (processor == 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",
@@ -5508,9 +5534,9 @@ static void si_shader_dump_stats(struct si_screen *sscreen,
        }
 }
 
-const char *si_get_shader_name(const struct si_shader *shader, unsigned processor)
+const char *si_get_shader_name(const struct si_shader *shader)
 {
-       switch (processor) {
+       switch (shader->selector->type) {
        case PIPE_SHADER_VERTEX:
                if (shader->key.as_es)
                        return "Vertex Shader as ES";
@@ -5546,51 +5572,55 @@ const char *si_get_shader_name(const struct si_shader *shader, unsigned processo
 }
 
 void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader,
-                   struct pipe_debug_callback *debug, unsigned processor,
+                   struct pipe_debug_callback *debug,
                    FILE *file, bool check_debug_option)
 {
+       enum pipe_shader_type shader_type = shader->selector->type;
+
        if (!check_debug_option ||
-           si_can_dump_shader(sscreen, processor))
-               si_dump_shader_key(processor, shader, file);
+           si_can_dump_shader(sscreen, shader_type))
+               si_dump_shader_key(shader, file);
 
        if (!check_debug_option && shader->binary.llvm_ir_string) {
                if (shader->previous_stage &&
                    shader->previous_stage->binary.llvm_ir_string) {
                        fprintf(file, "\n%s - previous stage - LLVM IR:\n\n",
-                               si_get_shader_name(shader, processor));
+                               si_get_shader_name(shader));
                        fprintf(file, "%s\n", shader->previous_stage->binary.llvm_ir_string);
                }
 
                fprintf(file, "\n%s - main shader part - LLVM IR:\n\n",
-                       si_get_shader_name(shader, processor));
+                       si_get_shader_name(shader));
                fprintf(file, "%s\n", shader->binary.llvm_ir_string);
        }
 
        if (!check_debug_option ||
-           (si_can_dump_shader(sscreen, processor) &&
+           (si_can_dump_shader(sscreen, shader_type) &&
             !(sscreen->debug_flags & DBG(NO_ASM)))) {
-               fprintf(file, "\n%s:\n", si_get_shader_name(shader, processor));
+               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,
-                                                  debug, "prolog", file);
+                                                  shader_type, wave_size, debug, "prolog", file);
                if (shader->previous_stage)
                        si_shader_dump_disassembly(sscreen, &shader->previous_stage->binary,
-                                                  debug, "previous stage", file);
+                                                  shader_type, wave_size, debug, "previous stage", file);
                if (shader->prolog2)
                        si_shader_dump_disassembly(sscreen, &shader->prolog2->binary,
-                                                  debug, "prolog2", file);
+                                                  shader_type, wave_size, debug, "prolog2", file);
 
-               si_shader_dump_disassembly(sscreen, &shader->binary, 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,
-                                                  debug, "epilog", file);
+                                                  shader_type, wave_size, debug, "epilog", file);
                fprintf(file, "\n");
        }
 
-       si_shader_dump_stats(sscreen, shader, processor, file,
-                            check_debug_option);
+       si_shader_dump_stats(sscreen, shader, file, check_debug_option);
 }
 
 static int si_compile_llvm(struct si_screen *sscreen,
@@ -5599,13 +5629,14 @@ static int si_compile_llvm(struct si_screen *sscreen,
                           struct ac_llvm_compiler *compiler,
                           LLVMModuleRef mod,
                           struct pipe_debug_callback *debug,
-                          unsigned processor,
+                          enum pipe_shader_type shader_type,
+                          unsigned wave_size,
                           const char *name,
                           bool less_optimized)
 {
        unsigned count = p_atomic_inc_return(&sscreen->num_compilations);
 
-       if (si_can_dump_shader(sscreen, processor)) {
+       if (si_can_dump_shader(sscreen, shader_type)) {
                fprintf(stderr, "radeonsi: Compiling shader %d\n", count);
 
                if (!(sscreen->debug_flags & (DBG(NO_IR) | DBG(PREOPT_IR)))) {
@@ -5623,7 +5654,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;
        }
@@ -5631,6 +5662,8 @@ static int si_compile_llvm(struct si_screen *sscreen,
        struct ac_rtld_binary rtld;
        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 }))
@@ -5692,7 +5725,9 @@ 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),
+                          false);
        ctx.shader = shader;
        ctx.type = PIPE_SHADER_VERTEX;
 
@@ -5708,7 +5743,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
        /* Fetch the vertex stream ID.*/
        LLVMValueRef stream_id;
 
-       if (gs_selector->so.num_outputs)
+       if (!sscreen->use_ngg_streamout && gs_selector->so.num_outputs)
                stream_id = si_unpack_param(&ctx, ctx.param_streamout_config, 24, 2);
        else
                stream_id = ctx.i32_0;
@@ -5762,13 +5797,13 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                                        ac_build_buffer_load(&ctx.ac,
                                                             ctx.gsvs_ring[0], 1,
                                                             ctx.i32_0, voffset,
-                                                            soffset, 0, 1, 1,
+                                                            soffset, 0, ac_glc | ac_slc,
                                                             true, false);
                        }
                }
 
                /* Streamout and exports. */
-               if (gs_selector->so.num_outputs) {
+               if (!sscreen->use_ngg_streamout && gs_selector->so.num_outputs) {
                        si_llvm_emit_streamout(&ctx, outputs,
                                               gsinfo->num_outputs,
                                               stream);
@@ -5791,12 +5826,11 @@ 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");
-               si_shader_dump(sscreen, ctx.shader, debug,
-                              PIPE_SHADER_GEOMETRY, stderr, true);
+               si_shader_dump(sscreen, ctx.shader, debug, stderr, true);
 
                if (!ctx.shader->config.scratch_bytes_per_wave)
                        ok = si_shader_binary_upload(sscreen, ctx.shader, 0);
@@ -5843,19 +5877,20 @@ static void si_dump_shader_key_vs(const struct si_shader_key *key,
        fprintf(f, "}\n");
 }
 
-static void si_dump_shader_key(unsigned processor, const struct si_shader *shader,
-                              FILE *f)
+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->type;
 
        fprintf(f, "SHADER KEY\n");
 
-       switch (processor) {
+       switch (shader_type) {
        case PIPE_SHADER_VERTEX:
                si_dump_shader_key_vs(key, &key->part.vs.prolog,
                                      "part.vs.prolog", f);
                fprintf(f, "  as_es = %u\n", key->as_es);
                fprintf(f, "  as_ls = %u\n", key->as_ls);
+               fprintf(f, "  as_ngg = %u\n", key->as_ngg);
                fprintf(f, "  mono.u.vs_export_prim_id = %u\n",
                        key->mono.u.vs_export_prim_id);
                fprintf(f, "  opt.vs_as_prim_discard_cs = %u\n",
@@ -5893,6 +5928,7 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
 
        case PIPE_SHADER_TESS_EVAL:
                fprintf(f, "  as_es = %u\n", key->as_es);
+               fprintf(f, "  as_ngg = %u\n", key->as_ngg);
                fprintf(f, "  mono.u.vs_export_prim_id = %u\n",
                        key->mono.u.vs_export_prim_id);
                break;
@@ -5907,6 +5943,8 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
                                              "part.gs.vs_prolog", f);
                }
                fprintf(f, "  part.gs.prolog.tri_strip_adj_fix = %u\n", key->part.gs.prolog.tri_strip_adj_fix);
+               fprintf(f, "  part.gs.prolog.gfx9_prev_is_vs = %u\n", key->part.gs.prolog.gfx9_prev_is_vs);
+               fprintf(f, "  as_ngg = %u\n", key->as_ngg);
                break;
 
        case PIPE_SHADER_COMPUTE:
@@ -5922,6 +5960,7 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
                fprintf(f, "  part.ps.prolog.force_linear_center_interp = %u\n", key->part.ps.prolog.force_linear_center_interp);
                fprintf(f, "  part.ps.prolog.bc_optimize_for_persp = %u\n", key->part.ps.prolog.bc_optimize_for_persp);
                fprintf(f, "  part.ps.prolog.bc_optimize_for_linear = %u\n", key->part.ps.prolog.bc_optimize_for_linear);
+               fprintf(f, "  part.ps.prolog.samplemask_log_ps_iter = %u\n", key->part.ps.prolog.samplemask_log_ps_iter);
                fprintf(f, "  part.ps.epilog.spi_shader_col_format = 0x%x\n", key->part.ps.epilog.spi_shader_col_format);
                fprintf(f, "  part.ps.epilog.color_is_int8 = 0x%X\n", key->part.ps.epilog.color_is_int8);
                fprintf(f, "  part.ps.epilog.color_is_int10 = 0x%X\n", key->part.ps.epilog.color_is_int10);
@@ -5930,15 +5969,19 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
                fprintf(f, "  part.ps.epilog.alpha_to_one = %u\n", key->part.ps.epilog.alpha_to_one);
                fprintf(f, "  part.ps.epilog.poly_line_smoothing = %u\n", key->part.ps.epilog.poly_line_smoothing);
                fprintf(f, "  part.ps.epilog.clamp_color = %u\n", key->part.ps.epilog.clamp_color);
+               fprintf(f, "  mono.u.ps.interpolate_at_sample_force_center = %u\n", key->mono.u.ps.interpolate_at_sample_force_center);
+               fprintf(f, "  mono.u.ps.fbfetch_msaa = %u\n", key->mono.u.ps.fbfetch_msaa);
+               fprintf(f, "  mono.u.ps.fbfetch_is_1D = %u\n", key->mono.u.ps.fbfetch_is_1D);
+               fprintf(f, "  mono.u.ps.fbfetch_layered = %u\n", key->mono.u.ps.fbfetch_layered);
                break;
 
        default:
                assert(0);
        }
 
-       if ((processor == PIPE_SHADER_GEOMETRY ||
-            processor == PIPE_SHADER_TESS_EVAL ||
-            processor == PIPE_SHADER_VERTEX) &&
+       if ((shader_type == PIPE_SHADER_GEOMETRY ||
+            shader_type == PIPE_SHADER_TESS_EVAL ||
+            shader_type == PIPE_SHADER_VERTEX) &&
            !key->as_es && !key->as_ls) {
                fprintf(f, "  opt.kill_outputs = 0x%"PRIx64"\n", key->opt.kill_outputs);
                fprintf(f, "  opt.clip_disable = %u\n", key->opt.clip_disable);
@@ -5947,11 +5990,14 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
 
 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,
+                              bool nir)
 {
        struct lp_build_tgsi_context *bld_base;
 
-       si_llvm_context_init(ctx, sscreen, compiler);
+       si_llvm_context_init(ctx, sscreen, compiler, wave_size,
+                            nir ? 64 : wave_size);
 
        bld_base = &ctx->bld_base;
        bld_base->emit_fetch_funcs[TGSI_FILE_CONSTANT] = fetch_constant;
@@ -6047,6 +6093,7 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
        case PIPE_SHADER_TESS_CTRL:
                bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs;
                ctx->abi.load_tess_varyings = si_nir_load_tcs_varyings;
+               ctx->abi.load_tess_level = si_load_tess_level;
                bld_base->emit_fetch_funcs[TGSI_FILE_OUTPUT] = fetch_output_tcs;
                bld_base->emit_store = store_output_tcs;
                ctx->abi.store_tcs_outputs = si_nir_store_output_tcs;
@@ -6062,12 +6109,10 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx)
                ctx->abi.load_patch_vertices_in = si_load_patch_vertices_in;
                if (shader->key.as_es)
                        ctx->abi.emit_outputs = si_llvm_emit_es_epilogue;
-               else {
-                       if (shader->key.as_ngg)
-                               ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue;
-                       else
-                               ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
-               }
+               else if (shader->key.as_ngg)
+                       ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue;
+               else
+                       ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
                bld_base->emit_epilogue = si_tgsi_emit_epilogue;
                break;
        case PIPE_SHADER_GEOMETRY:
@@ -6085,6 +6130,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:
@@ -6117,9 +6163,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;
@@ -6139,7 +6185,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.
@@ -6186,13 +6233,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 ||
@@ -6215,7 +6262,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
@@ -6615,11 +6665,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);
 
@@ -6737,7 +6786,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;
@@ -6753,7 +6802,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
@@ -6810,7 +6859,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,
@@ -6885,7 +6934,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
 
        /* Dump TGSI code before doing TGSI->LLVM conversion in case the
         * conversion fails. */
-       if (si_can_dump_shader(sscreen, sel->info.processor) &&
+       if (si_can_dump_shader(sscreen, sel->type) &&
            !(sscreen->debug_flags & DBG(NO_TGSI))) {
                if (sel->tokens)
                        tgsi_dump(sel->tokens, 0);
@@ -6894,8 +6943,9 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                si_dump_streamout(&sel->so);
        }
 
-       si_init_shader_ctx(&ctx, sscreen, compiler);
-       si_llvm_context_set_tgsi(&ctx, shader);
+       si_init_shader_ctx(&ctx, sscreen, compiler, si_get_shader_wave_size(shader),
+                          sel->nir != NULL);
+       si_llvm_context_set_ir(&ctx, shader);
 
        memset(shader->info.vs_output_param_offset, AC_EXP_PARAM_UNDEFINED,
               sizeof(shader->info.vs_output_param_offset));
@@ -6952,7 +7002,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                        shader_ls.key.mono = shader->key.mono;
                        shader_ls.key.opt = shader->key.opt;
                        shader_ls.is_monolithic = true;
-                       si_llvm_context_set_tgsi(&ctx, &shader_ls);
+                       si_llvm_context_set_ir(&ctx, &shader_ls);
 
                        if (!si_compile_tgsi_main(&ctx)) {
                                si_llvm_dispose(&ctx);
@@ -7007,6 +7057,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;
 
@@ -7014,10 +7065,11 @@ 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;
-                       si_llvm_context_set_tgsi(&ctx, &shader_es);
+                       si_llvm_context_set_ir(&ctx, &shader_es);
 
                        if (!si_compile_tgsi_main(&ctx)) {
                                si_llvm_dispose(&ctx);
@@ -7109,8 +7161,8 @@ 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,
-                           si_get_shader_name(shader, 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);
        if (r) {
@@ -7122,7 +7174,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;
@@ -7244,11 +7296,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:
@@ -7262,6 +7309,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)
@@ -7273,13 +7321,22 @@ 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),
+                          false);
+       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;
@@ -7426,9 +7483,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;
@@ -7437,7 +7494,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;
        }
 
@@ -7497,16 +7555,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);
        }
 
@@ -7608,7 +7666,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;
 
@@ -7666,10 +7724,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;
@@ -7683,6 +7746,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,
@@ -8198,7 +8262,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);
        }
@@ -8288,6 +8352,7 @@ bool si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler *compil
                        shader->config.num_vgprs = MAX2(shader->config.num_vgprs,
                                                        shader->info.num_input_vgprs);
                        break;
+               default:;
                }
 
                /* Update SGPR and VGPR counts. */
@@ -8340,8 +8405,7 @@ bool si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler *compil
        }
 
        si_fix_resource_usage(sscreen, shader);
-       si_shader_dump(sscreen, shader, debug, sel->info.processor,
-                      stderr, true);
+       si_shader_dump(sscreen, shader, debug, stderr, true);
 
        /* Upload. */
        if (!si_shader_binary_upload(sscreen, shader, 0)) {