[Mesa-dev] [PATCH 09/18] anv/pipeline: Call anv_pipeline_compile_* in a loop

Jason Ekstrand jason at jlekstrand.net
Wed Jul 11 21:18:11 UTC 2018


---
 src/intel/vulkan/anv_pipeline.c | 56 ++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 26 deletions(-)

diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index d56f6ce8966..fb3ae15210d 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -1420,35 +1420,39 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
          anv_pipeline_add_compiled_stage(pipeline, s, bin);
    }
 
-   if (stages[MESA_SHADER_VERTEX].entrypoint &&
-       !pipeline->shaders[MESA_SHADER_VERTEX]) {
-      result = anv_pipeline_compile_vs(pipeline, cache, pCreateInfo,
-                                       &stages[MESA_SHADER_VERTEX]);
-      if (result != VK_SUCCESS)
-         goto compile_fail;
-   }
+   for (unsigned s = 0; s < MESA_SHADER_STAGES; s++) {
+      if (!stages[s].entrypoint)
+         continue;
 
-   if (stages[MESA_SHADER_TESS_EVAL].entrypoint &&
-       !pipeline->shaders[MESA_SHADER_TESS_EVAL]) {
-      result = anv_pipeline_compile_tcs_tes(pipeline, cache, pCreateInfo,
-                                            &stages[MESA_SHADER_TESS_CTRL],
-                                            &stages[MESA_SHADER_TESS_EVAL]);
-      if (result != VK_SUCCESS)
-         goto compile_fail;
-   }
+      assert(stages[s].stage == s);
 
-   if (stages[MESA_SHADER_GEOMETRY].entrypoint &&
-       !pipeline->shaders[MESA_SHADER_GEOMETRY]) {
-      result = anv_pipeline_compile_gs(pipeline, cache, pCreateInfo,
-                                       &stages[MESA_SHADER_GEOMETRY]);
-      if (result != VK_SUCCESS)
-         goto compile_fail;
-   }
+      if (pipeline->shaders[s])
+         continue;
 
-   if (stages[MESA_SHADER_FRAGMENT].entrypoint &&
-       !pipeline->shaders[MESA_SHADER_FRAGMENT]) {
-      result = anv_pipeline_compile_fs(pipeline, cache, pCreateInfo,
-                                       &stages[MESA_SHADER_FRAGMENT]);
+      switch (s) {
+      case MESA_SHADER_VERTEX:
+         result = anv_pipeline_compile_vs(pipeline, cache, pCreateInfo,
+                                          &stages[s]);
+         break;
+      case MESA_SHADER_TESS_CTRL:
+         /* Handled with TESS_EVAL */
+         break;
+      case MESA_SHADER_TESS_EVAL:
+         result = anv_pipeline_compile_tcs_tes(pipeline, cache, pCreateInfo,
+                                               &stages[MESA_SHADER_TESS_CTRL],
+                                               &stages[MESA_SHADER_TESS_EVAL]);
+         break;
+      case MESA_SHADER_GEOMETRY:
+         result = anv_pipeline_compile_gs(pipeline, cache, pCreateInfo,
+                                          &stages[s]);
+         break;
+      case MESA_SHADER_FRAGMENT:
+         result = anv_pipeline_compile_fs(pipeline, cache, pCreateInfo,
+                                          &stages[s]);
+         break;
+      default:
+         unreachable("Invalid graphics shader stage");
+      }
       if (result != VK_SUCCESS)
          goto compile_fail;
    }
-- 
2.17.1



More information about the mesa-dev mailing list