summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Natalie <jenatali@microsoft.com>2022-02-02 06:23:47 -0800
committerMarge Bot <emma+marge@anholt.net>2022-02-04 00:07:53 +0000
commitc448931d232e117084d9f739a0882edb400f40ab (patch)
treed1643a15ef182a35ca8d410855405fee252f2506
parent252a89a2c9c6ecce734fb1fc3e2c83ab2a3c847e (diff)
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>
-rw-r--r--src/gallium/drivers/d3d12/d3d12_gs_variant.cpp29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp b/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp
index 3b783e89479..b1605623cf2 100644
--- a/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp
@@ -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);