amd,radeonsi: implement nir_load_force_vrs_rates_amd in driver abi
authorQiang Yu <yuq825@gmail.com>
Sat, 28 Jan 2023 08:25:11 +0000 (16:25 +0800)
committerMarge Bot <emma+marge@anholt.net>
Fri, 3 Feb 2023 12:27:43 +0000 (12:27 +0000)
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20691>

src/amd/compiler/aco_instruction_selection.cpp
src/amd/llvm/ac_nir_to_llvm.c
src/amd/vulkan/radv_nir_lower_abi.c
src/gallium/drivers/radeonsi/si_nir_lower_abi.c

index fcb61ee..7f8f581 100644 (file)
@@ -9126,11 +9126,6 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
       ctx->arg_temps[ctx->args->ac.tes_patch_id.arg_index] = get_ssa_temp(ctx, instr->src[2].ssa);
       break;
    }
-   case nir_intrinsic_load_force_vrs_rates_amd: {
-      bld.copy(Definition(get_ssa_temp(ctx, &instr->dest.ssa)),
-               get_arg(ctx, ctx->args->ac.force_vrs_rates));
-      break;
-   }
    case nir_intrinsic_load_scalar_arg_amd:
    case nir_intrinsic_load_vector_arg_amd: {
       assert(nir_intrinsic_base(instr) < ctx->args->ac.arg_count);
index cfabe42..2cfb5d0 100644 (file)
@@ -4198,9 +4198,6 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
                                                    ctx->ac.i1false,
                                                    ctx->ac.i1false}, 6, 0);
       break;
-   case nir_intrinsic_load_force_vrs_rates_amd:
-      result = ac_get_arg(&ctx->ac, ctx->args->force_vrs_rates);
-      break;
    case nir_intrinsic_load_scalar_arg_amd:
    case nir_intrinsic_load_vector_arg_amd: {
       assert(nir_intrinsic_base(instr) < AC_MAX_ARGS);
index dcded40..6ee8bd4 100644 (file)
@@ -499,6 +499,9 @@ lower_abi_instr(nir_builder *b, nir_instr *instr, void *state)
 
       break;
    }
+   case nir_intrinsic_load_force_vrs_rates_amd:
+      replacement = ac_nir_load_arg(b, &s->args->ac, s->args->ac.force_vrs_rates);
+      break;
    default:
       progress = false;
       break;
index b0684d9..f76c91d 100644 (file)
@@ -308,6 +308,31 @@ static bool lower_abi_instr(nir_builder *b, nir_instr *instr, struct lower_abi_s
       replacement =
          ac_nir_load_arg(b, &args->ac, args->ac.streamout_offset[nir_intrinsic_base(intrin)]);
       break;
+   case nir_intrinsic_load_force_vrs_rates_amd:
+      if (sel->screen->info.gfx_level >= GFX11) {
+         /* Bits [2:5] = VRS rate
+          *
+          * The range is [0, 15].
+          *
+          * If the hw doesn't support VRS 4x4, it will silently use 2x2 instead.
+          */
+         replacement = nir_imm_int(b, V_0283D0_VRS_SHADING_RATE_4X4 << 2);
+      } else {
+         /* Bits [2:3] = VRS rate X
+          * Bits [4:5] = VRS rate Y
+          *
+          * The range is [-2, 1]. Values:
+          *   1: 2x coarser shading rate in that direction.
+          *   0: normal shading rate
+          *  -1: 2x finer shading rate (sample shading, not directional)
+          *  -2: 4x finer shading rate (sample shading, not directional)
+          *
+          * Sample shading can't go above 8 samples, so both numbers can't be -2
+          * at the same time.
+          */
+         replacement = nir_imm_int(b, (1 << 2) | (1 << 4));
+      }
+      break;
    default:
       return false;
    }