[Mesa-dev] [PATCH 09/13] r300g, r600g, radeonsi: add support for ARB_buffer_storage

Fredrik Höglund fredrik at kde.org
Thu Jan 30 14:46:34 PST 2014


On Thursday 30 January 2014, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
> 
> All GTT memory mappings are coherent and therefore can be persistent.

As we discussed on IRC, I think there should be a comment somewhere
explaining that VRAM mappings are uncached, so the memory_barrier
implementations don't need to do anything for those.

Aside from that, this patch is:

Reviewed-by: Fredrik Höglund <fredrik at kde.org>

> ---
>  src/gallium/drivers/r300/r300_screen.c          | 1 +
>  src/gallium/drivers/r300/r300_state.c           | 5 +++++
>  src/gallium/drivers/r600/r600_pipe.c            | 1 +
>  src/gallium/drivers/radeon/r600_buffer_common.c | 4 ++++
>  src/gallium/drivers/radeon/r600_pipe_common.c   | 5 +++++
>  src/gallium/drivers/radeonsi/si_pipe.c          | 1 +
>  6 files changed, 17 insertions(+)
> 
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index 4b790af..a3ca829 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -106,6 +106,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>          case PIPE_CAP_USER_INDEX_BUFFERS:
>          case PIPE_CAP_USER_CONSTANT_BUFFERS:
>          case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
> +        case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>              return 1;
>  
>          case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
> diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
> index 048672c..5472263 100644
> --- a/src/gallium/drivers/r300/r300_state.c
> +++ b/src/gallium/drivers/r300/r300_state.c
> @@ -2129,6 +2129,10 @@ static void r300_texture_barrier(struct pipe_context *pipe)
>      r300_mark_atom_dirty(r300, &r300->texture_cache_inval);
>  }
>  
> +static void r300_memory_barrier(struct pipe_context *pipe, unsigned flags)
> +{
> +}
> +
>  void r300_init_state_functions(struct r300_context* r300)
>  {
>      r300->context.create_blend_state = r300_create_blend_state;
> @@ -2189,4 +2193,5 @@ void r300_init_state_functions(struct r300_context* r300)
>      r300->context.delete_vs_state = r300_delete_vs_state;
>  
>      r300->context.texture_barrier = r300_texture_barrier;
> +    r300->context.memory_barrier = r300_memory_barrier;
>  }
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 49521e0..3210b2c 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -354,6 +354,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>          case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
>  	case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
>  	case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +        case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>  		return 1;
>  
>  	case PIPE_CAP_TGSI_TEXCOORD:
> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
> index d29671e..3fff3cf 100644
> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
> @@ -103,6 +103,10 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
>  {
>  	uint32_t initial_domain, domains;
>  
> +	/* Use GTT for coherent mappings. */
> +	if (res->b.b.flags & PIPE_RESOURCE_FLAG_TRANSFER_COHERENT)
> +		usage = PIPE_USAGE_STAGING;
> +
>  	switch(usage) {
>  	case PIPE_USAGE_STAGING:
>  		/* Staging resources participate in transfers, i.e. are used
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
> index 98164f0..307bb47 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
> @@ -39,6 +39,10 @@
>   * pipe_context
>   */
>  
> +static void r600_memory_barrier(struct pipe_context *ctx, unsigned flags)
> +{
> +}
> +
>  bool r600_common_context_init(struct r600_common_context *rctx,
>  			      struct r600_common_screen *rscreen)
>  {
> @@ -56,6 +60,7 @@ bool r600_common_context_init(struct r600_common_context *rctx,
>  	rctx->b.transfer_flush_region = u_default_transfer_flush_region;
>  	rctx->b.transfer_unmap = u_transfer_unmap_vtbl;
>  	rctx->b.transfer_inline_write = u_default_transfer_inline_write;
> +        rctx->b.memory_barrier = r600_memory_barrier;
>  
>  	r600_streamout_init(rctx);
>  	r600_query_init(rctx);
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index 14dfd30..54a6107 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -252,6 +252,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>  	case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
>          case PIPE_CAP_TGSI_VS_LAYER:
>  	case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
> +	case PIPE_CAP_BUFFER_TRANSFER_PERSISTENT_COHERENT:
>  		return 1;
>  
>  	case PIPE_CAP_TEXTURE_MULTISAMPLE:
> 



More information about the mesa-dev mailing list