From 6f0303ba7674120443b3f8ce3e66019362d2be85 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 1 Feb 2023 10:45:24 -0500 Subject: [PATCH] lavapipe: break out (and slightly refactor) gallium shader cso creation there's also now a(n unused) flag to indicate that the csos have been created Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_pipeline.c | 53 ++++++++++--------- src/gallium/frontends/lavapipe/lvp_private.h | 4 ++ 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 60a58c11605..b777b6c45a6 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -870,31 +870,12 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline, pipeline->line_rectangular = true; lvp_pipeline_xfb_init(pipeline); } + if (!pipeline->library) + lvp_pipeline_shaders_compile(pipeline); - if (!pipeline->library) { - bool has_fragment_shader = false; - for (uint32_t i = 0; i < ARRAY_SIZE(pipeline->pipeline_nir); i++) { - if (!pipeline->pipeline_nir[i]) - continue; - - gl_shader_stage stage = i; - assert(stage == pipeline->pipeline_nir[i]->nir->info.stage); - enum pipe_shader_type pstage = pipe_shader_type_from_mesa(stage); - if (!pipeline->inlines[stage].can_inline) { - pipeline->shader_cso[pstage] = lvp_pipeline_compile(pipeline, - nir_shader_clone(NULL, pipeline->pipeline_nir[stage]->nir)); - if (pipeline->tess_ccw) - pipeline->tess_ccw_cso = lvp_pipeline_compile(pipeline, - nir_shader_clone(NULL, pipeline->tess_ccw->nir)); - } - if (stage == MESA_SHADER_FRAGMENT) - has_fragment_shader = true; - } - - if (has_fragment_shader == false) { - pipeline->noop_fs = true; - pipeline->shader_cso[PIPE_SHADER_FRAGMENT] = device->noop_fs; - } + if (!pipeline->library && !pipeline->pipeline_nir[MESA_SHADER_FRAGMENT]) { + pipeline->noop_fs = true; + pipeline->shader_cso[PIPE_SHADER_FRAGMENT] = device->noop_fs; } return VK_SUCCESS; @@ -907,6 +888,29 @@ fail: return result; } +void +lvp_pipeline_shaders_compile(struct lvp_pipeline *pipeline) +{ + if (pipeline->compiled) + return; + for (uint32_t i = 0; i < ARRAY_SIZE(pipeline->pipeline_nir); i++) { + if (!pipeline->pipeline_nir[i]) + continue; + + gl_shader_stage stage = i; + assert(stage == pipeline->pipeline_nir[i]->nir->info.stage); + + if (!pipeline->inlines[stage].can_inline) { + pipeline->shader_cso[stage] = lvp_pipeline_compile(pipeline, + nir_shader_clone(NULL, pipeline->pipeline_nir[stage]->nir)); + if (pipeline->tess_ccw) + pipeline->tess_ccw_cso = lvp_pipeline_compile(pipeline, + nir_shader_clone(NULL, pipeline->tess_ccw->nir)); + } + } + pipeline->compiled = true; +} + static VkResult lvp_graphics_pipeline_create( VkDevice _device, @@ -1000,6 +1004,7 @@ lvp_compute_pipeline_init(struct lvp_pipeline *pipeline, if (!pipeline->inlines[MESA_SHADER_COMPUTE].can_inline) pipeline->shader_cso[PIPE_SHADER_COMPUTE] = lvp_pipeline_compile(pipeline, nir_shader_clone(NULL, pipeline->pipeline_nir[MESA_SHADER_COMPUTE]->nir)); + pipeline->compiled = true; return VK_SUCCESS; } diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index 48817bb3957..dc5f8f76557 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -456,8 +456,12 @@ struct lvp_pipeline { bool gs_output_lines; bool library; bool noop_fs; + bool compiled; }; +void +lvp_pipeline_shaders_compile(struct lvp_pipeline *pipeline); + struct lvp_event { struct vk_object_base base; volatile uint64_t event_storage;