zink: split shader create into 2-stage functions

this allows for a 2-stage creation of shaders with a quick create()
and a longer init()

no functional changes

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28955>
This commit is contained in:
Mike Blumenkrantz 2024-04-25 07:32:05 -04:00 committed by Marge Bot
parent 8b54012941
commit ca51c5a9da
4 changed files with 22 additions and 7 deletions

View file

@ -6108,10 +6108,9 @@ struct zink_shader *
zink_shader_create(struct zink_screen *screen, struct nir_shader *nir)
{
struct zink_shader *zs = rzalloc(NULL, struct zink_shader);
bool have_psiz = false;
zs->has_edgeflags = nir->info.stage == MESA_SHADER_VERTEX &&
nir->info.outputs_written & VARYING_BIT_EDGE;
nir->info.outputs_written & VARYING_BIT_EDGE;
zs->sinfo.have_vulkan_memory_model = screen->info.have_KHR_vulkan_memory_model;
zs->sinfo.have_workgroup_memory_explicit_layout = screen->info.have_KHR_workgroup_memory_explicit_layout;
@ -6145,10 +6144,24 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir)
zs->programs = _mesa_pointer_set_create(NULL);
simple_mtx_init(&zs->lock, mtx_plain);
memcpy(&zs->info, &nir->info, sizeof(nir->info));
zs->info.name = ralloc_strdup(zs, nir->info.name);
zs->can_inline = true;
zs->nir = nir;
if (nir->info.stage != MESA_SHADER_KERNEL)
match_tex_dests(nir, zs, true);
return zs;
}
void
zink_shader_init(struct zink_screen *screen, struct zink_shader *zs)
{
bool have_psiz = false;
nir_shader *nir = zs->nir;
if (nir->info.stage == MESA_SHADER_KERNEL) {
nir_lower_mem_access_bit_sizes_options lower_mem_access_options = {
.modes = nir_var_all ^ nir_var_function_temp,
@ -6361,11 +6374,6 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir)
update_so_info(zs, nir, nir->info.outputs_written, have_psiz);
zink_shader_serialize_blob(nir, &zs->blob);
memcpy(&zs->info, &nir->info, sizeof(nir->info));
zs->info.name = ralloc_strdup(zs, nir->info.name);
zs->can_inline = true;
return zs;
}
char *

View file

@ -75,6 +75,8 @@ struct zink_shader_object
zink_shader_compile_separate(struct zink_screen *screen, struct zink_shader *zs);
struct zink_shader *
zink_shader_create(struct zink_screen *screen, struct nir_shader *nir);
void
zink_shader_init(struct zink_screen *screen, struct zink_shader *zs);
char *
zink_shader_finalize(struct pipe_screen *pscreen, void *nirptr);

View file

@ -1371,6 +1371,7 @@ precompile_compute_job(void *data, void *gdata, int thread_index)
struct zink_screen *screen = gdata;
comp->shader = zink_shader_create(screen, comp->nir);
zink_shader_init(screen, comp->shader);
comp->curr = comp->module = CALLOC_STRUCT(zink_shader_module);
assert(comp->module);
comp->module->shobj = false;
@ -2242,6 +2243,7 @@ zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader
zink_descriptors_init_bindless(zink_context(pctx));
struct zink_shader *zs = zink_shader_create(zink_screen(pctx->screen), nir);
zink_shader_init(zink_screen(pctx->screen), zs);
if (!(zink_debug & ZINK_DEBUG_NOPC)) {
if (nir->info.separate_shader && zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_DB &&
@ -2535,6 +2537,7 @@ zink_set_primitive_emulation_keys(struct zink_context *ctx)
zink_add_inline_uniform(nir, ZINK_INLINE_VAL_PV_LAST_VERT);
ralloc_free(prev_stage);
struct zink_shader *shader = zink_shader_create(screen, nir);
zink_shader_init(screen, shader);
shader->needs_inlining = true;
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;

View file

@ -809,6 +809,8 @@ struct zink_shader {
uint32_t hash;
struct blob blob;
struct shader_info info;
/* this is deleted in zink_shader_init */
nir_shader *nir;
struct zink_shader_info sinfo;