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;
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, "");
}
}
}
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);
/* 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++) {
/* 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++) {
/* 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++) {
/* 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);
}
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], "");
/* 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);
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++)
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