mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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:
parent
252a89a2c9
commit
c448931d23
1 changed files with 22 additions and 7 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue