[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