assert(ctx); //TODO async
mod = zink_shader_tcs_compile(screen, zs, patch_vertices);
} else {
- mod = zink_shader_compile(screen, zs, nir_shader_clone(NULL, prog->nir[stage]), key, &ctx->di.zs_swizzle[stage]);
+ mod = zink_shader_compile(screen, zs, zink_shader_blob_deserialize(screen, &prog->blobs[stage]), key, &ctx->di.zs_swizzle[stage]);
}
if (!mod) {
FREE(zm);
struct zink_tcs_key *tcs = (struct zink_tcs_key*)key;
mod = zink_shader_tcs_compile(screen, zs, tcs->patch_vertices);
} else {
- mod = zink_shader_compile(screen, zs, nir_shader_clone(NULL, prog->nir[stage]), (struct zink_shader_key*)key, shadow_needs_shader_swizzle ? &ctx->di.zs_swizzle[stage] : NULL);
+ mod = zink_shader_compile(screen, zs, zink_shader_blob_deserialize(screen, &prog->blobs[stage]), (struct zink_shader_key*)key, shadow_needs_shader_swizzle ? &ctx->di.zs_swizzle[stage] : NULL);
}
if (!mod) {
FREE(zm);
if (!zm) {
return;
}
- mod = zink_shader_compile(screen, zs, nir_shader_clone(NULL, comp->nir), key, zs_swizzle_size ? &ctx->di.zs_swizzle[MESA_SHADER_COMPUTE] : NULL);
+ mod = zink_shader_compile(screen, zs, zink_shader_blob_deserialize(screen, &comp->shader->blob), key, zs_swizzle_size ? &ctx->di.zs_swizzle[MESA_SHADER_COMPUTE] : NULL);
if (!mod) {
FREE(zm);
return;
prog->base.removed = true;
prog->optimal_keys = screen->optimal_keys;
+ nir_shader *nir[ZINK_GFX_SHADER_COUNT];
+
prog->has_edgeflags = prog->shaders[MESA_SHADER_VERTEX] &&
prog->shaders[MESA_SHADER_VERTEX]->has_edgeflags;
for (int i = 0; i < ZINK_GFX_SHADER_COUNT; ++i) {
prog->stages_present |= BITFIELD_BIT(i);
prog->optimal_keys &= !prog->shaders[i]->non_fs.is_generated;
prog->needs_inlining |= prog->shaders[i]->needs_inlining;
- prog->nir[i] = zink_shader_deserialize(screen, stages[i]);
+ nir[i] = zink_shader_deserialize(screen, stages[i]);
+ } else {
+ nir[i] = NULL;
}
}
if (stages[MESA_SHADER_TESS_EVAL] && !stages[MESA_SHADER_TESS_CTRL]) {
prog->shaders[MESA_SHADER_TESS_EVAL]->non_fs.generated_tcs =
prog->shaders[MESA_SHADER_TESS_CTRL] =
- zink_shader_tcs_create(screen, prog->nir[MESA_SHADER_VERTEX], vertices_per_patch, &prog->nir[MESA_SHADER_TESS_CTRL]);
+ zink_shader_tcs_create(screen, nir[MESA_SHADER_VERTEX], vertices_per_patch, &nir[MESA_SHADER_TESS_CTRL]);
prog->stages_present |= BITFIELD_BIT(MESA_SHADER_TESS_CTRL);
}
prog->stages_remaining = prog->stages_present;
- assign_io(screen, prog->nir);
+ assign_io(screen, nir);
+ for (unsigned i = 0; i < ZINK_GFX_SHADER_COUNT; i++) {
+ if (nir[i])
+ zink_shader_serialize_blob(nir[i], &prog->blobs[i]);
+ ralloc_free(nir[i]);
+ }
+
if (stages[MESA_SHADER_GEOMETRY])
prog->last_vertex_stage = stages[MESA_SHADER_GEOMETRY];
comp->shader = zink_shader_create(screen, comp->nir, NULL);
comp->curr = comp->module = CALLOC_STRUCT(zink_shader_module);
assert(comp->module);
- comp->module->shader = zink_shader_compile(screen, comp->shader, nir_shader_clone(NULL, comp->nir), NULL, NULL);
+ comp->module->shader = zink_shader_compile(screen, comp->shader, comp->nir, NULL, NULL);
+ /* comp->nir will be freed by zink_shader_compile */
+ comp->nir = NULL;
assert(comp->module->shader);
util_dynarray_init(&comp->shader_cache[0], comp);
util_dynarray_init(&comp->shader_cache[1], comp);
destroy_shader_cache(screen, &prog->shader_cache[i][0][1]);
destroy_shader_cache(screen, &prog->shader_cache[i][1][0]);
destroy_shader_cache(screen, &prog->shader_cache[i][1][1]);
- ralloc_free(prog->nir[i]);
+ blob_finish(&prog->blobs[i]);
}
}
if (prog->is_separable)
assert(!comp->shader->spirv);
_mesa_set_destroy(comp->shader->programs, NULL);
- ralloc_free(comp->nir);
+ blob_finish(&comp->shader->blob);
ralloc_free(comp->shader);
destroy_shader_cache(screen, &comp->shader_cache[0]);