diff options
Diffstat (limited to 'src/gallium/frontends/lavapipe/lvp_pipeline.c')
-rw-r--r-- | src/gallium/frontends/lavapipe/lvp_pipeline.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 91375d4b11a..a183561d671 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -1118,16 +1118,23 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateGraphicsPipelines( unsigned i = 0; for (; i < count; i++) { - VkResult r; - r = lvp_graphics_pipeline_create(_device, - pipelineCache, - &pCreateInfos[i], - pAllocator, &pPipelines[i]); + VkResult r = VK_PIPELINE_COMPILE_REQUIRED; + if (!(pCreateInfos[i].flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT)) + r = lvp_graphics_pipeline_create(_device, + pipelineCache, + &pCreateInfos[i], + pAllocator, &pPipelines[i]); if (r != VK_SUCCESS) { result = r; pPipelines[i] = VK_NULL_HANDLE; + if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT) + break; } } + if (result != VK_SUCCESS) { + for (; i < count; i++) + pPipelines[i] = VK_NULL_HANDLE; + } return result; } @@ -1217,16 +1224,24 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateComputePipelines( unsigned i = 0; for (; i < count; i++) { - VkResult r; - r = lvp_compute_pipeline_create(_device, - pipelineCache, - &pCreateInfos[i], - pAllocator, &pPipelines[i]); + VkResult r = VK_PIPELINE_COMPILE_REQUIRED; + if (!(pCreateInfos[i].flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT)) + r = lvp_compute_pipeline_create(_device, + pipelineCache, + &pCreateInfos[i], + pAllocator, &pPipelines[i]); if (r != VK_SUCCESS) { result = r; pPipelines[i] = VK_NULL_HANDLE; + if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT) + break; } } + if (result != VK_SUCCESS) { + for (; i < count; i++) + pPipelines[i] = VK_NULL_HANDLE; + } + return result; } |