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;
>  };
>  
> 


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to