[Mesa-dev] [PATCH v2 2/2] anv/pipeline: set active_stages early

Lionel Landwerlin lionel.g.landwerlin at intel.com
Fri Mar 16 18:19:45 UTC 2018


Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

On 15/03/18 20:09, Caio Marcelo de Oliveira Filho wrote:
> Since the intermediate states of active_stages are not used,
> i.e. active_stages is read only after all stages were set into it,
> just set its value before compiling the shaders.
>
> This will allow to conditionally run certain passes based on what
> other shaders are being used, e.g. a certain pass might only be
> applicable to the vertex shader if there's no geometry or tessellation
> shader being used.
>
> v2: Use vk_to_mesa_shader_stage. (Lionel)
> ---
>   src/intel/vulkan/anv_pipeline.c  | 12 +++++++++---
>   src/intel/vulkan/genX_pipeline.c |  1 +
>   2 files changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
> index cb34f3be77..4ca1e0be34 100644
> --- a/src/intel/vulkan/anv_pipeline.c
> +++ b/src/intel/vulkan/anv_pipeline.c
> @@ -501,7 +501,6 @@ anv_pipeline_add_compiled_stage(struct anv_pipeline *pipeline,
>                                   struct anv_shader_bin *shader)
>   {
>      pipeline->shaders[stage] = shader;
> -   pipeline->active_stages |= mesa_to_vk_shader_stage(stage);
>   }
>   
>   static VkResult
> @@ -1334,11 +1333,18 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
>      const VkPipelineShaderStageCreateInfo *pStages[MESA_SHADER_STAGES] = {};
>      struct anv_shader_module *modules[MESA_SHADER_STAGES] = {};
>      for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
> -      gl_shader_stage stage = ffs(pCreateInfo->pStages[i].stage) - 1;
> +      VkShaderStageFlagBits vk_stage = pCreateInfo->pStages[i].stage;
> +      gl_shader_stage stage = vk_to_mesa_shader_stage(vk_stage);
>         pStages[stage] = &pCreateInfo->pStages[i];
>         modules[stage] = anv_shader_module_from_handle(pStages[stage]->module);
> +      pipeline->active_stages |= vk_stage;
>      }
>   
> +   if (pipeline->active_stages & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)
> +      pipeline->active_stages |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
> +
> +   assert(pipeline->active_stages & VK_SHADER_STAGE_VERTEX_BIT);
> +
>      if (modules[MESA_SHADER_VERTEX]) {
>         result = anv_pipeline_compile_vs(pipeline, cache, pCreateInfo,
>                                          modules[MESA_SHADER_VERTEX],
> @@ -1378,7 +1384,7 @@ anv_pipeline_init(struct anv_pipeline *pipeline,
>            goto compile_fail;
>      }
>   
> -   assert(pipeline->active_stages & VK_SHADER_STAGE_VERTEX_BIT);
> +   assert(pipeline->shaders[MESA_SHADER_VERTEX]);
>   
>      anv_pipeline_setup_l3_config(pipeline, false);
>   
> diff --git a/src/intel/vulkan/genX_pipeline.c b/src/intel/vulkan/genX_pipeline.c
> index 9c08bc2033..eb2d414735 100644
> --- a/src/intel/vulkan/genX_pipeline.c
> +++ b/src/intel/vulkan/genX_pipeline.c
> @@ -1787,6 +1787,7 @@ compute_pipeline_create(
>      pipeline->needs_data_cache = false;
>   
>      assert(pCreateInfo->stage.stage == VK_SHADER_STAGE_COMPUTE_BIT);
> +   pipeline->active_stages |= VK_SHADER_STAGE_COMPUTE_BIT;
>      ANV_FROM_HANDLE(anv_shader_module, module,  pCreateInfo->stage.module);
>      result = anv_pipeline_compile_cs(pipeline, cache, pCreateInfo, module,
>                                       pCreateInfo->stage.pName,




More information about the mesa-dev mailing list