mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 19:50:11 +01:00
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:
parent
caf79bd421
commit
a1fb2e9c27
5 changed files with 47 additions and 18 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue