turnip: Fix failure behavior of vkCreateGraphicsPipelines.

According to the 1.1.123 spec:

    "The implementation will attempt to create all pipelines, and only
     return VK_NULL_HANDLE values for those that actually failed."

Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
This commit is contained in:
Eric Anholt
2019-09-19 11:09:46 -07:00
parent ab3cf128a6
commit 67e8977290

View File

@@ -1876,6 +1876,7 @@ tu_CreateGraphicsPipelines(VkDevice device,
{ {
TU_FROM_HANDLE(tu_device, dev, device); TU_FROM_HANDLE(tu_device, dev, device);
TU_FROM_HANDLE(tu_pipeline_cache, cache, pipelineCache); TU_FROM_HANDLE(tu_pipeline_cache, cache, pipelineCache);
VkResult final_result = VK_SUCCESS;
for (uint32_t i = 0; i < count; i++) { for (uint32_t i = 0; i < count; i++) {
struct tu_pipeline_builder builder; struct tu_pipeline_builder builder;
@@ -1886,19 +1887,15 @@ tu_CreateGraphicsPipelines(VkDevice device,
VkResult result = tu_pipeline_builder_build(&builder, &pipeline); VkResult result = tu_pipeline_builder_build(&builder, &pipeline);
tu_pipeline_builder_finish(&builder); tu_pipeline_builder_finish(&builder);
if (result != VK_SUCCESS) { if (result == VK_SUCCESS) {
for (uint32_t j = 0; j < i; j++) { pPipelines[i] = tu_pipeline_to_handle(pipeline);
tu_DestroyPipeline(device, pPipelines[j], pAllocator); } else {
pPipelines[j] = VK_NULL_HANDLE; pPipelines[i] = NULL;
} final_result = result;
return result;
} }
pPipelines[i] = tu_pipeline_to_handle(pipeline);
} }
return VK_SUCCESS; return final_result;
} }
static VkResult static VkResult