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


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

Reply via email to