mirror of https://gitlab.freedesktop.org/mesa/mesa
spirv2dxil: Output more specific metadata for whether draw sysvals are needed
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28383>
This commit is contained in:
parent
30b1a6750c
commit
f6c3d73700
|
@ -757,11 +757,11 @@ lower_view_index_to_rt_layer(nir_shader *nir)
|
|||
void
|
||||
dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
|
||||
const struct dxil_spirv_runtime_conf *conf,
|
||||
bool *requires_runtime_data)
|
||||
struct dxil_spirv_metadata *metadata)
|
||||
{
|
||||
glsl_type_singleton_init_or_ref();
|
||||
|
||||
*requires_runtime_data = false;
|
||||
metadata->requires_runtime_data = false;
|
||||
if (prev_stage_nir) {
|
||||
if (nir->info.stage == MESA_SHADER_FRAGMENT) {
|
||||
nir->info.clip_distance_array_size = prev_stage_nir->info.clip_distance_array_size;
|
||||
|
@ -769,7 +769,7 @@ dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
|
|||
if (nir->info.inputs_read & VARYING_BIT_PNTC) {
|
||||
NIR_PASS_V(prev_stage_nir, dxil_spirv_write_pntc, conf);
|
||||
NIR_PASS_V(nir, dxil_spirv_compute_pntc);
|
||||
*requires_runtime_data = true;
|
||||
metadata->requires_runtime_data = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -871,7 +871,7 @@ merge_ubos_and_ssbos(nir_shader *nir)
|
|||
void
|
||||
dxil_spirv_nir_passes(nir_shader *nir,
|
||||
const struct dxil_spirv_runtime_conf *conf,
|
||||
bool *requires_runtime_data)
|
||||
struct dxil_spirv_metadata *metadata)
|
||||
{
|
||||
glsl_type_singleton_init_or_ref();
|
||||
|
||||
|
@ -935,8 +935,11 @@ dxil_spirv_nir_passes(nir_shader *nir,
|
|||
if (conf->lower_view_index_to_rt_layer)
|
||||
NIR_PASS_V(nir, lower_view_index_to_rt_layer);
|
||||
|
||||
*requires_runtime_data = false;
|
||||
NIR_PASS(*requires_runtime_data, nir,
|
||||
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
|
||||
metadata->needs_draw_sysvals = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FIRST_VERTEX) ||
|
||||
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BASE_INSTANCE);
|
||||
|
||||
NIR_PASS(metadata->requires_runtime_data, nir,
|
||||
dxil_spirv_nir_lower_shader_system_values,
|
||||
conf);
|
||||
|
||||
|
@ -1022,10 +1025,10 @@ dxil_spirv_nir_passes(nir_shader *nir,
|
|||
nir->info.stage == MESA_SHADER_TESS_EVAL);
|
||||
NIR_PASS_V(nir,
|
||||
dxil_spirv_nir_lower_yz_flip,
|
||||
conf, requires_runtime_data);
|
||||
conf, &metadata->requires_runtime_data);
|
||||
}
|
||||
|
||||
if (*requires_runtime_data) {
|
||||
if (metadata->requires_runtime_data) {
|
||||
add_runtime_data_var(nir, conf->runtime_data_cbv.register_space,
|
||||
conf->runtime_data_cbv.base_shader_register);
|
||||
}
|
||||
|
|
|
@ -41,12 +41,12 @@ dxil_spirv_nir_prep(nir_shader *nir);
|
|||
void
|
||||
dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
|
||||
const struct dxil_spirv_runtime_conf *conf,
|
||||
bool *requires_runtime_data);
|
||||
struct dxil_spirv_metadata *metadata);
|
||||
|
||||
void
|
||||
dxil_spirv_nir_passes(nir_shader *nir,
|
||||
const struct dxil_spirv_runtime_conf *conf,
|
||||
bool *requires_runtime_data);
|
||||
struct dxil_spirv_metadata *metadata);
|
||||
|
||||
struct dxil_spirv_binding_remapping {
|
||||
/* If ~0, don't lower to bindless */
|
||||
|
|
|
@ -115,8 +115,8 @@ compile_shader(const char *filename, gl_shader_stage shader_stage, struct shader
|
|||
|
||||
dxil_spirv_nir_prep(shader->nir);
|
||||
|
||||
bool requires_runtime_data;
|
||||
dxil_spirv_nir_passes(shader->nir, conf, &requires_runtime_data);
|
||||
struct dxil_spirv_metadata metadata = { 0 };
|
||||
dxil_spirv_nir_passes(shader->nir, conf, &metadata);
|
||||
|
||||
if (debug)
|
||||
nir_print_shader(shader->nir, stderr);
|
||||
|
@ -247,8 +247,8 @@ main(int argc, char **argv)
|
|||
for (int32_t prev = cur - 1; prev >= MESA_SHADER_VERTEX; --prev) {
|
||||
if (!shaders[prev].nir)
|
||||
continue;
|
||||
bool requires_runtime_data;
|
||||
dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf, &requires_runtime_data);
|
||||
struct dxil_spirv_metadata metadata = { 0 };
|
||||
dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf, &metadata);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,8 +85,7 @@ spirv_to_dxil(const uint32_t *words, size_t word_count,
|
|||
|
||||
dxil_spirv_nir_prep(nir);
|
||||
|
||||
bool requires_runtime_data;
|
||||
dxil_spirv_nir_passes(nir, conf, &requires_runtime_data);
|
||||
dxil_spirv_nir_passes(nir, conf, &out_dxil->metadata);
|
||||
|
||||
if (dgb_opts->dump_nir)
|
||||
nir_print_shader(nir, stderr);
|
||||
|
@ -104,7 +103,6 @@ spirv_to_dxil(const uint32_t *words, size_t word_count,
|
|||
}
|
||||
|
||||
ralloc_free(nir);
|
||||
out_dxil->metadata.requires_runtime_data = requires_runtime_data;
|
||||
blob_finish_get_buffer(&dxil_blob, &out_dxil->binary.buffer,
|
||||
&out_dxil->binary.size);
|
||||
|
||||
|
|
|
@ -72,7 +72,15 @@ struct dxil_spirv_specialization {
|
|||
};
|
||||
|
||||
struct dxil_spirv_metadata {
|
||||
// Some sysval or other type of data is accessed which needs to be piped
|
||||
// from the app/API implementation into the shader via a buffer
|
||||
bool requires_runtime_data;
|
||||
|
||||
// Specifically if a vertex shader needs the first-vertex or base-instance
|
||||
// sysval. These are relevant since these can come from an indirect arg
|
||||
// buffer, and therefore piping them to the runtime data buffer is extra
|
||||
// complex.
|
||||
bool needs_draw_sysvals;
|
||||
};
|
||||
|
||||
struct dxil_spirv_object {
|
||||
|
|
|
@ -253,8 +253,8 @@ dzn_pipeline_get_nir_shader(struct dzn_device *device,
|
|||
.shader_model_max = dzn_get_shader_model(pdev),
|
||||
};
|
||||
|
||||
bool requires_runtime_data;
|
||||
dxil_spirv_nir_passes(*nir, &conf, &requires_runtime_data);
|
||||
struct dxil_spirv_metadata metadata = { 0 };
|
||||
dxil_spirv_nir_passes(*nir, &conf, &metadata);
|
||||
|
||||
if (stage == MESA_SHADER_VERTEX) {
|
||||
bool needs_conv = false;
|
||||
|
@ -972,11 +972,11 @@ dzn_graphics_pipeline_compile_shaders(struct dzn_device *device,
|
|||
}};
|
||||
|
||||
assert(pipeline->templates.shaders[stage].nir);
|
||||
bool requires_runtime_data;
|
||||
struct dxil_spirv_metadata metadata = { 0 };
|
||||
dxil_spirv_nir_link(pipeline->templates.shaders[stage].nir,
|
||||
prev_stage != MESA_SHADER_NONE ?
|
||||
pipeline->templates.shaders[prev_stage].nir : NULL,
|
||||
&conf, &requires_runtime_data);
|
||||
&conf, &metadata);
|
||||
|
||||
if (prev_stage != MESA_SHADER_NONE) {
|
||||
memcpy(stages[stage].link_hashes[0], stages[prev_stage].spirv_hash, SHA1_DIGEST_LENGTH);
|
||||
|
|
Loading…
Reference in New Issue