[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