mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
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:
parent
8b54012941
commit
ca51c5a9da
4 changed files with 22 additions and 7 deletions
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue