vk_graphics_pipeline_state_merge(state, &lib->graphics_state);
- /* Import the NIR shaders (after SPIRV->NIR). */
- for (uint32_t s = 0; s < ARRAY_SIZE(lib->base.base.shaders); s++) {
- if (!lib->base.base.retained_shaders[s].nir)
- continue;
-
- pipeline->base.retained_shaders[s] = lib->base.base.retained_shaders[s];
- }
+ /* When link time optimization is enabled, import the retained NIR shaders from the library.
+ * Otherwise, import the compiled binaries (ie. fast link).
+ */
+ if (link_optimize) {
+ /* Import the NIR shaders (after SPIRV->NIR). */
+ for (uint32_t s = 0; s < ARRAY_SIZE(lib->base.base.shaders); s++) {
+ if (!lib->base.base.retained_shaders[s].nir)
+ continue;
- if (!link_optimize) {
+ pipeline->base.retained_shaders[s] = lib->base.base.retained_shaders[s];
+ }
+ } else {
/* Import the compiled shaders. */
for (uint32_t s = 0; s < ARRAY_SIZE(lib->base.base.shaders); s++) {
if (!lib->base.base.shaders[s])
}
static void
-radv_pipeline_stage_retain_shader(struct radv_pipeline *pipeline, struct radv_pipeline_stage *stage)
-{
- gl_shader_stage s = stage->stage;
-
- pipeline->retained_shaders[s].nir = stage->nir;
-}
-
-static void
radv_pipeline_get_nir(struct radv_pipeline *pipeline, struct radv_pipeline_stage *stages,
const struct radv_pipeline_key *pipeline_key, bool retain_shaders)
{
assert(retain_shaders || pipeline->shaders[s] == NULL);
if (pipeline->retained_shaders[s].nir) {
+ /* Clone the NIR shader because it's imported from a library. */
stages[s].nir = nir_shader_clone(NULL, pipeline->retained_shaders[s].nir);
} else {
stages[s].nir = radv_shader_spirv_to_nir(device, &stages[s], pipeline_key,
pipeline->is_internal);
}
- if (retain_shaders)
- radv_pipeline_stage_retain_shader(pipeline, &stages[s]);
+ if (retain_shaders) {
+ /* Clone the NIR shader because NIR passes after this step will change it. */
+ pipeline->retained_shaders[s].nir = nir_shader_clone(NULL, stages[s].nir);
+ }
stages[s].feedback.duration += os_time_get_nano() - stage_start;
}
radv_pipeline_get_nir(pipeline, stages, pipeline_key, retain_shaders);
- if (retain_shaders) {
- result = VK_SUCCESS;
- goto done;
- }
-
/* Force per-vertex VRS. */
if (radv_consider_force_vrs(pipeline, noop_fs, stages, *last_vgt_api_stage)) {
assert(*last_vgt_api_stage == MESA_SHADER_VERTEX ||