[Mesa-dev] [PATCH] radv: keep a stage mask per pipeline. (v2)

Samuel Pitoiset samuel.pitoiset at gmail.com
Mon Nov 6 14:05:43 UTC 2017



On 11/06/2017 06:37 AM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> This should reduce some pointless loops.
> 
> v2: fix missing check which causes crashes with compute shaders
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>   src/amd/vulkan/radv_cmd_buffer.c | 53 +++++++++++-----------------------------
>   src/amd/vulkan/radv_pipeline.c   |  2 ++
>   src/amd/vulkan/radv_private.h    |  1 +
>   3 files changed, 17 insertions(+), 39 deletions(-)
> 
> diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
> index 833c3eb3f0d..7357eadae39 100644
> --- a/src/amd/vulkan/radv_cmd_buffer.c
> +++ b/src/amd/vulkan/radv_cmd_buffer.c
> @@ -682,17 +682,10 @@ static void
>   radv_emit_shaders_prefetch(struct radv_cmd_buffer *cmd_buffer,
>   			   struct radv_pipeline *pipeline)
>   {
> -	radv_emit_shader_prefetch(cmd_buffer,
> -				  pipeline->shaders[MESA_SHADER_VERTEX]);
> -	radv_emit_shader_prefetch(cmd_buffer,
> -				  pipeline->shaders[MESA_SHADER_TESS_CTRL]);
> -	radv_emit_shader_prefetch(cmd_buffer,
> -				  pipeline->shaders[MESA_SHADER_TESS_EVAL]);
> -	radv_emit_shader_prefetch(cmd_buffer,
> -				  pipeline->shaders[MESA_SHADER_GEOMETRY]);
> +	radv_foreach_stage(stage, pipeline->stage_mask)
> +		radv_emit_shader_prefetch(cmd_buffer,
> +					  pipeline->shaders[stage]);
>   	radv_emit_shader_prefetch(cmd_buffer, pipeline->gs_copy_shader);
> -	radv_emit_shader_prefetch(cmd_buffer,
> -				  pipeline->shaders[MESA_SHADER_FRAGMENT]);
>   }
>   
>   static void
> @@ -1603,12 +1596,11 @@ radv_emit_descriptor_set_userdata(struct radv_cmd_buffer *cmd_buffer,
>   				  struct radv_descriptor_set *set,
>   				  unsigned idx)
>   {
> -	if (cmd_buffer->state.pipeline) {
> +	if (cmd_buffer->state.pipeline && (stages & cmd_buffer->state.pipeline->stage_mask)) {
>   		radv_foreach_stage(stage, stages) {

Why don't you use 'cmd_buffer->state.pipeline->stage_mask' instead of 
'stages' here?

> -			if (cmd_buffer->state.pipeline->shaders[stage])
> -				emit_stage_descriptor_set_userdata(cmd_buffer, cmd_buffer->state.pipeline,
> -								   idx, set->va,
> -								   stage);
> +			emit_stage_descriptor_set_userdata(cmd_buffer, cmd_buffer->state.pipeline,
> +							   idx, set->va,
> +							   stage);
>   		}
>   	}
>   
> @@ -1658,25 +1650,10 @@ radv_flush_indirect_descriptor_sets(struct radv_cmd_buffer *cmd_buffer)
>   	va += offset;
>   
>   	if (cmd_buffer->state.pipeline) {
> -		if (cmd_buffer->state.pipeline->shaders[MESA_SHADER_VERTEX])
> -			radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, MESA_SHADER_VERTEX,
> -						   AC_UD_INDIRECT_DESCRIPTOR_SETS, va);
> -
> -		if (cmd_buffer->state.pipeline->shaders[MESA_SHADER_FRAGMENT])
> -			radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, MESA_SHADER_FRAGMENT,
> -						   AC_UD_INDIRECT_DESCRIPTOR_SETS, va);
> -
> -		if (radv_pipeline_has_gs(cmd_buffer->state.pipeline))
> -			radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, MESA_SHADER_GEOMETRY,
> -						   AC_UD_INDIRECT_DESCRIPTOR_SETS, va);
> -
> -		if (radv_pipeline_has_tess(cmd_buffer->state.pipeline))
> -			radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, MESA_SHADER_TESS_CTRL,
> -						   AC_UD_INDIRECT_DESCRIPTOR_SETS, va);
> -
> -		if (radv_pipeline_has_tess(cmd_buffer->state.pipeline))
> -			radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, MESA_SHADER_TESS_EVAL,
> +		radv_foreach_stage(stage, cmd_buffer->state.pipeline->stage_mask) {
> +			radv_emit_userdata_address(cmd_buffer, cmd_buffer->state.pipeline, stage,
>   						   AC_UD_INDIRECT_DESCRIPTOR_SETS, va);
> +		}
>   	}
>   
>   	if (cmd_buffer->state.compute_pipeline)
> @@ -1751,10 +1728,8 @@ radv_flush_constants(struct radv_cmd_buffer *cmd_buffer,
>   	                                                   cmd_buffer->cs, MESA_SHADER_STAGES * 4);
>   
>   	radv_foreach_stage(stage, stages) {
> -		if (pipeline->shaders[stage]) {
> -			radv_emit_userdata_address(cmd_buffer, pipeline, stage,
> -						   AC_UD_PUSH_CONSTANTS, va);
> -		}
> +		radv_emit_userdata_address(cmd_buffer, pipeline, stage,
> +					   AC_UD_PUSH_CONSTANTS, va);
>   	}
>   
>   	cmd_buffer->push_constant_stages &= ~stages;
> @@ -1819,9 +1794,9 @@ radv_upload_graphics_shader_descriptors(struct radv_cmd_buffer *cmd_buffer, bool
>   	if (!radv_cmd_buffer_update_vertex_descriptors(cmd_buffer, pipeline_is_dirty))
>   		return false;
>   
> -	radv_flush_descriptors(cmd_buffer, VK_SHADER_STAGE_ALL_GRAPHICS);
> +	radv_flush_descriptors(cmd_buffer, cmd_buffer->state.pipeline->stage_mask);
>   	radv_flush_constants(cmd_buffer, cmd_buffer->state.pipeline,
> -			     VK_SHADER_STAGE_ALL_GRAPHICS);
> +			     cmd_buffer->state.pipeline->stage_mask);
>   
>   	return true;
>   }
> diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
> index 5895a76ff4b..f059fa43f99 100644
> --- a/src/amd/vulkan/radv_pipeline.c
> +++ b/src/amd/vulkan/radv_pipeline.c
> @@ -1994,6 +1994,8 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
>   	for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) {
>   		gl_shader_stage stage = ffs(pCreateInfo->pStages[i].stage) - 1;
>   		pStages[stage] = &pCreateInfo->pStages[i];
> +
> +		pipeline->stage_mask |= (1 << stage);
>   	}
>   
>   	radv_create_shaders(pipeline, device, cache,
> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
> index c59c8b8a732..27746783902 100644
> --- a/src/amd/vulkan/radv_private.h
> +++ b/src/amd/vulkan/radv_private.h
> @@ -1127,6 +1127,7 @@ struct radv_pipeline {
>   
>   	bool                                         needs_data_cache;
>   	bool					     need_indirect_descriptor_sets;
> +	uint8_t                                      stage_mask;
>   	struct radv_shader_variant *                 shaders[MESA_SHADER_STAGES];
>   	struct radv_shader_variant *gs_copy_shader;
>   	VkShaderStageFlags                           active_stages;
> 


More information about the mesa-dev mailing list