mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-06 11:00:11 +01:00
anv: fix multiple creation with internal failure
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
dEQP-VK.api.object_management.alloc_callback_fail_multiple.compute_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)
v5: Move array cleanup out of loop (Jason)
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
This commit is contained in:
parent
33fa4c99f7
commit
a8eeb089c0
1 changed files with 20 additions and 18 deletions
|
|
@ -1469,22 +1469,23 @@ VkResult genX(CreateGraphicsPipelines)(
|
|||
|
||||
VkResult result = VK_SUCCESS;
|
||||
|
||||
unsigned i = 0;
|
||||
for (; i < count; i++) {
|
||||
unsigned i;
|
||||
for (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)
|
||||
break;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
for (; i < count; i++)
|
||||
pPipelines[i] = VK_NULL_HANDLE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
VkResult genX(CreateComputePipelines)(
|
||||
|
|
@ -1499,19 +1500,20 @@ VkResult genX(CreateComputePipelines)(
|
|||
|
||||
VkResult result = VK_SUCCESS;
|
||||
|
||||
unsigned i = 0;
|
||||
for (; i < count; i++) {
|
||||
unsigned i;
|
||||
for (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)
|
||||
break;
|
||||
}
|
||||
|
||||
return VK_SUCCESS;
|
||||
for (; i < count; i++)
|
||||
pPipelines[i] = VK_NULL_HANDLE;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue