[Mesa-dev] [PATCH 2/2] gallium: expose ARB_map_buffer_alignment on Radeon

Ian Romanick idr at freedesktop.org
Mon Oct 29 10:29:31 PDT 2012


On 10/28/2012 09:55 AM, Marek Olšák wrote:

How does Gallium handle GL_WRITE_ONLY mappings of busy buffers?  In the 
past, this would cause drivers to allocate a temporary buffer (of some 
sort) and return that to the application.  In at least some cases, that 
temporary buffer came from malloc... which might not meet the alignment 
requirement.

> ---
>   docs/GL3.txt                                 |    2 +-
>   src/gallium/drivers/i915/i915_screen.c       |    1 +
>   src/gallium/drivers/llvmpipe/lp_screen.c     |    1 +
>   src/gallium/drivers/nv30/nv30_screen.c       |    1 +
>   src/gallium/drivers/nv50/nv50_screen.c       |    1 +
>   src/gallium/drivers/nvc0/nvc0_screen.c       |    1 +
>   src/gallium/drivers/r300/r300_screen.c       |    3 +++
>   src/gallium/drivers/r600/r600_pipe.c         |    3 +++
>   src/gallium/drivers/radeonsi/radeonsi_pipe.c |    3 +++
>   src/gallium/drivers/softpipe/sp_screen.c     |    1 +
>   src/gallium/drivers/svga/svga_screen.c       |    1 +
>   src/gallium/include/pipe/p_defines.h         |    3 ++-
>   src/mesa/state_tracker/st_extensions.c       |    6 ++++++
>   13 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/docs/GL3.txt b/docs/GL3.txt
> index 4efe4bf..4f44764 100644
> --- a/docs/GL3.txt
> +++ b/docs/GL3.txt
> @@ -127,7 +127,7 @@ GL_ARB_shader_image_load_store                       not started
>   GL_ARB_conservative_depth                            DONE (softpipe)
>   GL_ARB_shading_language_420pack                      not started
>   GL_ARB_internalformat_query                          not started
> -GL_ARB_map_buffer_alignment                          not started
> +GL_ARB_map_buffer_alignment                          DONE (r300, r600, radeonsi)
>
>
>   GL 4.3:
> diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
> index 1c82474..45f48c2 100644
> --- a/src/gallium/drivers/i915/i915_screen.c
> +++ b/src/gallium/drivers/i915/i915_screen.c
> @@ -209,6 +209,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
>      case PIPE_CAP_START_INSTANCE:
>      case PIPE_CAP_QUERY_TIMESTAMP:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>
>      case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
> index b64a6c0..19ffd4e 100644
> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
> @@ -212,6 +212,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>      case PIPE_CAP_START_INSTANCE:
>      case PIPE_CAP_QUERY_TIMESTAMP:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>      }
>      /* should only get here on unhandled cases */
> diff --git a/src/gallium/drivers/nv30/nv30_screen.c b/src/gallium/drivers/nv30/nv30_screen.c
> index 18ad3a8..4733661 100644
> --- a/src/gallium/drivers/nv30/nv30_screen.c
> +++ b/src/gallium/drivers/nv30/nv30_screen.c
> @@ -119,6 +119,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>      case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
>      case PIPE_CAP_START_INSTANCE:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>      case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
>      case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
> diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
> index 168f378..9461af9 100644
> --- a/src/gallium/drivers/nv50/nv50_screen.c
> +++ b/src/gallium/drivers/nv50/nv50_screen.c
> @@ -174,6 +174,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>      case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
>      case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>      default:
>         NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
> diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c
> index 4ff2f99..0e0b666 100644
> --- a/src/gallium/drivers/nvc0/nvc0_screen.c
> +++ b/src/gallium/drivers/nvc0/nvc0_screen.c
> @@ -152,6 +152,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
>      case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
>      case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>      default:
>         NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
> diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
> index 4290439..36b5dc7 100644
> --- a/src/gallium/drivers/r300/r300_screen.c
> +++ b/src/gallium/drivers/r300/r300_screen.c
> @@ -107,6 +107,9 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>           case PIPE_CAP_USER_CONSTANT_BUFFERS:
>               return 1;
>
> +        case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
> +            return 64;
> +
>           case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
>               return 16;
>
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index 7a1e135..b5280e3 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -400,6 +400,9 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>   	case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS:
>   		return 1;
>
> +        case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
> +                return 64;
> +
>   	case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
>   		return 256;
>
> diff --git a/src/gallium/drivers/radeonsi/radeonsi_pipe.c b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> index e069f1f..fa16f4c 100644
> --- a/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> +++ b/src/gallium/drivers/radeonsi/radeonsi_pipe.c
> @@ -326,6 +326,9 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>   	case PIPE_CAP_NPOT_TEXTURES:
>   		return 1;
>
> +        case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
> +                return 64;
> +
>   	case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
>   		return 256;
>
> diff --git a/src/gallium/drivers/softpipe/sp_screen.c b/src/gallium/drivers/softpipe/sp_screen.c
> index 445e31c..5051462 100644
> --- a/src/gallium/drivers/softpipe/sp_screen.c
> +++ b/src/gallium/drivers/softpipe/sp_screen.c
> @@ -166,6 +166,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
>      case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>      case PIPE_CAP_START_INSTANCE:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>      case PIPE_CAP_QUERY_TIMESTAMP:
>         return 1;
> diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
> index 4f7970d..e2ca188 100644
> --- a/src/gallium/drivers/svga/svga_screen.c
> +++ b/src/gallium/drivers/svga/svga_screen.c
> @@ -256,6 +256,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
>      case PIPE_CAP_START_INSTANCE:
>      case PIPE_CAP_QUERY_TIMESTAMP:
>      case PIPE_CAP_TEXTURE_MULTISAMPLE:
> +   case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
>         return 0;
>      case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
>         return 1;
> diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
> index b145bc0..184136e 100644
> --- a/src/gallium/include/pipe/p_defines.h
> +++ b/src/gallium/include/pipe/p_defines.h
> @@ -488,7 +488,8 @@ enum pipe_cap {
>      PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT = 71,
>      PIPE_CAP_START_INSTANCE = 72,
>      PIPE_CAP_QUERY_TIMESTAMP = 73,
> -   PIPE_CAP_TEXTURE_MULTISAMPLE = 74
> +   PIPE_CAP_TEXTURE_MULTISAMPLE = 74,
> +   PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT = 75
>   };
>
>   /**
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index a0bf471..96b0763 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -634,4 +634,10 @@ void st_init_extensions(struct st_context *st)
>      }
>      if (st->options.force_glsl_extensions_warn)
>   	   ctx->Const.ForceGLSLExtensionsWarn = 1;
> +
> +   ctx->Const.MinMapBufferAlignment =
> +      screen->get_param(screen, PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT);
> +   if (ctx->Const.MinMapBufferAlignment >= 64) {
> +      ctx->Extensions.ARB_map_buffer_alignment = GL_TRUE;
> +   }
>   }
>



More information about the mesa-dev mailing list