radv: Don't bail out on pipeline create failure.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 16 Dec 2016 22:10:31 +0000 (23:10 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sat, 17 Dec 2016 10:41:53 +0000 (11:41 +0100)
The spec says we have to try to create all, and only set failed
pipelines to VK_NULL_HANDLE. If one of them fails, we have to return
an error, but as far as I can see, the spec does not care which of
the suberrors.

Fixes
dEQP-VK.api.object_management.alloc_callback_fail_multiple.compute_pipeline
dEQP-VK.api.object_management.alloc_callback_fail_multiple.graphics_pipeline

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_pipeline.c

index f7e60c988c8988cff3f0c4e9a856b77b82ae1433..f14e5dfdfb54b08f46fea98f2b5105c0ba6c5187 100644 (file)
@@ -1461,20 +1461,18 @@ VkResult radv_CreateGraphicsPipelines(
        unsigned i = 0;
 
        for (; i < count; i++) {
-               result = radv_graphics_pipeline_create(_device,
-                                                      pipelineCache,
-                                                      &pCreateInfos[i],
-                                                      NULL, pAllocator, &pPipelines[i]);
-               if (result != VK_SUCCESS) {
-                       for (unsigned j = 0; j < i; j++) {
-                               radv_DestroyPipeline(_device, pPipelines[j], pAllocator);
-                       }
-
-                       return result;
+               VkResult r;
+               r = radv_graphics_pipeline_create(_device,
+                                                 pipelineCache,
+                                                 &pCreateInfos[i],
+                                                 NULL, pAllocator, &pPipelines[i]);
+               if (r != VK_SUCCESS) {
+                       result = r;
+                       pPipelines[i] = VK_NULL_HANDLE;
                }
        }
 
-       return VK_SUCCESS;
+       return result;
 }
 
 static VkResult radv_compute_pipeline_create(
@@ -1525,17 +1523,15 @@ VkResult radv_CreateComputePipelines(
 
        unsigned i = 0;
        for (; i < count; i++) {
-               result = radv_compute_pipeline_create(_device, pipelineCache,
-                                                     &pCreateInfos[i],
-                                                     pAllocator, &pPipelines[i]);
-               if (result != VK_SUCCESS) {
-                       for (unsigned j = 0; j < i; j++) {
-                               radv_DestroyPipeline(_device, pPipelines[j], pAllocator);
-                       }
-
-                       return result;
+               VkResult r;
+               r = radv_compute_pipeline_create(_device, pipelineCache,
+                                                &pCreateInfos[i],
+                                                pAllocator, &pPipelines[i]);
+               if (r != VK_SUCCESS) {
+                       result = r;
+                       pPipelines[i] = VK_NULL_HANDLE;
                }
        }
 
-       return VK_SUCCESS;
+       return result;
 }