[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