[Mesa-dev] [PATCH 4/4] radv: make sure gs copy shader is retrieved from the cache with the variant
Timothy Arceri
tarceri at itsqueeze.com
Wed Mar 15 04:17:33 UTC 2017
Apps can limit the size of the cache via VkAllocationCallbacks so we
can't be sure that both are always in the cache.
---
src/amd/vulkan/radv_pipeline.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 73a3776..0eeb535 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -532,33 +532,38 @@ radv_pipeline_compile(struct radv_pipeline *pipeline,
cache,
sha1);
if (stage == MESA_SHADER_GEOMETRY) {
pipeline->gs_copy_shader =
radv_create_shader_variant_from_pipeline_cache(
pipeline->device,
cache,
gs_copy_sha1);
}
- if (variant)
+
+ if (variant &&
+ (stage != MESA_SHADER_GEOMETRY || pipeline->gs_copy_shader))
return variant;
nir = radv_shader_compile_to_nir(pipeline->device,
module, entrypoint, stage,
spec_info, dump);
if (nir == NULL)
return NULL;
- variant = radv_shader_variant_create(pipeline->device, nir, layout, key,
- &code, &code_size, dump);
+ if (!variant) {
+ variant = radv_shader_variant_create(pipeline->device, nir,
+ layout, key, &code,
+ &code_size, dump);
+ }
- if (stage == MESA_SHADER_GEOMETRY) {
+ if (stage == MESA_SHADER_GEOMETRY && !pipeline->gs_copy_shader) {
void *gs_copy_code = NULL;
unsigned gs_copy_code_size = 0;
pipeline->gs_copy_shader = radv_pipeline_create_gs_copy_shader(
pipeline, nir, &gs_copy_code, &gs_copy_code_size, dump);
if (pipeline->gs_copy_shader) {
pipeline->gs_copy_shader =
radv_pipeline_cache_insert_shader(pipeline->device,
cache,
gs_copy_sha1,
--
2.9.3
More information about the mesa-dev
mailing list