zink: create a VkPipelineCache object on the screen and use it

this enables reuse of shaders across pipelines

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9094>
This commit is contained in:
Mike Blumenkrantz 2020-10-06 10:13:58 -04:00 committed by Marge Bot
parent de6ed18584
commit eb3cb170fc
3 changed files with 13 additions and 2 deletions

View file

@ -181,7 +181,7 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
pci.stageCount = num_stages;
VkPipeline pipeline;
if (vkCreateGraphicsPipelines(screen->dev, VK_NULL_HANDLE, 1, &pci,
if (vkCreateGraphicsPipelines(screen->dev, screen->pipeline_cache, 1, &pci,
NULL, &pipeline) != VK_SUCCESS) {
debug_printf("vkCreateGraphicsPipelines failed\n");
return VK_NULL_HANDLE;
@ -207,7 +207,7 @@ zink_create_compute_pipeline(struct zink_screen *screen, struct zink_compute_pro
pci.stage = stage;
VkPipeline pipeline;
if (vkCreateComputePipelines(screen->dev, VK_NULL_HANDLE, 1, &pci,
if (vkCreateComputePipelines(screen->dev, screen->pipeline_cache, 1, &pci,
NULL, &pipeline) != VK_SUCCESS) {
debug_printf("vkCreateComputePipelines failed\n");
return VK_NULL_HANDLE;

View file

@ -772,6 +772,7 @@ zink_destroy_screen(struct pipe_screen *pscreen)
}
u_transfer_helper_destroy(pscreen->transfer_helper);
vkDestroyPipelineCache(screen->dev, screen->pipeline_cache, NULL);
vkDestroyDevice(screen->dev, NULL);
vkDestroyInstance(screen->instance, NULL);
@ -1230,6 +1231,15 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
zink_screen_init_compiler(screen);
VkPipelineCacheCreateInfo pcci;
pcci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
pcci.pNext = NULL;
/* we're single-threaded now, so we don't need synchronization */
pcci.flags = screen->info.have_EXT_pipeline_creation_cache_control ? VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT : 0;
pcci.initialDataSize = 0;
pcci.pInitialData = NULL;
vkCreatePipelineCache(screen->dev, &pcci, NULL, &screen->pipeline_cache);
slab_create_parent(&screen->transfer_pool, sizeof(struct zink_transfer), 16);
return screen;

View file

@ -51,6 +51,7 @@ struct zink_screen {
struct sw_winsys *winsys;
struct slab_parent_pool transfer_pool;
VkPipelineCache pipeline_cache;
unsigned shader_id;