mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
zink: add more locking for pipeline cache
this ensures the size remains constant for entry updates fixes #9494 cc: mesa-stable Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24559>
This commit is contained in:
parent
eea408e563
commit
1c1e09249c
4 changed files with 24 additions and 3 deletions
|
|
@ -428,8 +428,10 @@ zink_create_gfx_pipeline(struct zink_screen *screen,
|
||||||
}
|
}
|
||||||
|
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
|
u_rwlock_wrlock(&prog->base.pipeline_cache_lock);
|
||||||
VkResult result = VKSCR(CreateGraphicsPipelines)(screen->dev, prog->base.pipeline_cache,
|
VkResult result = VKSCR(CreateGraphicsPipelines)(screen->dev, prog->base.pipeline_cache,
|
||||||
1, &pci, NULL, &pipeline);
|
1, &pci, NULL, &pipeline);
|
||||||
|
u_rwlock_wrunlock(&prog->base.pipeline_cache_lock);
|
||||||
if (result != VK_SUCCESS) {
|
if (result != VK_SUCCESS) {
|
||||||
mesa_loge("ZINK: vkCreateGraphicsPipelines failed (%s)", vk_Result_to_str(result));
|
mesa_loge("ZINK: vkCreateGraphicsPipelines failed (%s)", vk_Result_to_str(result));
|
||||||
return VK_NULL_HANDLE;
|
return VK_NULL_HANDLE;
|
||||||
|
|
@ -472,8 +474,10 @@ zink_create_compute_pipeline(struct zink_screen *screen, struct zink_compute_pro
|
||||||
pci.stage = stage;
|
pci.stage = stage;
|
||||||
|
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
|
u_rwlock_wrlock(&comp->base.pipeline_cache_lock);
|
||||||
VkResult result = VKSCR(CreateComputePipelines)(screen->dev, comp->base.pipeline_cache,
|
VkResult result = VKSCR(CreateComputePipelines)(screen->dev, comp->base.pipeline_cache,
|
||||||
1, &pci, NULL, &pipeline);
|
1, &pci, NULL, &pipeline);
|
||||||
|
u_rwlock_wrunlock(&comp->base.pipeline_cache_lock);
|
||||||
if (result != VK_SUCCESS) {
|
if (result != VK_SUCCESS) {
|
||||||
mesa_loge("ZINK: vkCreateComputePipelines failed (%s)", vk_Result_to_str(result));
|
mesa_loge("ZINK: vkCreateComputePipelines failed (%s)", vk_Result_to_str(result));
|
||||||
return VK_NULL_HANDLE;
|
return VK_NULL_HANDLE;
|
||||||
|
|
@ -813,7 +817,10 @@ create_gfx_pipeline_library(struct zink_screen *screen, struct zink_shader_objec
|
||||||
VkPipeline
|
VkPipeline
|
||||||
zink_create_gfx_pipeline_library(struct zink_screen *screen, struct zink_gfx_program *prog)
|
zink_create_gfx_pipeline_library(struct zink_screen *screen, struct zink_gfx_program *prog)
|
||||||
{
|
{
|
||||||
return create_gfx_pipeline_library(screen, prog->objs, prog->base.layout, prog->base.pipeline_cache);
|
u_rwlock_wrlock(&prog->base.pipeline_cache_lock);
|
||||||
|
VkPipeline pipeline = create_gfx_pipeline_library(screen, prog->objs, prog->base.layout, prog->base.pipeline_cache);
|
||||||
|
u_rwlock_wrunlock(&prog->base.pipeline_cache_lock);
|
||||||
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkPipeline
|
VkPipeline
|
||||||
|
|
@ -851,11 +858,14 @@ zink_create_gfx_pipeline_combined(struct zink_screen *screen, struct zink_gfx_pr
|
||||||
pci.flags |= VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
|
pci.flags |= VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
|
||||||
|
|
||||||
VkPipeline pipeline;
|
VkPipeline pipeline;
|
||||||
|
u_rwlock_wrlock(&prog->base.pipeline_cache_lock);
|
||||||
if (VKSCR(CreateGraphicsPipelines)(screen->dev, prog->base.pipeline_cache, 1, &pci,
|
if (VKSCR(CreateGraphicsPipelines)(screen->dev, prog->base.pipeline_cache, 1, &pci,
|
||||||
NULL, &pipeline) != VK_SUCCESS) {
|
NULL, &pipeline) != VK_SUCCESS) {
|
||||||
mesa_loge("ZINK: vkCreateGraphicsPipelines failed");
|
mesa_loge("ZINK: vkCreateGraphicsPipelines failed");
|
||||||
|
u_rwlock_wrunlock(&prog->base.pipeline_cache_lock);
|
||||||
return VK_NULL_HANDLE;
|
return VK_NULL_HANDLE;
|
||||||
}
|
}
|
||||||
|
u_rwlock_wrunlock(&prog->base.pipeline_cache_lock);
|
||||||
|
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -961,6 +961,7 @@ create_program(struct zink_context *ctx, bool is_compute)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pipe_reference_init(&pg->reference, 1);
|
pipe_reference_init(&pg->reference, 1);
|
||||||
|
u_rwlock_init(&pg->pipeline_cache_lock);
|
||||||
util_queue_fence_init(&pg->cache_fence);
|
util_queue_fence_init(&pg->cache_fence);
|
||||||
pg->is_compute = is_compute;
|
pg->is_compute = is_compute;
|
||||||
pg->ctx = ctx;
|
pg->ctx = ctx;
|
||||||
|
|
@ -1494,6 +1495,7 @@ deinit_program(struct zink_screen *screen, struct zink_program *pg)
|
||||||
|
|
||||||
if (pg->pipeline_cache)
|
if (pg->pipeline_cache)
|
||||||
VKSCR(DestroyPipelineCache)(screen->dev, pg->pipeline_cache, NULL);
|
VKSCR(DestroyPipelineCache)(screen->dev, pg->pipeline_cache, NULL);
|
||||||
|
u_rwlock_destroy(&pg->pipeline_cache_lock);
|
||||||
zink_descriptor_program_deinit(screen, pg);
|
zink_descriptor_program_deinit(screen, pg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -322,17 +322,24 @@ cache_put_job(void *data, void *gdata, int thread_index)
|
||||||
struct zink_program *pg = data;
|
struct zink_program *pg = data;
|
||||||
struct zink_screen *screen = gdata;
|
struct zink_screen *screen = gdata;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
|
u_rwlock_rdlock(&pg->pipeline_cache_lock);
|
||||||
VkResult result = VKSCR(GetPipelineCacheData)(screen->dev, pg->pipeline_cache, &size, NULL);
|
VkResult result = VKSCR(GetPipelineCacheData)(screen->dev, pg->pipeline_cache, &size, NULL);
|
||||||
if (result != VK_SUCCESS) {
|
if (result != VK_SUCCESS) {
|
||||||
|
u_rwlock_rdunlock(&pg->pipeline_cache_lock);
|
||||||
mesa_loge("ZINK: vkGetPipelineCacheData failed (%s)", vk_Result_to_str(result));
|
mesa_loge("ZINK: vkGetPipelineCacheData failed (%s)", vk_Result_to_str(result));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pg->pipeline_cache_size == size)
|
if (pg->pipeline_cache_size == size) {
|
||||||
|
u_rwlock_rdunlock(&pg->pipeline_cache_lock);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
void *pipeline_data = malloc(size);
|
void *pipeline_data = malloc(size);
|
||||||
if (!pipeline_data)
|
if (!pipeline_data) {
|
||||||
|
u_rwlock_rdunlock(&pg->pipeline_cache_lock);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
result = VKSCR(GetPipelineCacheData)(screen->dev, pg->pipeline_cache, &size, pipeline_data);
|
result = VKSCR(GetPipelineCacheData)(screen->dev, pg->pipeline_cache, &size, pipeline_data);
|
||||||
|
u_rwlock_rdunlock(&pg->pipeline_cache_lock);
|
||||||
if (result == VK_SUCCESS) {
|
if (result == VK_SUCCESS) {
|
||||||
pg->pipeline_cache_size = size;
|
pg->pipeline_cache_size = size;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,7 @@
|
||||||
#include "util/hash_table.h"
|
#include "util/hash_table.h"
|
||||||
#include "util/list.h"
|
#include "util/list.h"
|
||||||
#include "util/log.h"
|
#include "util/log.h"
|
||||||
|
#include "util/rwlock.h"
|
||||||
#include "util/set.h"
|
#include "util/set.h"
|
||||||
#include "util/simple_mtx.h"
|
#include "util/simple_mtx.h"
|
||||||
#include "util/slab.h"
|
#include "util/slab.h"
|
||||||
|
|
@ -995,6 +996,7 @@ struct zink_program {
|
||||||
struct zink_context *ctx;
|
struct zink_context *ctx;
|
||||||
unsigned char sha1[20];
|
unsigned char sha1[20];
|
||||||
struct util_queue_fence cache_fence;
|
struct util_queue_fence cache_fence;
|
||||||
|
struct u_rwlock pipeline_cache_lock;
|
||||||
VkPipelineCache pipeline_cache;
|
VkPipelineCache pipeline_cache;
|
||||||
size_t pipeline_cache_size;
|
size_t pipeline_cache_size;
|
||||||
struct zink_batch_usage *batch_uses;
|
struct zink_batch_usage *batch_uses;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue