d3d12: Handle structs in GS variants

Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14837>
This commit is contained in:
Jesse Natalie 2022-02-02 06:23:47 -08:00 committed by Marge Bot
parent 252a89a2c9
commit c448931d23

View file

@ -52,6 +52,21 @@ nir_cull_face(nir_builder *b, nir_variable *vertices, bool ccw)
return nir_flt(b, nir_imm_int(b, 0), dir);
}
static void
copy_vars(nir_builder *b, nir_deref_instr *dst, nir_deref_instr *src)
{
assert(glsl_get_bare_type(dst->type) == glsl_get_bare_type(src->type));
if (glsl_type_is_struct(dst->type)) {
for (unsigned i = 0; i < glsl_get_length(dst->type); ++i) {
copy_vars(b, nir_build_deref_struct(b, dst, i), nir_build_deref_struct(b, src, i));
}
} else if (glsl_type_is_array_or_matrix(dst->type)) {
copy_vars(b, nir_build_deref_array_wildcard(b, dst), nir_build_deref_array_wildcard(b, src));
} else {
nir_copy_deref(b, dst, src);
}
}
static d3d12_shader_selector*
d3d12_make_passthrough_gs(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key)
{
@ -108,7 +123,7 @@ d3d12_make_passthrough_gs(struct d3d12_context *ctx, struct d3d12_gs_variant_key
nir_deref_instr *in_value = nir_build_deref_array(&b, nir_build_deref_var(&b, in),
nir_imm_int(&b, 0));
nir_copy_deref(&b, nir_build_deref_var(&b, out), in_value);
copy_vars(&b, nir_build_deref_var(&b, out), in_value);
}
}
@ -344,13 +359,13 @@ d3d12_emit_points(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key)
nir_deref_instr *in_value = nir_build_deref_array(b, nir_build_deref_var(b, emit_ctx.in[i]), index);
if (emit_ctx.in[i]->data.location == VARYING_SLOT_POS && emit_ctx.edgeflag_cmp) {
nir_if *edge_check = nir_push_if(b, emit_ctx.edgeflag_cmp);
nir_copy_deref(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
copy_vars(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
nir_if *edge_else = nir_push_else(b, edge_check);
nir_store_deref(b, nir_build_deref_var(b, emit_ctx.out[i]),
nir_imm_vec4(b, -2.0, -2.0, 0.0, 1.0), 0xf);
nir_pop_if(b, edge_else);
} else {
nir_copy_deref(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
copy_vars(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
}
}
if (key->has_front_face)
@ -375,7 +390,7 @@ d3d12_emit_lines(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key)
nir_ssa_def *index = (key->flat_varyings & (1ull << emit_ctx.in[i]->data.location)) ?
nir_imm_int(b, (key->flatshade_first ? 0 : 2)) : emit_ctx.loop_index;
nir_deref_instr *in_value = nir_build_deref_array(b, nir_build_deref_var(b, emit_ctx.in[i]), index);
nir_copy_deref(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
copy_vars(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
}
if (key->has_front_face)
nir_store_var(b, emit_ctx.front_facing_var, emit_ctx.front_facing, 0x1);
@ -388,8 +403,8 @@ d3d12_emit_lines(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key)
index = nir_bcsel(b, emit_ctx.edgeflag_cmp, next_index, emit_ctx.loop_index);
else if (key->flat_varyings & (1ull << emit_ctx.in[i]->data.location))
index = nir_imm_int(b, 2);
nir_copy_deref(b, nir_build_deref_var(b, emit_ctx.out[i]),
nir_build_deref_array(b, nir_build_deref_var(b, emit_ctx.in[i]), index));
copy_vars(b, nir_build_deref_var(b, emit_ctx.out[i]),
nir_build_deref_array(b, nir_build_deref_var(b, emit_ctx.in[i]), index));
}
if (key->has_front_face)
nir_store_var(b, emit_ctx.front_facing_var, emit_ctx.front_facing, 0x1);
@ -430,7 +445,7 @@ d3d12_emit_triangles(struct d3d12_context *ctx, struct d3d12_gs_variant_key *key
nir_ssa_def *index = nir_imod(b, nir_iadd(b, emit_ctx.loop_index, incr), nir_imm_int(b, 3));
for (unsigned i = 0; i < emit_ctx.num_vars; ++i) {
nir_deref_instr *in_value = nir_build_deref_array(b, nir_build_deref_var(b, emit_ctx.in[i]), index);
nir_copy_deref(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
copy_vars(b, nir_build_deref_var(b, emit_ctx.out[i]), in_value);
}
nir_emit_vertex(b, 0);