radeonsi: replace TGSI_SEMANTIC with VARYING_SLOT and FRAG_RESULT
[mesa.git] / src / gallium / drivers / radeonsi / si_shader_llvm_vs.c
index 081d7fb908766b71e6bd9574d8a40521e6b18b62..83bea6cf4995ab803f8003d32b254a2f83536275 100644 (file)
@@ -132,8 +132,14 @@ static void load_input_vs(struct si_shader_context *ctx, unsigned input_index, L
       return;
    }
 
-   /* Do multiple loads for special formats. */
    unsigned required_channels = util_last_bit(info->input_usage_mask[input_index]);
+   if (required_channels == 0) {
+      for (unsigned i = 0; i < 4; ++i)
+         out[i] = LLVMGetUndef(ctx->ac.f32);
+      return;
+   }
+
+   /* Do multiple loads for special formats. */
    LLVMValueRef fetches[4];
    unsigned num_fetches;
    unsigned fetch_stride;
@@ -152,7 +158,7 @@ static void load_input_vs(struct si_shader_context *ctx, unsigned input_index, L
    for (unsigned i = 0; i < num_fetches; ++i) {
       LLVMValueRef voffset = LLVMConstInt(ctx->ac.i32, fetch_stride * i, 0);
       fetches[i] = ac_build_buffer_load_format(&ctx->ac, vb_desc, vertex_index, voffset,
-                                               channels_per_fetch, 0, true);
+                                               channels_per_fetch, 0, true, false);
    }
 
    if (num_fetches == 1 && channels_per_fetch > 1) {
@@ -219,44 +225,18 @@ static void load_input_vs(struct si_shader_context *ctx, unsigned input_index, L
       out[i] = ac_to_float(&ctx->ac, fetches[i]);
 }
 
-static void declare_input_vs(struct si_shader_context *ctx, unsigned input_index)
-{
-   LLVMValueRef input[4];
-
-   load_input_vs(ctx, input_index / 4, input);
-
-   for (unsigned chan = 0; chan < 4; chan++) {
-      ctx->inputs[input_index + chan] =
-         LLVMBuildBitCast(ctx->ac.builder, input[chan], ctx->ac.i32, "");
-   }
-}
-
 void si_llvm_load_vs_inputs(struct si_shader_context *ctx, struct nir_shader *nir)
 {
-   uint64_t processed_inputs = 0;
-
-   nir_foreach_variable (variable, &nir->inputs) {
-      unsigned attrib_count = glsl_count_attribute_slots(variable->type, true);
-      unsigned input_idx = variable->data.driver_location;
-      unsigned loc = variable->data.location;
+   const struct si_shader_info *info = &ctx->shader->selector->info;
 
-      for (unsigned i = 0; i < attrib_count; i++) {
-         /* Packed components share the same location so skip
-          * them if we have already processed the location.
-          */
-         if (processed_inputs & ((uint64_t)1 << (loc + i))) {
-            input_idx += 4;
-            continue;
-         }
+   for (unsigned i = 0; i < info->num_inputs; i++) {
+      LLVMValueRef values[4];
 
-         declare_input_vs(ctx, input_idx);
-         if (glsl_type_is_dual_slot(variable->type)) {
-            input_idx += 4;
-            declare_input_vs(ctx, input_idx);
-         }
+      load_input_vs(ctx, i, values);
 
-         processed_inputs |= ((uint64_t)1 << (loc + i));
-         input_idx += 4;
+      for (unsigned chan = 0; chan < 4; chan++) {
+         ctx->inputs[i * 4 + chan] =
+            LLVMBuildBitCast(ctx->ac.builder, values[chan], ctx->ac.i32, "");
       }
    }
 }
@@ -445,31 +425,35 @@ static void si_build_param_exports(struct si_shader_context *ctx,
    unsigned param_count = 0;
 
    for (unsigned i = 0; i < noutput; i++) {
-      unsigned semantic_name = outputs[i].semantic_name;
-      unsigned semantic_index = outputs[i].semantic_index;
+      unsigned semantic = outputs[i].semantic;
 
       if (outputs[i].vertex_stream[0] != 0 && outputs[i].vertex_stream[1] != 0 &&
           outputs[i].vertex_stream[2] != 0 && outputs[i].vertex_stream[3] != 0)
          continue;
 
-      switch (semantic_name) {
-      case TGSI_SEMANTIC_LAYER:
-      case TGSI_SEMANTIC_VIEWPORT_INDEX:
-      case TGSI_SEMANTIC_CLIPDIST:
-      case TGSI_SEMANTIC_COLOR:
-      case TGSI_SEMANTIC_BCOLOR:
-      case TGSI_SEMANTIC_PRIMID:
-      case TGSI_SEMANTIC_FOG:
-      case TGSI_SEMANTIC_TEXCOORD:
-      case TGSI_SEMANTIC_GENERIC:
+      switch (semantic) {
+      case VARYING_SLOT_LAYER:
+      case VARYING_SLOT_VIEWPORT:
+      case VARYING_SLOT_CLIP_DIST0:
+      case VARYING_SLOT_CLIP_DIST1:
+      case VARYING_SLOT_COL0:
+      case VARYING_SLOT_COL1:
+      case VARYING_SLOT_BFC0:
+      case VARYING_SLOT_BFC1:
+      case VARYING_SLOT_PRIMITIVE_ID:
+      case VARYING_SLOT_FOGC:
          break;
       default:
-         continue;
+         if ((semantic >= VARYING_SLOT_TEX0 && semantic <= VARYING_SLOT_TEX7) ||
+             semantic >= VARYING_SLOT_VAR0)
+            break;
+         else
+            continue;
       }
 
-      if ((semantic_name != TGSI_SEMANTIC_GENERIC || semantic_index < SI_MAX_IO_GENERIC) &&
+      if (semantic < VARYING_SLOT_VAR0 + SI_MAX_IO_GENERIC &&
           shader->key.opt.kill_outputs &
-             (1ull << si_shader_io_get_unique_index(semantic_name, semantic_index, true)))
+             (1ull << si_shader_io_get_unique_index(semantic, true)))
          continue;
 
       si_export_param(ctx, param_count, outputs[i].values);
@@ -496,8 +480,10 @@ static void si_vertex_color_clamping(struct si_shader_context *ctx,
 
    /* Store original colors to alloca variables. */
    for (unsigned i = 0; i < noutput; i++) {
-      if (outputs[i].semantic_name != TGSI_SEMANTIC_COLOR &&
-          outputs[i].semantic_name != TGSI_SEMANTIC_BCOLOR)
+      if (outputs[i].semantic != VARYING_SLOT_COL0 &&
+          outputs[i].semantic != VARYING_SLOT_COL1 &&
+          outputs[i].semantic != VARYING_SLOT_BFC0 &&
+          outputs[i].semantic != VARYING_SLOT_BFC1)
          continue;
 
       for (unsigned j = 0; j < 4; j++) {
@@ -518,8 +504,10 @@ static void si_vertex_color_clamping(struct si_shader_context *ctx,
 
    /* Store clamped colors to alloca variables within the conditional block. */
    for (unsigned i = 0; i < noutput; i++) {
-      if (outputs[i].semantic_name != TGSI_SEMANTIC_COLOR &&
-          outputs[i].semantic_name != TGSI_SEMANTIC_BCOLOR)
+      if (outputs[i].semantic != VARYING_SLOT_COL0 &&
+          outputs[i].semantic != VARYING_SLOT_COL1 &&
+          outputs[i].semantic != VARYING_SLOT_BFC0 &&
+          outputs[i].semantic != VARYING_SLOT_BFC1)
          continue;
 
       for (unsigned j = 0; j < 4; j++) {
@@ -531,8 +519,10 @@ static void si_vertex_color_clamping(struct si_shader_context *ctx,
 
    /* Load clamped colors */
    for (unsigned i = 0; i < noutput; i++) {
-      if (outputs[i].semantic_name != TGSI_SEMANTIC_COLOR &&
-          outputs[i].semantic_name != TGSI_SEMANTIC_BCOLOR)
+      if (outputs[i].semantic != VARYING_SLOT_COL0 &&
+          outputs[i].semantic != VARYING_SLOT_COL1 &&
+          outputs[i].semantic != VARYING_SLOT_BFC0 &&
+          outputs[i].semantic != VARYING_SLOT_BFC1)
          continue;
 
       for (unsigned j = 0; j < 4; j++) {
@@ -558,30 +548,31 @@ void si_llvm_build_vs_exports(struct si_shader_context *ctx,
 
    /* Build position exports. */
    for (i = 0; i < noutput; i++) {
-      switch (outputs[i].semantic_name) {
-      case TGSI_SEMANTIC_POSITION:
+      switch (outputs[i].semantic) {
+      case VARYING_SLOT_POS:
          si_llvm_init_vs_export_args(ctx, outputs[i].values, V_008DFC_SQ_EXP_POS, &pos_args[0]);
          break;
-      case TGSI_SEMANTIC_PSIZE:
+      case VARYING_SLOT_PSIZ:
          psize_value = outputs[i].values[0];
          break;
-      case TGSI_SEMANTIC_LAYER:
+      case VARYING_SLOT_LAYER:
          layer_value = outputs[i].values[0];
          break;
-      case TGSI_SEMANTIC_VIEWPORT_INDEX:
+      case VARYING_SLOT_VIEWPORT:
          viewport_index_value = outputs[i].values[0];
          break;
-      case TGSI_SEMANTIC_EDGEFLAG:
+      case VARYING_SLOT_EDGE:
          edgeflag_value = outputs[i].values[0];
          break;
-      case TGSI_SEMANTIC_CLIPDIST:
+      case VARYING_SLOT_CLIP_DIST0:
+      case VARYING_SLOT_CLIP_DIST1:
          if (!shader->key.opt.clip_disable) {
-            unsigned index = 2 + outputs[i].semantic_index;
+            unsigned index = 2 + (outputs[i].semantic - VARYING_SLOT_CLIP_DIST0);
             si_llvm_init_vs_export_args(ctx, outputs[i].values, V_008DFC_SQ_EXP_POS + index,
                                         &pos_args[index]);
          }
          break;
-      case TGSI_SEMANTIC_CLIPVERTEX:
+      case VARYING_SLOT_CLIP_VERTEX:
          if (!shader->key.opt.clip_disable) {
             si_llvm_emit_clipvertex(ctx, pos_args, outputs[i].values);
          }
@@ -702,8 +693,7 @@ void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi, unsigned max_outputs, L
    outputs = MALLOC((info->num_outputs + 1) * sizeof(outputs[0]));
 
    for (i = 0; i < info->num_outputs; i++) {
-      outputs[i].semantic_name = info->output_semantic_name[i];
-      outputs[i].semantic_index = info->output_semantic_index[i];
+      outputs[i].semantic = info->output_semantic[i];
 
       for (j = 0; j < 4; j++) {
          outputs[i].values[j] = LLVMBuildLoad(ctx->ac.builder, addrs[4 * i + j], "");
@@ -716,8 +706,7 @@ void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi, unsigned max_outputs, L
 
    /* Export PrimitiveID. */
    if (ctx->shader->key.mono.u.vs_export_prim_id) {
-      outputs[i].semantic_name = TGSI_SEMANTIC_PRIMID;
-      outputs[i].semantic_index = 0;
+      outputs[i].semantic = VARYING_SLOT_PRIMITIVE_ID;
       outputs[i].values[0] = ac_to_float(&ctx->ac, si_get_primitive_id(ctx, 0));
       for (j = 1; j < 4; j++)
          outputs[i].values[j] = LLVMConstReal(ctx->ac.f32, 0);
@@ -740,7 +729,7 @@ static void si_llvm_emit_prim_discard_cs_epilogue(struct ac_shader_abi *abi, uns
    assert(info->num_outputs <= max_outputs);
 
    for (unsigned i = 0; i < info->num_outputs; i++) {
-      if (info->output_semantic_name[i] != TGSI_SEMANTIC_POSITION)
+      if (info->output_semantic[i] != VARYING_SLOT_POS)
          continue;
 
       for (unsigned chan = 0; chan < 4; chan++)
@@ -1013,7 +1002,7 @@ void si_llvm_init_vs_callbacks(struct si_shader_context *ctx, bool ngg_cull_shad
    else if (shader->key.opt.vs_as_prim_discard_cs)
       ctx->abi.emit_outputs = si_llvm_emit_prim_discard_cs_epilogue;
    else if (ngg_cull_shader)
-      ctx->abi.emit_outputs = gfx10_emit_ngg_culling_epilogue_4x_wave32;
+      ctx->abi.emit_outputs = gfx10_emit_ngg_culling_epilogue;
    else if (shader->key.as_ngg)
       ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue;
    else