The specification section 9.4 says : When an application attempts to create many pipelines in a single command, it is possible that some subset may fail creation. In that case, the corresponding entries in the pPipelines output array will be filled with VK_NULL_HANDLE values. If any pipeline fails creation (for example, due to out of memory errors), the vkCreate*Pipelines commands will return an error code. The implementation will attempt to create all pipelines, and only return VK_NULL_HANDLE values for those that actually failed.
Fixes : dEQP-VK.api.object_management.alloc_callback_fail_multiple.graphics_pipeline v2: C is hard let's go shopping (Lionel) v3: Remove unnecessary condition in for loops (Lionel) v4: Document why we return on first failure (Eduardo) Move i declaration inside for() (Eduardo) Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> --- src/intel/vulkan/genX_pipeline.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c index 845d0204d8..f5bf8944e3 100644 --- a/src/intel/vulkan/genX_pipeline.c +++ b/src/intel/vulkan/genX_pipeline.c @@ -1469,22 +1469,22 @@ VkResult genX(CreateGraphicsPipelines)( VkResult result = VK_SUCCESS; - unsigned i = 0; - for (; i < count; i++) { + for (unsigned i = 0; i < count; i++) { result = genX(graphics_pipeline_create)(_device, pipeline_cache, &pCreateInfos[i], pAllocator, &pPipelines[i]); - if (result != VK_SUCCESS) { - for (unsigned j = 0; j < i; j++) { - anv_DestroyPipeline(_device, pPipelines[j], pAllocator); - } - return result; + /* Bail out on the first error as it is not obvious what error should be + * report upon 2 different failures. */ + if (result != VK_SUCCESS) { + for (; i < count; i++) + pPipelines[i] = VK_NULL_HANDLE; + break; } } - return VK_SUCCESS; + return result; } VkResult genX(CreateComputePipelines)( @@ -1499,19 +1499,19 @@ VkResult genX(CreateComputePipelines)( VkResult result = VK_SUCCESS; - unsigned i = 0; - for (; i < count; i++) { + for (unsigned i = 0; i < count; i++) { result = compute_pipeline_create(_device, pipeline_cache, &pCreateInfos[i], pAllocator, &pPipelines[i]); - if (result != VK_SUCCESS) { - for (unsigned j = 0; j < i; j++) { - anv_DestroyPipeline(_device, pPipelines[j], pAllocator); - } - return result; + /* Bail out on the first error as it is not obvious what error should be + * report upon 2 different failures. */ + if (result != VK_SUCCESS) { + for (; i < count; i++) + pPipelines[i] = VK_NULL_HANDLE; + break; } } - return VK_SUCCESS; + return result; } -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev