d3d12: Use compact arrays for clip/cull distance

This puts us more in line with other drivers, and matches what
SPIR-V would produce rather than the GLSL compiler. It also means
we can delete the current fixup pass, since previously clip distance
was always float4s but some components could go unused. Now, clip
distance is an array that's appropriately sized for what's actually
written.

Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9846>
This commit is contained in:
Jesse Natalie
2021-03-25 18:21:37 -07:00
committed by Marge Bot
parent baeb363df0
commit bd64669fa7
4 changed files with 5 additions and 51 deletions

View File

@@ -27,6 +27,7 @@
#include "d3d12_screen.h"
#include "d3d12_nir_passes.h"
#include "nir_to_dxil.h"
#include "dxil_nir.h"
#include "pipe/p_state.h"
@@ -160,7 +161,6 @@ compile_nir(struct d3d12_context *ctx, struct d3d12_shader_selector *sel,
NIR_PASS_V(nir, d3d12_lower_load_first_vertex);
NIR_PASS_V(nir, d3d12_lower_state_vars, shader);
NIR_PASS_V(nir, d3d12_lower_bool_input);
NIR_PASS_V(nir, d3d12_fixup_clipdist_writes);
struct nir_to_dxil_options opts = {};
opts.interpolate_at_vertex = screen->have_load_at_vertex;
@@ -1046,6 +1046,7 @@ d3d12_create_shader(struct d3d12_context *ctx,
VARYING_BIT_PRIMITIVE_ID;
d3d12_fix_io_uint_type(nir, in_mask, out_mask);
NIR_PASS_V(nir, dxil_nir_split_clip_cull_distance);
if (nir->info.stage != MESA_SHADER_VERTEX)
nir->info.inputs_read =

View File

@@ -978,50 +978,3 @@ d3d12_lower_triangle_strip(nir_shader *shader)
nir_metadata_preserve(impl, 0);
NIR_PASS_V(shader, nir_lower_var_copies);
}
void
d3d12_fixup_clipdist_writes(nir_shader *shader)
{
nir_builder b;
nir_function_impl *impl = nir_shader_get_entrypoint(shader);
nir_builder_init(&b, impl);
nir_foreach_block(block, impl) {
nir_foreach_instr_safe(instr, block) {
if (instr->type != nir_instr_type_intrinsic)
continue;
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
if (intr->intrinsic != nir_intrinsic_store_deref)
continue;
nir_deref_instr *deref = nir_src_as_deref(intr->src[0]);
nir_variable *var = nir_deref_instr_get_variable(deref);
if (var->data.mode != nir_var_shader_out ||
(var->data.location != VARYING_SLOT_CLIP_DIST0 &&
var->data.location != VARYING_SLOT_CLIP_DIST1))
continue;
uint32_t writemask = nir_intrinsic_write_mask(intr);
if (writemask == 0xf)
continue;
b.cursor = nir_before_instr(instr);
nir_ssa_def *defs[4];
nir_ssa_def *prev = nir_ssa_for_src(&b, intr->src[1],
nir_src_num_components(intr->src[1]));
for (int i = 0; i < 4; ++i) {
if (writemask & (1 << i))
defs[i] = nir_channel(&b, prev, i);
else
defs[i] = nir_imm_zero(&b, 1, nir_src_bit_size(intr->src[1]));
}
nir_ssa_def *def = nir_vec4(&b, defs[0], defs[1], defs[2], defs[3]);
nir_instr_rewrite_src(&intr->instr, intr->src + 1, nir_src_for_ssa(def));
nir_intrinsic_set_write_mask(intr, 0xf);
}
}
nir_metadata_preserve(impl, nir_metadata_all);
}

View File

@@ -91,9 +91,6 @@ d3d12_lower_primitive_id(nir_shader *shader);
void
d3d12_lower_triangle_strip(nir_shader *shader);
void
d3d12_fixup_clipdist_writes(nir_shader *shader);
#ifdef __cplusplus
}
#endif

View File

@@ -317,6 +317,9 @@ d3d12_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_MAX_VARYINGS:
return 32;
case PIPE_CAP_NIR_COMPACT_ARRAYS:
return 1;
default:
return u_pipe_screen_get_param_defaults(pscreen, param);
}