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