diff options
| author | Maciej Jesionowski <maciej.jesionowski@mobica.com> | 2016-11-23 10:44:34 +0100 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-11-23 16:04:24 -0700 |
| commit | 73a548c8f80490526cf3c15e92f95918491e3e2e (patch) | |
| tree | 6c8cfd39b0ef384b0b4c7f8bac242f715e2bdedd /layers/unique_objects.cpp | |
| parent | c191c5de1fc1baad5d8ecf5cb3790d1fdc126c70 (diff) | |
| download | usermoji-73a548c8f80490526cf3c15e92f95918491e3e2e.tar.xz | |
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.
Diffstat (limited to 'layers/unique_objects.cpp')
| -rw-r--r-- | layers/unique_objects.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/layers/unique_objects.cpp b/layers/unique_objects.cpp index 0d81c809..3a0945a8 100644 --- a/layers/unique_objects.cpp +++ b/layers/unique_objects.cpp @@ -428,13 +428,15 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateComputePipelines(VkDevice device, VkPipelin VkResult result = my_device_data->device_dispatch_table->CreateComputePipelines( device, pipelineCache, createInfoCount, (const VkComputePipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); delete[] local_pCreateInfos; - if (VK_SUCCESS == result) { + { uint64_t unique_id = 0; std::lock_guard<std::mutex> lock(global_lock); for (uint32_t i = 0; i < createInfoCount; ++i) { - unique_id = global_unique_id++; - my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); - pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); + if (pPipelines[i] != VK_NULL_HANDLE) { + unique_id = global_unique_id++; + my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); + pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); + } } } return result; @@ -484,13 +486,15 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateGraphicsPipelines(VkDevice device, VkPipeli VkResult result = my_device_data->device_dispatch_table->CreateGraphicsPipelines( device, pipelineCache, createInfoCount, (const VkGraphicsPipelineCreateInfo *)local_pCreateInfos, pAllocator, pPipelines); delete[] local_pCreateInfos; - if (VK_SUCCESS == result) { + { uint64_t unique_id = 0; std::lock_guard<std::mutex> lock(global_lock); for (uint32_t i = 0; i < createInfoCount; ++i) { - unique_id = global_unique_id++; - my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); - pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); + if (pPipelines[i] != VK_NULL_HANDLE) { + unique_id = global_unique_id++; + my_device_data->unique_id_mapping[unique_id] = reinterpret_cast<uint64_t &>(pPipelines[i]); + pPipelines[i] = reinterpret_cast<VkPipeline &>(unique_id); + } } } return result; |
