diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index e52c6245ad5..ee1e4bf3d0a 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -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 * diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index e901ee45f7b..e4520b448fa 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -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); diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index fd383da5aff..d2002053b5e 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -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; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index c3de3fd24fe..7c048cce866 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -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;