zink: use u_live_shader_cache

let the duplicated shader madness end

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11403>
This commit is contained in:
Mike Blumenkrantz 2021-05-10 06:50:49 -04:00 committed by Marge Bot
parent caf79bd421
commit a1fb2e9c27
5 changed files with 47 additions and 18 deletions

View file

@ -29,6 +29,7 @@
#include "compiler/nir/nir.h"
#include "compiler/shader_info.h"
#include "util/u_live_shader_cache.h"
#include <vulkan/vulkan.h>
#include "zink_descriptors.h"
@ -66,6 +67,7 @@ struct nir_shader *
zink_tgsi_to_nir(struct pipe_screen *screen, const struct tgsi_token *tokens);
struct zink_shader {
struct util_live_shader base;
unsigned shader_id;
struct nir_shader *nir;

View file

@ -1031,12 +1031,6 @@ zink_bind_tes_state(struct pipe_context *pctx,
bind_stage(ctx, PIPE_SHADER_TESS_EVAL, cso);
}
static void
zink_delete_shader_state(struct pipe_context *pctx, void *cso)
{
zink_shader_free(zink_context(pctx), cso);
}
static void *
zink_create_cs_state(struct pipe_context *pctx,
const struct pipe_compute_state *shader)
@ -1057,10 +1051,16 @@ zink_bind_cs_state(struct pipe_context *pctx,
bind_stage(zink_context(pctx), PIPE_SHADER_COMPUTE, cso);
}
static void *
void
zink_delete_shader_state(struct pipe_context *pctx, void *cso)
{
zink_shader_free(zink_context(pctx), cso);
}
void *
zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader_state *shader)
{
struct nir_shader *nir;
nir_shader *nir;
if (shader->type != PIPE_SHADER_IR_NIR)
nir = zink_tgsi_to_nir(pctx->screen, shader->tokens);
else
@ -1069,28 +1069,43 @@ zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader
return zink_shader_create(zink_screen(pctx->screen), nir, &shader->stream_output);
}
static void
zink_delete_cached_shader_state(struct pipe_context *pctx, void *cso)
{
struct zink_screen *screen = zink_screen(pctx->screen);
util_shader_reference(pctx, &screen->shaders, &cso, NULL);
}
static void *
zink_create_cached_shader_state(struct pipe_context *pctx, const struct pipe_shader_state *shader)
{
bool cache_hit;
struct zink_screen *screen = zink_screen(pctx->screen);
return util_live_shader_cache_get(pctx, &screen->shaders, shader, &cache_hit);
}
void
zink_program_init(struct zink_context *ctx)
{
ctx->base.create_vs_state = zink_create_gfx_shader_state;
ctx->base.create_vs_state = zink_create_cached_shader_state;
ctx->base.bind_vs_state = zink_bind_vs_state;
ctx->base.delete_vs_state = zink_delete_shader_state;
ctx->base.delete_vs_state = zink_delete_cached_shader_state;
ctx->base.create_fs_state = zink_create_gfx_shader_state;
ctx->base.create_fs_state = zink_create_cached_shader_state;
ctx->base.bind_fs_state = zink_bind_fs_state;
ctx->base.delete_fs_state = zink_delete_shader_state;
ctx->base.delete_fs_state = zink_delete_cached_shader_state;
ctx->base.create_gs_state = zink_create_gfx_shader_state;
ctx->base.create_gs_state = zink_create_cached_shader_state;
ctx->base.bind_gs_state = zink_bind_gs_state;
ctx->base.delete_gs_state = zink_delete_shader_state;
ctx->base.delete_gs_state = zink_delete_cached_shader_state;
ctx->base.create_tcs_state = zink_create_gfx_shader_state;
ctx->base.create_tcs_state = zink_create_cached_shader_state;
ctx->base.bind_tcs_state = zink_bind_tcs_state;
ctx->base.delete_tcs_state = zink_delete_shader_state;
ctx->base.delete_tcs_state = zink_delete_cached_shader_state;
ctx->base.create_tes_state = zink_create_gfx_shader_state;
ctx->base.create_tes_state = zink_create_cached_shader_state;
ctx->base.bind_tes_state = zink_bind_tes_state;
ctx->base.delete_tes_state = zink_delete_shader_state;
ctx->base.delete_tes_state = zink_delete_cached_shader_state;
ctx->base.create_compute_state = zink_create_cs_state;
ctx->base.bind_compute_state = zink_bind_cs_state;

View file

@ -128,6 +128,11 @@ zink_desc_type_from_vktype(VkDescriptorType type)
}
void
zink_delete_shader_state(struct pipe_context *pctx, void *cso);
void *
zink_create_gfx_shader_state(struct pipe_context *pctx, const struct pipe_shader_state *shader);
unsigned
zink_program_num_bindings_typed(const struct zink_program *pg, enum zink_descriptor_type type, bool is_compute);

View file

@ -31,6 +31,7 @@
#include "zink_format.h"
#include "zink_framebuffer.h"
#include "zink_instance.h"
#include "zink_program.h"
#include "zink_public.h"
#include "zink_resource.h"
#include "nir_to_spirv/nir_to_spirv.h" // for SPIRV_VERSION
@ -1012,6 +1013,8 @@ zink_destroy_screen(struct pipe_screen *pscreen)
simple_mtx_destroy(&screen->mem_cache_mtx);
vkDestroyPipelineCache(screen->dev, screen->pipeline_cache, NULL);
util_live_shader_cache_deinit(&screen->shaders);
if (screen->sem)
vkDestroySemaphore(screen->dev, screen->sem, NULL);
if (screen->prev_sem)
@ -1654,6 +1657,7 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
#endif // VK_EXTX_PORTABILITY_SUBSET_EXTENSION_NAME
check_base_requirements(screen);
util_live_shader_cache_init(&screen->shaders, zink_create_gfx_shader_state, zink_delete_shader_state);
screen->base.get_name = zink_get_name;
screen->base.get_vendor = zink_get_vendor;

View file

@ -35,6 +35,7 @@
#include "util/disk_cache.h"
#include "util/log.h"
#include "util/simple_mtx.h"
#include "util/u_live_shader_cache.h"
#include <vulkan/vulkan.h>
@ -88,6 +89,8 @@ struct zink_screen {
struct disk_cache *disk_cache;
cache_key disk_cache_key;
struct util_live_shader_cache shaders;
simple_mtx_t mem_cache_mtx;
struct hash_table *resource_mem_cache;