[Mesa-dev] [PATCH 2/5] r600g: propogate resource usage flags to winsys, use to choose bo domains

Keith Whitwell keithw at vmware.com
Tue Nov 2 12:07:31 PDT 2010


Hmm, after "cleaning" these patches up to mail out, I'm now seeing some
problems with this one...  sigh.  I'll resend shortly.

Keith

On Tue, 2010-11-02 at 11:40 -0700, Keith Whitwell wrote:
> This opens the question of what interface the winsys layer should
> really have for talking about these concepts.
> 
> For now I'm using the existing gallium resource usage concept, but
> there is no reason not use terms closer to what the hardware
> understands - eg. the domains themselves.
> ---
>  src/gallium/drivers/r600/r600.h               |    3 ++-
>  src/gallium/drivers/r600/r600_buffer.c        |    7 ++++---
>  src/gallium/drivers/r600/r600_shader.c        |    2 +-
>  src/gallium/drivers/r600/r600_texture.c       |    2 +-
>  src/gallium/winsys/r600/drm/r600_bo.c         |   20 +++++++++++++++++---
>  src/gallium/winsys/r600/drm/r600_hw_context.c |   13 +++++++++----
>  src/gallium/winsys/r600/drm/r600_priv.h       |    1 +
>  7 files changed, 35 insertions(+), 13 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h
> index 62d9832..5ec607b 100644
> --- a/src/gallium/drivers/r600/r600.h
> +++ b/src/gallium/drivers/r600/r600.h
> @@ -112,7 +112,8 @@ struct r600_tiling_info *r600_get_tiling_info(struct radeon *radeon);
>  /* r600_bo.c */
>  struct r600_bo;
>  struct r600_bo *r600_bo(struct radeon *radeon,
> -				  unsigned size, unsigned alignment, unsigned usage);
> +                        unsigned size, unsigned alignment,
> +                        unsigned binding, unsigned usage);
>  struct r600_bo *r600_bo_handle(struct radeon *radeon,
>  			       unsigned handle, unsigned *array_mode);
>  void *r600_bo_map(struct radeon *radeon, struct r600_bo *bo, unsigned usage, void *ctx);
> diff --git a/src/gallium/drivers/r600/r600_buffer.c b/src/gallium/drivers/r600/r600_buffer.c
> index 455aa2e..3c45d78 100644
> --- a/src/gallium/drivers/r600/r600_buffer.c
> +++ b/src/gallium/drivers/r600/r600_buffer.c
> @@ -86,7 +86,7 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
>  	rbuffer->r.base.vtbl = &r600_buffer_vtbl;
>  	rbuffer->r.size = rbuffer->r.base.b.width0;
>  	rbuffer->r.domain = r600_domain_from_usage(rbuffer->r.base.b.bind);
> -	bo = r600_bo((struct radeon*)screen->winsys, rbuffer->r.base.b.width0, alignment, rbuffer->r.base.b.bind);
> +	bo = r600_bo((struct radeon*)screen->winsys, rbuffer->r.base.b.width0, alignment, rbuffer->r.base.b.bind, rbuffer->r.base.b.usage);
>  	if (bo == NULL) {
>  		FREE(rbuffer);
>  		return NULL;
> @@ -156,8 +156,9 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
>  				r600_bo_reference((struct radeon*)pipe->winsys, &rbuffer->r.bo, NULL);
>  				rbuffer->num_ranges = 0;
>  				rbuffer->r.bo = r600_bo((struct radeon*)pipe->winsys,
> -							     rbuffer->r.base.b.width0, 0,
> -							     rbuffer->r.base.b.bind);
> +                                                        rbuffer->r.base.b.width0, 0,
> +                                                        rbuffer->r.base.b.bind,
> +                                                        rbuffer->r.base.b.usage);
>  				break;
>  			}
>  		}
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 4106587..1a0b35d 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -218,7 +218,7 @@ static int r600_pipe_shader(struct pipe_context *ctx, struct r600_pipe_shader *s
>  
>  	/* copy new shader */
>  	if (shader->bo == NULL) {
> -		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0);
> +		shader->bo = r600_bo(rctx->radeon, rshader->bc.ndw * 4, 4096, 0, 0);
>  		if (shader->bo == NULL) {
>  			return -ENOMEM;
>  		}
> diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
> index 7222b43..9a52cfa 100644
> --- a/src/gallium/drivers/r600/r600_texture.c
> +++ b/src/gallium/drivers/r600/r600_texture.c
> @@ -294,7 +294,7 @@ r600_texture_create_object(struct pipe_screen *screen,
>  	resource->size = rtex->size;
>  
>  	if (!resource->bo) {
> -		resource->bo = r600_bo(radeon, rtex->size, 4096, 0);
> +		resource->bo = r600_bo(radeon, rtex->size, 4096, base->bind, base->usage);
>  		if (!resource->bo) {
>  			FREE(rtex);
>  			return NULL;
> diff --git a/src/gallium/winsys/r600/drm/r600_bo.c b/src/gallium/winsys/r600/drm/r600_bo.c
> index 7d54ff1..de46d50 100644
> --- a/src/gallium/winsys/r600/drm/r600_bo.c
> +++ b/src/gallium/winsys/r600/drm/r600_bo.c
> @@ -29,23 +29,37 @@
>  #include "radeon_drm.h"
>  #include "r600_priv.h"
>  #include "r600d.h"
> +#include "radeon_drm.h"
>  
>  struct r600_bo *r600_bo(struct radeon *radeon,
> -				  unsigned size, unsigned alignment, unsigned usage)
> +			unsigned size, unsigned alignment,
> +			unsigned binding, unsigned usage)
>  {
>  	struct r600_bo *ws_bo = calloc(1, sizeof(struct r600_bo));
>  	struct pb_desc desc;
>  	struct pb_manager *man;
>  
>  	desc.alignment = alignment;
> -	desc.usage = usage;
> +	desc.usage = (PB_USAGE_CPU_READ_WRITE | PB_USAGE_GPU_READ_WRITE);
>  	ws_bo->size = size;
>  
> -	if (usage & (PIPE_BIND_CONSTANT_BUFFER | PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER))
> +	if (binding & (PIPE_BIND_CONSTANT_BUFFER | PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER))
>  		man = radeon->cman;
>  	else
>  		man = radeon->kman;
>  
> +	/* Staging resources particpate in transfers and blits only
> +	 * and are used for uploads and downloads from regular
> +	 * resources.  We generate them internally for some transfers.
> +	 */
> +	if (usage == PIPE_USAGE_STAGING)
> +                ws_bo->domains = RADEON_GEM_DOMAIN_CPU | RADEON_GEM_DOMAIN_GTT;
> +        else
> +                ws_bo->domains = (RADEON_GEM_DOMAIN_CPU |
> +                                  RADEON_GEM_DOMAIN_GTT |
> +                                  RADEON_GEM_DOMAIN_VRAM);
> +
> +
>  	ws_bo->pb = man->create_buffer(man, size, &desc);
>  	if (ws_bo->pb == NULL) {
>  		free(ws_bo);
> diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c b/src/gallium/winsys/r600/drm/r600_hw_context.c
> index 2521ff9..effb228 100644
> --- a/src/gallium/winsys/r600/drm/r600_hw_context.c
> +++ b/src/gallium/winsys/r600/drm/r600_hw_context.c
> @@ -44,7 +44,7 @@
>  int r600_context_init_fence(struct r600_context *ctx)
>  {
>  	ctx->fence = 1;
> -	ctx->fence_bo = r600_bo(ctx->radeon, 4096, 0, 0);
> +	ctx->fence_bo = r600_bo(ctx->radeon, 4096, 0, 0, 0);
>  	if (ctx->fence_bo == NULL) {
>  		return -ENOMEM;
>  	}
> @@ -785,8 +785,8 @@ void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *r
>  	bo->reloc = &ctx->reloc[ctx->creloc];
>  	bo->reloc_id = ctx->creloc * sizeof(struct r600_reloc) / 4;
>  	ctx->reloc[ctx->creloc].handle = bo->handle;
> -	ctx->reloc[ctx->creloc].read_domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
> -	ctx->reloc[ctx->creloc].write_domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
> +	ctx->reloc[ctx->creloc].read_domain = rbo->domains & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM);
> +	ctx->reloc[ctx->creloc].write_domain = rbo->domains & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM);
>  	ctx->reloc[ctx->creloc].flags = 0;
>  	radeon_bo_reference(ctx->radeon, &ctx->bo[ctx->creloc], bo);
>  	ctx->creloc++;
> @@ -1304,7 +1304,12 @@ struct r600_query *r600_context_query_create(struct r600_context *ctx, unsigned
>  	query->type = query_type;
>  	query->buffer_size = 4096;
>  
> -	query->buffer = r600_bo(ctx->radeon, query->buffer_size, 1, 0);
> +	/* As of GL4, query buffers are normally read by the CPU after
> +	 * being written by the gpu, hence staging is probably a good
> +	 * usage pattern.
> +	 */
> +	query->buffer = r600_bo(ctx->radeon, query->buffer_size, 1, 0,
> +				PIPE_USAGE_STAGING);
>  	if (!query->buffer) {
>  		free(query);
>  		return NULL;
> diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
> index b5bd7bd..996ac0f 100644
> --- a/src/gallium/winsys/r600/drm/r600_priv.h
> +++ b/src/gallium/winsys/r600/drm/r600_priv.h
> @@ -79,6 +79,7 @@ struct r600_bo {
>  	unsigned			size;
>  	unsigned			tiling_flags;
>  	unsigned                        kernel_pitch;
> +	unsigned			domains;
>  };
>  
> 




More information about the mesa-dev mailing list