zink: use zink_shader_object for precompiled separate shaders

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22612>
This commit is contained in:
Mike Blumenkrantz 2023-03-31 15:52:46 -04:00 committed by Marge Bot
parent d733e24648
commit 535a8f0e96
3 changed files with 7 additions and 8 deletions

View file

@ -4976,8 +4976,8 @@ zink_shader_free(struct zink_screen *screen, struct zink_shader *shader)
util_queue_fence_wait(&shader->precompile.fence);
util_queue_fence_destroy(&shader->precompile.fence);
zink_descriptor_shader_deinit(screen, shader);
if (shader->precompile.mod)
VKSCR(DestroyShaderModule)(screen->dev, shader->precompile.mod, NULL);
if (shader->precompile.obj.mod)
VKSCR(DestroyShaderModule)(screen->dev, shader->precompile.obj.mod, NULL);
if (shader->precompile.gpl)
VKSCR(DestroyPipeline)(screen->dev, shader->precompile.gpl, NULL);
blob_finish(&shader->blob);

View file

@ -1128,7 +1128,7 @@ create_gfx_program_separable(struct zink_context *ctx, struct zink_shader **stag
unsigned shader_stages = BITFIELD_BIT(MESA_SHADER_VERTEX) | BITFIELD_BIT(MESA_SHADER_FRAGMENT);
/* filter cases that need real pipelines */
if (ctx->shader_stages != shader_stages ||
!stages[MESA_SHADER_VERTEX]->precompile.mod || !stages[MESA_SHADER_FRAGMENT]->precompile.mod ||
!stages[MESA_SHADER_VERTEX]->precompile.obj.mod || !stages[MESA_SHADER_FRAGMENT]->precompile.obj.mod ||
/* TODO: maybe try variants? grimace */
!ZINK_SHADER_KEY_OPTIMAL_IS_DEFAULT(ctx->gfx_pipeline_state.optimal_key) ||
!zink_can_use_pipeline_libs(ctx))
@ -2055,11 +2055,10 @@ precompile_separate_shader_job(void *data, void *gdata, int thread_index)
struct zink_screen *screen = gdata;
struct zink_shader *zs = data;
struct zink_shader_object obj = zink_shader_compile_separate(screen, zs);
zs->precompile.mod = obj.mod;
zs->precompile.obj = zink_shader_compile_separate(screen, zs);
zink_descriptor_shader_init(screen, zs);
VkShaderModule mods[ZINK_GFX_SHADER_COUNT] = {0};
mods[zs->info.stage] = zs->precompile.mod;
mods[zs->info.stage] = zs->precompile.obj.mod;
zs->precompile.gpl = zink_create_gfx_pipeline_separate(screen, mods, zs->precompile.layout);
}
@ -2074,7 +2073,7 @@ zink_link_gfx_shader(struct pipe_context *pctx, void **shaders)
if (!shaders[MESA_SHADER_VERTEX] || !shaders[MESA_SHADER_FRAGMENT]) {
if (shaders[MESA_SHADER_VERTEX] || shaders[MESA_SHADER_FRAGMENT]) {
struct zink_shader *zs = shaders[MESA_SHADER_VERTEX] ? shaders[MESA_SHADER_VERTEX] : shaders[MESA_SHADER_FRAGMENT];
if (zs->info.separate_shader && !zs->precompile.mod && util_queue_fence_is_signalled(&zs->precompile.fence) &&
if (zs->info.separate_shader && !zs->precompile.obj.mod && util_queue_fence_is_signalled(&zs->precompile.fence) &&
zink_descriptor_mode == ZINK_DESCRIPTOR_MODE_DB &&
/* sample shading can't precompile */
(!shaders[MESA_SHADER_FRAGMENT] || !zs->info.fs.uses_sample_shading))

View file

@ -764,7 +764,7 @@ struct zink_shader {
struct {
struct util_queue_fence fence;
VkShaderModule mod;
struct zink_shader_object obj;
VkDescriptorSetLayout dsl;
VkPipelineLayout layout;
VkPipeline gpl;