[Mesa-dev] [PATCH 4/6] radeonsi: fix printing vertex buffer descriptors into ddebug reports

Nicolai Hähnle nhaehnle at gmail.com
Tue Aug 1 12:40:40 UTC 2017


On 01.08.2017 00:43, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> ---
>   src/gallium/drivers/radeonsi/si_debug.c       | 3 +++
>   src/gallium/drivers/radeonsi/si_descriptors.c | 7 ++++++-
>   2 files changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c
> index 06dea61..7c8a0fe 100644
> --- a/src/gallium/drivers/radeonsi/si_debug.c
> +++ b/src/gallium/drivers/radeonsi/si_debug.c
> @@ -385,20 +385,23 @@ typedef unsigned (*slot_remap_func)(unsigned);
>   static void si_dump_descriptor_list(struct si_descriptors *desc,
>   				    const char *shader_name,
>   				    const char *elem_name,
>   				    unsigned element_dw_size,
>   				    unsigned num_elements,
>   				    slot_remap_func slot_remap,
>   				    FILE *f)
>   {
>   	unsigned i, j;
>   
> +	if (!desc->list)
> +		return;
> +
>   	for (i = 0; i < num_elements; i++) {
>   		unsigned dw_offset = slot_remap(i) * element_dw_size;
>   		uint32_t *gpu_ptr = desc->gpu_list ? desc->gpu_list : desc->list;
>   		const char *list_note = desc->gpu_list ? "GPU list" : "CPU list";
>   		uint32_t *cpu_list = desc->list + dw_offset;
>   		uint32_t *gpu_list = gpu_ptr + dw_offset;
>   
>   		fprintf(f, COLOR_GREEN "%s%s slot %u (%s):" COLOR_RESET "\n",
>   			shader_name, elem_name, i, list_note);
>   
> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
> index b080562..4de6086 100644
> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
> @@ -1094,20 +1094,21 @@ bool si_upload_vertex_buffer_descriptors(struct si_context *sctx)
>   	 * the fine-grained upload path.
>   	 */
>   	u_upload_alloc(sctx->b.b.const_uploader, 0,
>   		       desc_list_byte_size,
>   		       si_optimal_tcc_alignment(sctx, desc_list_byte_size),
>   		       (unsigned*)&desc->buffer_offset,
>   		       (struct pipe_resource**)&desc->buffer, (void**)&ptr);
>   	if (!desc->buffer)
>   		return false;
>   
> +	desc->list = ptr;
>   	radeon_add_to_buffer_list(&sctx->b, &sctx->b.gfx,
>   			      desc->buffer, RADEON_USAGE_READ,
>   			      RADEON_PRIO_DESCRIPTORS);
>   
>   	assert(count <= SI_MAX_ATTRIBS);
>   
>   	for (i = 0; i < count; i++) {
>   		struct pipe_vertex_buffer *vb;
>   		struct r600_resource *rbuffer;
>   		unsigned offset;
> @@ -2827,20 +2828,22 @@ void si_init_all_descriptors(struct si_context *sctx)
>   				 SI_SGPR_RW_BUFFERS,
>   				 /* The second set of usage/priority is used by
>   				  * const buffers in RW buffer slots. */
>   				 RADEON_USAGE_READWRITE, RADEON_USAGE_READ,
>   				 RADEON_PRIO_SHADER_RINGS, RADEON_PRIO_CONST_BUFFER,
>   				 &ce_offset);
>   	sctx->descriptors[SI_DESCS_RW_BUFFERS].num_active_slots = SI_NUM_RW_BUFFERS;
>   
>   	si_init_descriptors(sctx, &sctx->vertex_buffers, SI_SGPR_VERTEX_BUFFERS,
>   			    4, SI_NUM_VERTEX_BUFFERS, 0, 0, NULL);
> +	FREE(sctx->vertex_buffers.list); /* not used */
> +	sctx->vertex_buffers.list = NULL;
>   
>   	sctx->descriptors_dirty = u_bit_consecutive(0, SI_NUM_DESCS);
>   	sctx->total_ce_ram_allocated = ce_offset;
>   
>   	if (sctx->b.chip_class >= GFX9)
>   		assert(ce_offset <= 4096);
>   	else
>   		assert(ce_offset <= 32768);
>   
>   	/* Set pipe_context functions. */
> @@ -2940,21 +2943,23 @@ void si_release_all_descriptors(struct si_context *sctx)
>   		si_release_sampler_views(&sctx->samplers[i].views);
>   		si_release_image_views(&sctx->images[i]);
>   	}
>   	si_release_buffer_resources(&sctx->rw_buffers,
>   				    &sctx->descriptors[SI_DESCS_RW_BUFFERS]);
>   	for (i = 0; i < SI_NUM_VERTEX_BUFFERS; i++)
>   		pipe_vertex_buffer_unreference(&sctx->vertex_buffer[i]);
>   
>   	for (i = 0; i < SI_NUM_DESCS; ++i)
>   		si_release_descriptors(&sctx->descriptors[i]);
> -	si_release_descriptors(&sctx->vertex_buffers);
> +
> +	/* Only one member of si_descriptors needs to be freed: */
> +	r600_resource_reference(&sctx->vertex_buffers.buffer, NULL);

I have a mild preference to instead do

    sctx->vertex_buffers.list = NULL; /* points into a mapped buffer */
    si_release_descriptors(&sctx->vertex_buffers);

so that if we ever add more members that need to be released, we don't 
have to worry about updating this.

Either way, patches 2-4:

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


>   }
>   
>   void si_all_descriptors_begin_new_cs(struct si_context *sctx)
>   {
>   	int i;
>   
>   	for (i = 0; i < SI_NUM_SHADERS; i++) {
>   		si_buffer_resources_begin_new_cs(sctx, &sctx->const_and_shader_buffers[i]);
>   		si_sampler_views_begin_new_cs(sctx, &sctx->samplers[i].views);
>   		si_image_views_begin_new_cs(sctx, &sctx->images[i]);
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list