diff options
author | Jesse Natalie <jenatali@microsoft.com> | 2022-02-02 06:23:47 -0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-02-04 00:07:53 +0000 |
commit | c448931d232e117084d9f739a0882edb400f40ab (patch) | |
tree | d1643a15ef182a35ca8d410855405fee252f2506 | |
parent | 252a89a2c9c6ecce734fb1fc3e2c83ab2a3c847e (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.cpp | 29 |
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); |