/* Adjust color input interpolation according to flatshade state:
*/
- memcpy(inputs, shader->inputs,
- shader->info.base.num_inputs * sizeof inputs[0]);
- for (unsigned i = 0; i < shader->info.base.num_inputs; i++) {
- if (inputs[i].interp == LP_INTERP_COLOR) {
- if (key->flatshade)
- inputs[i].interp = LP_INTERP_CONSTANT;
- else
- inputs[i].interp = LP_INTERP_PERSPECTIVE;
+ nir_foreach_shader_in_variable(var, nir) {
+ unsigned idx = var->data.driver_location;
+ unsigned slots = nir_variable_count_slots(var, var->type);
+ memcpy(&inputs[idx], &shader->inputs[idx], (sizeof inputs[0] * slots));
+ for (unsigned s = 0; s < slots; s++) {
+ if (inputs[idx + s].interp == LP_INTERP_COLOR)
+ inputs[idx + s].interp = key->flatshade ? LP_INTERP_CONSTANT : LP_INTERP_PERSPECTIVE;
}
}
*/
lp_build_interp_soa_init(&interp,
gallivm,
- shader->info.base.num_inputs,
+ nir->num_inputs,
inputs,
pixel_center_integer,
key->coverage_samples,
nr_sampler_views),
nr_images);
- for (int i = 0; i < shader->info.base.num_inputs; i++) {
- shader->inputs[i].usage_mask = shader->info.base.input_usage_mask[i];
- shader->inputs[i].location = shader->info.base.input_interpolate_loc[i];
-
- switch (shader->info.base.input_interpolate[i]) {
- case TGSI_INTERPOLATE_CONSTANT:
- shader->inputs[i].interp = LP_INTERP_CONSTANT;
- break;
- case TGSI_INTERPOLATE_LINEAR:
- shader->inputs[i].interp = LP_INTERP_LINEAR;
- break;
- case TGSI_INTERPOLATE_PERSPECTIVE:
- shader->inputs[i].interp = LP_INTERP_PERSPECTIVE;
+ nir_foreach_shader_in_variable(var, nir) {
+ unsigned idx = var->data.driver_location;
+ unsigned slots = nir_variable_count_slots(var, var->type);
+
+ if (var->data.centroid)
+ shader->inputs[idx].location = TGSI_INTERPOLATE_LOC_CENTROID;
+ if (var->data.sample)
+ shader->inputs[idx].location = TGSI_INTERPOLATE_LOC_SAMPLE;
+
+ enum glsl_base_type base_type =
+ glsl_get_base_type(glsl_without_array(var->type));
+ switch (var->data.interpolation) {
+ case INTERP_MODE_NONE:
+ if (glsl_base_type_is_integer(base_type) || var->data.per_primitive) {
+ shader->inputs[idx].interp = LP_INTERP_CONSTANT;
+ break;
+ }
+ if (var->data.location == VARYING_SLOT_COL0 ||
+ var->data.location == VARYING_SLOT_COL1) {
+ shader->inputs[idx].interp = LP_INTERP_COLOR;
+ break;
+ }
+ FALLTHROUGH;
+ case INTERP_MODE_SMOOTH:
+ shader->inputs[idx].interp = LP_INTERP_PERSPECTIVE;
break;
- case TGSI_INTERPOLATE_COLOR:
- shader->inputs[i].interp = LP_INTERP_COLOR;
+ case INTERP_MODE_NOPERSPECTIVE:
+ shader->inputs[idx].interp = LP_INTERP_LINEAR;
break;
- default:
- assert(0);
+ case INTERP_MODE_FLAT:
+ shader->inputs[idx].interp = LP_INTERP_CONSTANT;
break;
}
- switch (shader->info.base.input_semantic_name[i]) {
- case TGSI_SEMANTIC_FACE:
- shader->inputs[i].interp = LP_INTERP_FACING;
- break;
- case TGSI_SEMANTIC_POSITION:
- /* Position was already emitted above
- */
- shader->inputs[i].interp = LP_INTERP_POSITION;
- shader->inputs[i].src_index = 0;
- continue;
+ /* XXX this is a completely pointless index map... */
+ shader->inputs[idx].src_index = idx + 1;
+ if (var->data.location == VARYING_SLOT_FACE)
+ shader->inputs[idx].interp = LP_INTERP_FACING;
+ else if (var->data.location == VARYING_SLOT_POS) {
+ shader->inputs[idx].src_index = 0;
+ shader->inputs[idx].interp = LP_INTERP_POSITION;
}
- /* XXX this is a completely pointless index map... */
- shader->inputs[i].src_index = i+1;
+ shader->inputs[idx].usage_mask = shader->info.base.input_usage_mask[idx];
+ for (unsigned s = 1; s < slots; s++) {
+ shader->inputs[idx + s] = shader->inputs[idx];
+ shader->inputs[idx + s].src_index = idx + s + 1;
+ shader->inputs[idx + s].usage_mask = shader->info.base.input_usage_mask[idx + s];
+ }
}
llvmpipe_fs_analyse_nir(shader);