zink: keep xfb properties in quad emulation gs

Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21238>
This commit is contained in:
antonino 2023-02-16 16:57:02 +01:00 committed by Marge Bot
parent 2bd72a4101
commit 49329b8904
2 changed files with 22 additions and 20 deletions

View file

@ -32,6 +32,7 @@
#include "pipe/p_state.h"
#include "nir.h"
#include "nir_xfb_info.h"
#include "nir/nir_draw_helpers.h"
#include "compiler/nir/nir_builder.h"
#include "compiler/nir/nir_builtin_builder.h"
@ -918,6 +919,12 @@ zink_create_quads_emulation_gs(const nir_shader_compiler_options *options,
nir->info.gs.invocations = 1;
nir->info.gs.active_stream_mask = 1;
nir->info.has_transform_feedback_varyings = prev_stage->info.has_transform_feedback_varyings;
memcpy(nir->info.xfb_stride, prev_stage->info.xfb_stride, sizeof(prev_stage->info.xfb_stride));
if (prev_stage->xfb_info) {
nir->xfb_info = mem_dup(prev_stage->xfb_info, sizeof(nir_xfb_info));
}
nir_variable *in_vars[VARYING_SLOT_MAX];
nir_variable *out_vars[VARYING_SLOT_MAX];
unsigned num_vars = 0;
@ -932,29 +939,23 @@ zink_create_quads_emulation_gs(const nir_shader_compiler_options *options,
else
snprintf(name, sizeof(name), "in_%d", var->data.driver_location);
nir_variable *in = nir_variable_create(nir, nir_var_shader_in,
glsl_array_type(var->type,
4,
false),
name);
in->data.location = var->data.location;
in->data.location_frac = var->data.location_frac;
in->data.driver_location = var->data.driver_location;
in->data.interpolation = var->data.interpolation;
in->data.compact = var->data.compact;
nir_variable *in = nir_variable_clone(var, nir);
ralloc_free(in->name);
in->name = ralloc_strdup(in, name);
in->type = glsl_array_type(var->type, 4, false);
in->data.mode = nir_var_shader_in;
nir_shader_add_variable(nir, in);
if (var->name)
snprintf(name, sizeof(name), "out_%s", var->name);
else
snprintf(name, sizeof(name), "out_%d", var->data.driver_location);
nir_variable *out = nir_variable_create(nir, nir_var_shader_out,
var->type, name);
out->data.location = var->data.location;
out->data.location_frac = var->data.location_frac;
out->data.driver_location = var->data.driver_location;
out->data.interpolation = var->data.interpolation;
out->data.compact = var->data.compact;
nir_variable *out = nir_variable_clone(var, nir);
ralloc_free(out->name);
out->name = ralloc_strdup(out, name);
out->data.mode = nir_var_shader_out;
nir_shader_add_variable(nir, out);
in_vars[num_vars] = in;
out_vars[num_vars++] = out;
@ -989,7 +990,6 @@ zink_create_quads_emulation_gs(const nir_shader_compiler_options *options,
nir_end_primitive(&b, 0);
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
nir_validate_shader(nir, "in zink_create_quads_emulation_gs");
return nir;
}
@ -4633,8 +4633,9 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir,
NIR_PASS_V(nir, match_tex_dests, ret);
ret->nir = nir;
nir_foreach_shader_out_variable(var, nir)
var->data.explicit_xfb_buffer = 0;
if (!nir->info.internal)
nir_foreach_shader_out_variable(var, nir)
var->data.explicit_xfb_buffer = 0;
if (so_info && so_info->num_outputs)
update_so_info(ret, so_info, nir->info.outputs_written, have_psiz);
else if (have_psiz) {

View file

@ -2328,6 +2328,7 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx)
ctx->gfx_stages[prev_vertex_stage]->non_fs.generated_gs[ctx->gfx_pipeline_state.gfx_prim_mode][zink_prim_type] = shader;
shader->non_fs.is_generated = true;
shader->can_inline = true;
shader->sinfo.so_info = ctx->gfx_stages[prev_vertex_stage]->sinfo.so_info;
}
bind_gfx_stage(ctx, MESA_SHADER_GEOMETRY,