Mesa (main): tu: Implement VK_EXT_pipeline_creation_cache_control
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed May 18 13:40:14 UTC 2022
Module: Mesa
Branch: main
Commit: 9f67fa368e3fc989e0b2d02146b20966fefb5c04
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f67fa368e3fc989e0b2d02146b20966fefb5c04
Author: Connor Abbott <cwabbott0 at gmail.com>
Date: Tue May 17 16:28:30 2022 +0200
tu: Implement VK_EXT_pipeline_creation_cache_control
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16562>
---
docs/features.txt | 2 +-
src/freedreno/vulkan/tu_device.c | 3 ++-
src/freedreno/vulkan/tu_pipeline.c | 41 +++++++++++++++++++++++++++++++++-----
3 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/docs/features.txt b/docs/features.txt
index 7aad2e89948..d9e67c87abe 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -484,7 +484,7 @@ Vulkan 1.3 -- all DONE: anv, radv, lvp
VK_EXT_extended_dynamic_state DONE (anv, lvp, radv, tu)
VK_EXT_extended_dynamic_state2 DONE (anv, lvp, radv, tu)
VK_EXT_inline_uniform_block DONE (anv, radv, v3dv)
- VK_EXT_pipeline_creation_cache_control DONE (anv, radv, v3dv)
+ VK_EXT_pipeline_creation_cache_control DONE (anv, radv, tu, v3dv)
VK_EXT_pipeline_creation_feedback DONE (anv, radv, tu, v3dv)
VK_EXT_private_data DONE (anv, lvp, radv, tu, v3dv)
VK_EXT_image_robustness DONE (anv, radv, tu)
diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c
index 4e29c42aa60..ee7f730f975 100644
--- a/src/freedreno/vulkan/tu_device.c
+++ b/src/freedreno/vulkan/tu_device.c
@@ -217,6 +217,7 @@ get_device_extensions(const struct tu_physical_device *device,
.EXT_primitives_generated_query = true,
.EXT_image_view_min_lod = true,
.EXT_pipeline_creation_feedback = true,
+ .EXT_pipeline_creation_cache_control = true,
#ifndef TU_USE_KGSL
.EXT_physical_device_drm = true,
#endif
@@ -619,7 +620,7 @@ tu_get_physical_device_features_1_3(struct tu_physical_device *pdevice,
features->robustImageAccess = true;
features->inlineUniformBlock = false;
features->descriptorBindingInlineUniformBlockUpdateAfterBind = false;
- features->pipelineCreationCacheControl = false;
+ features->pipelineCreationCacheControl = true;
features->privateData = true;
features->shaderDemoteToHelperInvocation = true;
features->shaderTerminateInvocation = true;
diff --git a/src/freedreno/vulkan/tu_pipeline.c b/src/freedreno/vulkan/tu_pipeline.c
index 3e22ebcabbb..4470a81b273 100644
--- a/src/freedreno/vulkan/tu_pipeline.c
+++ b/src/freedreno/vulkan/tu_pipeline.c
@@ -2745,6 +2745,11 @@ tu_pipeline_builder_compile_shaders(struct tu_pipeline_builder *builder,
goto done;
}
+ if (builder->create_info->flags &
+ VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT) {
+ return VK_PIPELINE_COMPILE_REQUIRED;
+ }
+
nir_shader *nir[ARRAY_SIZE(stage_infos)] = { NULL };
struct tu_shader *shaders[ARRAY_SIZE(nir)] = { NULL };
@@ -3649,7 +3654,7 @@ tu_pipeline_builder_build(struct tu_pipeline_builder *builder,
result = tu_pipeline_builder_compile_shaders(builder, *pipeline);
if (result != VK_SUCCESS) {
vk_object_free(&builder->device->vk, builder->alloc, *pipeline);
- return VK_ERROR_OUT_OF_HOST_MEMORY;
+ return result;
}
result = tu_pipeline_allocate_cs(builder->device, *pipeline,
@@ -3837,16 +3842,26 @@ tu_CreateGraphicsPipelines(VkDevice device,
VkPipeline *pPipelines)
{
VkResult final_result = VK_SUCCESS;
+ uint32_t i = 0;
- for (uint32_t i = 0; i < count; i++) {
+ for (; i < count; i++) {
VkResult result = tu_graphics_pipeline_create(device, pipelineCache,
&pCreateInfos[i], pAllocator,
&pPipelines[i]);
- if (result != VK_SUCCESS)
+ if (result != VK_SUCCESS) {
final_result = result;
+ pPipelines[i] = VK_NULL_HANDLE;
+
+ if (pCreateInfos[i].flags &
+ VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT)
+ break;
+ }
}
+ for (; i < count; i++)
+ pPipelines[i] = VK_NULL_HANDLE;
+
return final_result;
}
@@ -3915,6 +3930,12 @@ tu_compute_pipeline_create(VkDevice device,
char *nir_initial_disasm = NULL;
if (!compiled) {
+ if (pCreateInfo->flags &
+ VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT) {
+ result = VK_PIPELINE_COMPILE_REQUIRED;
+ goto fail;
+ }
+
struct ir3_shader_key ir3_key = {};
nir_shader *nir = tu_spirv_to_nir(dev, pipeline_mem_ctx, stage_info,
@@ -4021,15 +4042,25 @@ tu_CreateComputePipelines(VkDevice device,
VkPipeline *pPipelines)
{
VkResult final_result = VK_SUCCESS;
+ uint32_t i = 0;
- for (uint32_t i = 0; i < count; i++) {
+ for (; i < count; i++) {
VkResult result = tu_compute_pipeline_create(device, pipelineCache,
&pCreateInfos[i],
pAllocator, &pPipelines[i]);
- if (result != VK_SUCCESS)
+ if (result != VK_SUCCESS) {
final_result = result;
+ pPipelines[i] = VK_NULL_HANDLE;
+
+ if (pCreateInfos[i].flags &
+ VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT)
+ break;
+ }
}
+ for (; i < count; i++)
+ pPipelines[i] = VK_NULL_HANDLE;
+
return final_result;
}
More information about the mesa-commit
mailing list