Mesa (main): lavapipe: Use more Vulkan NIR heleprs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 21 21:52:41 UTC 2022


Module: Mesa
Branch: main
Commit: 9965863a136df8319921e10547af49a13c4df398
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9965863a136df8319921e10547af49a13c4df398

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Tue Jul 19 18:16:18 2022 -0500

lavapipe: Use more Vulkan NIR heleprs

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17644>

---

 src/gallium/frontends/lavapipe/lvp_pipeline.c | 150 +++++++-------------------
 1 file changed, 36 insertions(+), 114 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c
index 64f7d238b66..6f21ff8c32b 100644
--- a/src/gallium/frontends/lavapipe/lvp_pipeline.c
+++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c
@@ -22,6 +22,7 @@
  */
 
 #include "lvp_private.h"
+#include "vk_pipeline.h"
 #include "vk_render_pass.h"
 #include "vk_util.h"
 #include "glsl_types.h"
@@ -915,31 +916,16 @@ lvp_shader_optimize(nir_shader *nir)
    nir_sweep(nir);
 }
 
-static bool
-can_remove_var(nir_variable *var, void *data)
-{
-   return var->data.mode != nir_var_shader_out || (!var->data.explicit_xfb_buffer && !var->data.explicit_xfb_stride);
-}
-
-static void
+static VkResult
 lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline,
-                         uint32_t size,
-                         const void *module,
-                         const char *entrypoint_name,
-                         gl_shader_stage stage,
-                         const VkSpecializationInfo *spec_info)
+                         const VkPipelineShaderStageCreateInfo *sinfo)
 {
+   struct lvp_device *pdevice = pipeline->device;
+   gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage);
+   const nir_shader_compiler_options *drv_options = pdevice->pscreen->get_compiler_options(pipeline->device->pscreen, PIPE_SHADER_IR_NIR, st_shader_stage_to_ptarget(stage));
+   VkResult result;
    nir_shader *nir;
-   const nir_shader_compiler_options *drv_options = pipeline->device->pscreen->get_compiler_options(pipeline->device->pscreen, PIPE_SHADER_IR_NIR, st_shader_stage_to_ptarget(stage));
-   const uint32_t *spirv = module;
-   assert(spirv[0] == SPIR_V_MAGIC_NUMBER);
-   assert(size % 4 == 0);
-
-   uint32_t num_spec_entries = 0;
-   struct nir_spirv_specialization *spec_entries =
-      vk_spec_info_to_nir_spirv(spec_info, &num_spec_entries);
 
-   struct lvp_device *pdevice = pipeline->device;
    const struct spirv_to_nir_options spirv_options = {
       .environment = NIR_SPIRV_VULKAN,
       .caps = {
@@ -986,17 +972,11 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline,
       .shared_addr_format = nir_address_format_32bit_offset,
    };
 
-   nir = spirv_to_nir(spirv, size / 4,
-                      spec_entries, num_spec_entries,
-                      stage, entrypoint_name, &spirv_options, drv_options);
-
-   if (!nir) {
-      free(spec_entries);
-      return;
-   }
-   nir_validate_shader(nir, NULL);
-
-   free(spec_entries);
+   result = vk_pipeline_shader_stage_to_nir(&pdevice->vk, sinfo,
+                                            &spirv_options, drv_options,
+                                            NULL, &nir);
+   if (result != VK_SUCCESS)
+      return result;
 
    if (nir->info.stage != MESA_SHADER_TESS_CTRL)
       NIR_PASS_V(nir, remove_scoped_barriers, nir->info.stage == MESA_SHADER_COMPUTE);
@@ -1007,30 +987,12 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline,
    };
    NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings);
 
-   NIR_PASS_V(nir, nir_lower_variable_initializers, nir_var_function_temp);
-   NIR_PASS_V(nir, nir_lower_returns);
-   NIR_PASS_V(nir, nir_inline_functions);
-   NIR_PASS_V(nir, nir_copy_prop);
-   NIR_PASS_V(nir, nir_opt_deref);
-
-   /* Pick off the single entrypoint that we want */
-   nir_remove_non_entrypoints(nir);
-
    struct nir_lower_subgroups_options subgroup_opts = {0};
    subgroup_opts.lower_quad = true;
    subgroup_opts.ballot_components = 4;
    subgroup_opts.ballot_bit_size = 32;
    NIR_PASS_V(nir, nir_lower_subgroups, &subgroup_opts);
 
-   NIR_PASS_V(nir, nir_lower_variable_initializers, ~0);
-   NIR_PASS_V(nir, nir_split_var_copies);
-   NIR_PASS_V(nir, nir_split_per_member_structs);
-
-   nir_remove_dead_variables_options var_opts = {0};
-   var_opts.can_remove_var = can_remove_var;
-   NIR_PASS_V(nir, nir_remove_dead_variables,
-              nir_var_shader_in | nir_var_shader_out | nir_var_system_value, &var_opts);
-
    if (stage == MESA_SHADER_FRAGMENT)
       lvp_lower_input_attachments(nir, false);
    NIR_PASS_V(nir, nir_lower_is_helper_invocation);
@@ -1038,7 +1000,6 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline,
    NIR_PASS_V(nir, nir_lower_system_values);
    NIR_PASS_V(nir, nir_lower_compute_system_values, NULL);
 
-   NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays);
    NIR_PASS_V(nir, nir_remove_dead_variables,
               nir_var_uniform | nir_var_image, NULL);
 
@@ -1088,11 +1049,6 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline,
 
    nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
 
-   if (nir->info.stage == MESA_SHADER_VERTEX ||
-       nir->info.stage == MESA_SHADER_GEOMETRY ||
-       nir->info.stage == MESA_SHADER_TESS_EVAL)
-      nir_shader_gather_xfb_info(nir);
-
    if (nir->info.stage != MESA_SHADER_VERTEX)
       nir_assign_io_var_locations(nir, nir_var_shader_in, &nir->num_inputs, nir->info.stage);
    else {
@@ -1105,6 +1061,8 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline,
                                nir->info.stage);
 
    pipeline->pipeline_nir[stage] = nir;
+
+   return VK_SUCCESS;
 }
 
 static void
@@ -1146,28 +1104,6 @@ merge_tess_info(struct shader_info *tes_info,
    tes_info->tess.point_mode |= tcs_info->tess.point_mode;
 }
 
-static gl_shader_stage
-lvp_shader_stage(VkShaderStageFlagBits stage)
-{
-   switch (stage) {
-   case VK_SHADER_STAGE_VERTEX_BIT:
-      return MESA_SHADER_VERTEX;
-   case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
-      return MESA_SHADER_TESS_CTRL;
-   case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
-      return MESA_SHADER_TESS_EVAL;
-   case VK_SHADER_STAGE_GEOMETRY_BIT:
-      return MESA_SHADER_GEOMETRY;
-   case VK_SHADER_STAGE_FRAGMENT_BIT:
-      return MESA_SHADER_FRAGMENT;
-   case VK_SHADER_STAGE_COMPUTE_BIT:
-      return MESA_SHADER_COMPUTE;
-   default:
-      unreachable("invalid VkShaderStageFlagBits");
-      return MESA_SHADER_NONE;
-   }
-}
-
 static void
 lvp_pipeline_xfb_init(struct lvp_pipeline *pipeline)
 {
@@ -1343,6 +1279,8 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
                            struct lvp_pipeline_cache *cache,
                            const VkGraphicsPipelineCreateInfo *pCreateInfo)
 {
+   VkResult result;
+
    const VkGraphicsPipelineLibraryCreateInfoEXT *libinfo = vk_find_struct_const(pCreateInfo,
                                                                                 GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT);
    const VkPipelineLibraryCreateInfoKHR *libstate = vk_find_struct_const(pCreateInfo,
@@ -1413,9 +1351,8 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
    pipeline->device = device;
 
    for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
-      VK_FROM_HANDLE(vk_shader_module, module,
-                      pCreateInfo->pStages[i].module);
-      gl_shader_stage stage = lvp_shader_stage(pCreateInfo->pStages[i].stage);
+      const VkPipelineShaderStageCreateInfo *sinfo = &pCreateInfo->pStages[i];
+      gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage);
       if (stage == MESA_SHADER_FRAGMENT) {
          if (!(pipeline->stages & VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT))
             continue;
@@ -1423,21 +1360,9 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
          if (!(pipeline->stages & VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT))
             continue;
       }
-      if (module) {
-         lvp_shader_compile_to_ir(pipeline, module->size, module->data,
-                                  pCreateInfo->pStages[i].pName,
-                                  stage,
-                                  pCreateInfo->pStages[i].pSpecializationInfo);
-      } else {
-         const VkShaderModuleCreateInfo *info = vk_find_struct_const(pCreateInfo->pStages[i].pNext, SHADER_MODULE_CREATE_INFO);
-         assert(info);
-         lvp_shader_compile_to_ir(pipeline, info->codeSize, info->pCode,
-                                  pCreateInfo->pStages[i].pName,
-                                  stage,
-                                  pCreateInfo->pStages[i].pSpecializationInfo);
-      }
-      if (!pipeline->pipeline_nir[stage])
-         return VK_ERROR_FEATURE_NOT_PRESENT;
+      result = lvp_shader_compile_to_ir(pipeline, sinfo);
+      if (result != VK_SUCCESS)
+         goto fail;
 
       switch (stage) {
       case MESA_SHADER_GEOMETRY:
@@ -1520,7 +1445,9 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
    if (!pipeline->library) {
       bool has_fragment_shader = false;
       for (uint32_t i = 0; i < pipeline->graphics_create_info.stageCount; i++) {
-         gl_shader_stage stage = lvp_shader_stage(pipeline->graphics_create_info.pStages[i].stage);
+         const VkPipelineShaderStageCreateInfo *sinfo =
+            &pipeline->graphics_create_info.pStages[i];
+         gl_shader_stage stage = vk_to_mesa_shader_stage(sinfo->stage);
          lvp_pipeline_compile(pipeline, stage);
          if (stage == MESA_SHADER_FRAGMENT)
             has_fragment_shader = true;
@@ -1539,6 +1466,14 @@ lvp_graphics_pipeline_init(struct lvp_pipeline *pipeline,
       }
    }
    return VK_SUCCESS;
+
+fail:
+   for (unsigned i = 0; i < ARRAY_SIZE(pipeline->pipeline_nir); i++) {
+      if (pipeline->pipeline_nir[i])
+         ralloc_free(pipeline->pipeline_nir[i]);
+   }
+
+   return result;
 }
 
 static VkResult
@@ -1630,23 +1565,10 @@ lvp_compute_pipeline_init(struct lvp_pipeline *pipeline,
                                  &pipeline->compute_create_info, pCreateInfo);
    pipeline->is_compute_pipeline = true;
 
-   if (pCreateInfo->stage.module) {
-      VK_FROM_HANDLE(vk_shader_module, module,
-                     pCreateInfo->stage.module);
-      lvp_shader_compile_to_ir(pipeline, module->size, module->data,
-                               pCreateInfo->stage.pName,
-                               MESA_SHADER_COMPUTE,
-                               pCreateInfo->stage.pSpecializationInfo);
-   } else {
-         const VkShaderModuleCreateInfo *info = vk_find_struct_const(pCreateInfo->stage.pNext, SHADER_MODULE_CREATE_INFO);
-         assert(info);
-         lvp_shader_compile_to_ir(pipeline, info->codeSize, info->pCode,
-                                  pCreateInfo->stage.pName,
-                                  MESA_SHADER_COMPUTE,
-                                  pCreateInfo->stage.pSpecializationInfo);
-   }
-   if (!pipeline->pipeline_nir[MESA_SHADER_COMPUTE])
-      return VK_ERROR_FEATURE_NOT_PRESENT;
+   VkResult result = lvp_shader_compile_to_ir(pipeline, &pCreateInfo->stage);
+   if (result != VK_SUCCESS)
+      return result;
+
    lvp_pipeline_compile(pipeline, MESA_SHADER_COMPUTE);
    return VK_SUCCESS;
 }



More information about the mesa-commit mailing list