layers: Handle partial failure in vkCreate*Pipelines
This applies to vkCreate*Pipelines creating multiple objects with
a single call.
Creation of *some* pipelines may fail and an error code will be
returned. In this case invalid handles will be set to NULL, and
the remaining handles must be managed properly.
diff --git a/layers/object_tracker.cpp b/layers/object_tracker.cpp
index 172d81e..1691f3e 100644
--- a/layers/object_tracker.cpp
+++ b/layers/object_tracker.cpp
@@ -3589,8 +3589,8 @@
VkResult result = get_dispatch_table(ot_device_table_map, device)
->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
lock.lock();
- if (result == VK_SUCCESS) {
- for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
+ for (uint32_t idx2 = 0; idx2 < createInfoCount; ++idx2) {
+ if (pPipelines[idx2] != VK_NULL_HANDLE) {
CreateObject(device, pPipelines[idx2], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
}
}
@@ -3631,8 +3631,8 @@
VkResult result = get_dispatch_table(ot_device_table_map, device)
->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
lock.lock();
- if (result == VK_SUCCESS) {
- for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
+ for (uint32_t idx1 = 0; idx1 < createInfoCount; ++idx1) {
+ if (pPipelines[idx1] != VK_NULL_HANDLE) {
CreateObject(device, pPipelines[idx1], VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, pAllocator);
}
}