anv: Compile shader stages in pipeline order.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 24 Feb 2016 23:41:24 +0000 (15:41 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 3 Mar 2016 19:36:19 +0000 (11:36 -0800)
Instead of the arbitrary order modules might be specified in.

Acked-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/intel/vulkan/anv_pipeline.c

index 647f2eb96b07c00a7889ed1db7827a887dcc7ebb..fd6f8c92cfa3b563e71d582ddb82c51534e8bcbc 100644 (file)
@@ -1108,29 +1108,33 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
    pipeline->active_stages = 0;
    pipeline->total_scratch = 0;
 
+   const VkPipelineShaderStageCreateInfo *pStages[MESA_SHADER_STAGES] = { 0, };
+   struct anv_shader_module *modules[MESA_SHADER_STAGES] = { 0, };
    for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
-      ANV_FROM_HANDLE(anv_shader_module, module,
-                      pCreateInfo->pStages[i].module);
-
-      switch (pCreateInfo->pStages[i].stage) {
-      case VK_SHADER_STAGE_VERTEX_BIT:
-         anv_pipeline_compile_vs(pipeline, cache, pCreateInfo, module,
-                                 pCreateInfo->pStages[i].pName,
-                                 pCreateInfo->pStages[i].pSpecializationInfo);
-         break;
-      case VK_SHADER_STAGE_GEOMETRY_BIT:
-         anv_pipeline_compile_gs(pipeline, cache, pCreateInfo, module,
-                                 pCreateInfo->pStages[i].pName,
-                                 pCreateInfo->pStages[i].pSpecializationInfo);
-         break;
-      case VK_SHADER_STAGE_FRAGMENT_BIT:
-         anv_pipeline_compile_fs(pipeline, cache, pCreateInfo, extra, module,
-                                 pCreateInfo->pStages[i].pName,
-                                 pCreateInfo->pStages[i].pSpecializationInfo);
-         break;
-      default:
-         anv_finishme("Unsupported shader stage");
-      }
+      gl_shader_stage stage = ffs(pCreateInfo->pStages[i].stage) - 1;
+      pStages[stage] = &pCreateInfo->pStages[i];
+      modules[stage] = anv_shader_module_from_handle(pStages[stage]->module);
+   }
+
+   if (modules[MESA_SHADER_VERTEX]) {
+      anv_pipeline_compile_vs(pipeline, cache, pCreateInfo,
+                              modules[MESA_SHADER_VERTEX],
+                              pStages[MESA_SHADER_VERTEX]->pName,
+                              pStages[MESA_SHADER_VERTEX]->pSpecializationInfo);
+   }
+
+   if (modules[MESA_SHADER_GEOMETRY]) {
+      anv_pipeline_compile_gs(pipeline, cache, pCreateInfo,
+                              modules[MESA_SHADER_GEOMETRY],
+                              pStages[MESA_SHADER_GEOMETRY]->pName,
+                              pStages[MESA_SHADER_GEOMETRY]->pSpecializationInfo);
+   }
+
+   if (modules[MESA_SHADER_FRAGMENT]) {
+      anv_pipeline_compile_fs(pipeline, cache, pCreateInfo, extra,
+                              modules[MESA_SHADER_FRAGMENT],
+                              pStages[MESA_SHADER_FRAGMENT]->pName,
+                              pStages[MESA_SHADER_FRAGMENT]->pSpecializationInfo);
    }
 
    if (!(pipeline->active_stages & VK_SHADER_STAGE_VERTEX_BIT)) {