glsl/nir: Stash the xfb_info in the nir_shader when linking XFB

This pass is used for shaders coming in from SPIR-V.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16750>
This commit is contained in:
Jason Ekstrand 2022-05-27 13:55:18 -05:00 committed by Marge Bot
parent 36d8a2f1d7
commit 16b0719441
3 changed files with 11 additions and 11 deletions

View File

@ -74,7 +74,8 @@ gl_nir_link_assign_xfb_resources(const struct gl_constants *consts,
struct gl_linked_shader *sh = prog->_LinkedShaders[stage]; struct gl_linked_shader *sh = prog->_LinkedShaders[stage];
if (sh && stage != MESA_SHADER_TESS_CTRL) { if (sh && stage != MESA_SHADER_TESS_CTRL) {
xfb_info = nir_gather_xfb_info_with_varyings(sh->Program->nir, NULL, &varyings_info); nir_gather_xfb_info_with_varyings(sh->Program->nir, NULL, &varyings_info);
xfb_info = sh->Program->nir->xfb_info;
break; break;
} }
} }
@ -192,7 +193,6 @@ gl_nir_link_assign_xfb_resources(const struct gl_constants *consts,
linked_xfb->ActiveBuffers = buffers; linked_xfb->ActiveBuffers = buffers;
ralloc_free(xfb_info);
ralloc_free(varyings_info); ralloc_free(varyings_info);
} }

View File

@ -181,12 +181,11 @@ compare_xfb_output_offsets(const void *_a, const void *_b)
void void
nir_shader_gather_xfb_info(nir_shader *shader) nir_shader_gather_xfb_info(nir_shader *shader)
{ {
ralloc_free(shader->xfb_info); nir_gather_xfb_info_with_varyings(shader, NULL, NULL);
shader->xfb_info = nir_gather_xfb_info_with_varyings(shader, shader, NULL);
} }
nir_xfb_info * void
nir_gather_xfb_info_with_varyings(const nir_shader *shader, nir_gather_xfb_info_with_varyings(nir_shader *shader,
void *mem_ctx, void *mem_ctx,
nir_xfb_varyings_info **varyings_info_out) nir_xfb_varyings_info **varyings_info_out)
{ {
@ -211,9 +210,9 @@ nir_gather_xfb_info_with_varyings(const nir_shader *shader,
} }
} }
if (num_outputs == 0 || num_varyings == 0) if (num_outputs == 0 || num_varyings == 0)
return NULL; return;
nir_xfb_info *xfb = nir_xfb_info_create(mem_ctx, num_outputs); nir_xfb_info *xfb = nir_xfb_info_create(shader, num_outputs);
if (varyings_info_out != NULL) { if (varyings_info_out != NULL) {
*varyings_info_out = nir_xfb_varyings_info_create(mem_ctx, num_varyings); *varyings_info_out = nir_xfb_varyings_info_create(mem_ctx, num_varyings);
varyings_info = *varyings_info_out; varyings_info = *varyings_info_out;
@ -285,7 +284,8 @@ nir_gather_xfb_info_with_varyings(const nir_shader *shader,
} }
#endif #endif
return xfb; ralloc_free(shader->xfb_info);
shader->xfb_info = xfb;
} }
static int static int

View File

@ -76,8 +76,8 @@ nir_xfb_info_size(uint16_t output_count)
void nir_shader_gather_xfb_info(nir_shader *shader); void nir_shader_gather_xfb_info(nir_shader *shader);
nir_xfb_info * void
nir_gather_xfb_info_with_varyings(const nir_shader *shader, nir_gather_xfb_info_with_varyings(nir_shader *shader,
void *mem_ctx, void *mem_ctx,
nir_xfb_varyings_info **varyings_info); nir_xfb_varyings_info **varyings_info);