<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 18, 2015 at 7:40 AM, Martin Peres <span dir="ltr"><<a href="mailto:martin.peres@linux.intel.com" target="_blank">martin.peres@linux.intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
On 12/02/15 04:05, Laura Ekstrand wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
v2: review from Ian Romanick<br>
    - Fix space in ARB_direct_state_access.xml.<br>
    - Remove "_mesa" from the name of buffer_data static fallback.<br>
    - Restore VBO_DEBUG and BOUNDS_CHECK.<br>
    - Fix beginning of comment to start on same line as /*<br>
---<br>
  src/mapi/glapi/gen/ARB_direct_<u></u>state_access.xml |  7 +++<br>
  src/mesa/main/bufferobj.c                      | 67 ++++++++++++++++++--------<br>
  src/mesa/main/bufferobj.h                      | 13 ++++-<br>
  src/mesa/main/tests/dispatch_<u></u>sanity.cpp        |  1 +<br>
  4 files changed, 67 insertions(+), 21 deletions(-)<br>
<br>
diff --git a/src/mapi/glapi/gen/ARB_<u></u>direct_state_access.xml b/src/mapi/glapi/gen/ARB_<u></u>direct_state_access.xml<br>
index ff81c21..7779262 100644<br>
--- a/src/mapi/glapi/gen/ARB_<u></u>direct_state_access.xml<br>
+++ b/src/mapi/glapi/gen/ARB_<u></u>direct_state_access.xml<br>
@@ -21,6 +21,13 @@<br>
        <param name="flags" type="GLbitfield" /><br>
     </function><br>
  +   <function name="NamedBufferData" offset="assign"><br>
+      <param name="buffer" type="GLuint" /><br>
+      <param name="size" type="GLsizeiptr" /><br>
+      <param name="data" type="const GLvoid *" /><br>
+      <param name="usage" type="GLenum" /><br>
+   </function><br>
+<br>
     <!-- Texture object functions --><br>
       <function name="CreateTextures" offset="assign"><br>
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c<br>
index 6259db1..ac8eed1 100644<br>
--- a/src/mesa/main/bufferobj.c<br>
+++ b/src/mesa/main/bufferobj.c<br>
@@ -556,9 +556,9 @@ _mesa_total_buffer_object_<u></u>memory(struct gl_context *ctx)<br>
   * \sa glBufferDataARB, dd_function_table::BufferData.<br>
   */<br>
  static GLboolean<br>
-_mesa_buffer_data( struct gl_context *ctx, GLenum target, GLsizeiptrARB size,<br>
-                  const GLvoid * data, GLenum usage, GLenum storageFlags,<br>
-                  struct gl_buffer_object * bufObj )<br>
+buffer_data_fallback(struct gl_context *ctx, GLenum target, GLsizeiptr size,<br>
+                     const GLvoid *data, GLenum usage, GLenum storageFlags,<br>
+                     struct gl_buffer_object *bufObj)<br>
  {<br>
     void * new_data;<br>
  @@ -1112,7 +1112,7 @@ _mesa_init_buffer_object_<u></u>functions(struct dd_function_table *driver)<br>
     /* GL_ARB_vertex/pixel_buffer_<u></u>object */<br>
     driver->NewBufferObject = _mesa_new_buffer_object;<br>
     driver->DeleteBuffer = _mesa_delete_buffer_object;<br>
-   driver->BufferData = _mesa_buffer_data;<br>
+   driver->BufferData = buffer_data_fallback;<br>
     driver->BufferSubData = _mesa_buffer_subdata;<br>
     driver->GetBufferSubData = _mesa_buffer_get_subdata;<br>
     driver->UnmapBuffer = _mesa_buffer_unmap;<br>
@@ -1474,23 +1474,22 @@ _mesa_NamedBufferStorage(<u></u>GLuint buffer, GLsizeiptr size, const GLvoid *data,<br>
  }<br>
    -<br>
-void GLAPIENTRY<br>
-_mesa_BufferData(GLenum target, GLsizeiptrARB size,<br>
-                    const GLvoid * data, GLenum usage)<br>
+void<br>
+_mesa_buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,<br>
+                  GLenum target, GLsizeiptr size, const GLvoid *data,<br>
+                  GLenum usage, const char *func)<br>
  {<br>
-   GET_CURRENT_CONTEXT(ctx);<br>
-   struct gl_buffer_object *bufObj;<br>
     bool valid_usage;<br>
       if (MESA_VERBOSE & VERBOSE_API)<br>
-      _mesa_debug(ctx, "glBufferData(%s, %ld, %p, %s)\n",<br>
+      _mesa_debug(ctx, "%s(%s, %ld, %p, %s)\n",<br>
</blockquote>
<br></div></div>
Func could be on this line but I really don't care.<div><div class="h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+                  func,<br>
                    _mesa_lookup_enum_by_nr(<u></u>target),<br>
                    (long int) size, data,<br>
                    _mesa_lookup_enum_by_nr(usage)<u></u>);<br>
       if (size < 0) {<br>
-      _mesa_error(ctx, GL_INVALID_VALUE, "glBufferDataARB(size < 0)");<br>
+      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size < 0)", func);<br>
        return;<br>
     }<br>
  @@ -1519,16 +1518,13 @@ _mesa_BufferData(GLenum target, GLsizeiptrARB size,<br>
     }<br>
       if (!valid_usage) {<br>
-      _mesa_error(ctx, GL_INVALID_ENUM, "glBufferData(usage)");<br>
+      _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid usage: %s)", func,<br>
+                  _mesa_lookup_enum_by_nr(usage)<u></u>);<br>
        return;<br>
     }<br>
  -   bufObj = get_buffer(ctx, "glBufferDataARB", target, GL_INVALID_OPERATION);<br>
-   if (!bufObj)<br>
-      return;<br>
-<br>
     if (bufObj->Immutable) {<br>
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glBufferData(immutable)");<br>
+      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable)", func);<br>
        return;<br>
     }<br>
  @@ -1554,10 +1550,43 @@ _mesa_BufferData(GLenum target, GLsizeiptrARB size,<br>
                                 GL_MAP_WRITE_BIT |<br>
                                 GL_DYNAMIC_STORAGE_BIT,<br>
                                 bufObj)) {<br>
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferDataARB()");<br>
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);<br>
     }<br>
  }<br>
  +void GLAPIENTRY<br>
+_mesa_BufferData(GLenum target, GLsizeiptr size,<br>
+                 const GLvoid *data, GLenum usage)<br>
+{<br>
+   GET_CURRENT_CONTEXT(ctx);<br>
+   struct gl_buffer_object *bufObj;<br>
+<br>
+   bufObj = get_buffer(ctx, "glBufferData", target, GL_INVALID_OPERATION);<br>
+   if (!bufObj)<br>
+      return;<br>
+<br>
+   _mesa_buffer_data(ctx, bufObj, target, size, data, usage,<br>
+                     "glBufferData");<br>
+}<br>
+<br>
+void GLAPIENTRY<br>
+_mesa_NamedBufferData(GLuint buffer, GLsizeiptr size, const GLvoid *data,<br>
+                      GLenum usage)<br>
+{<br>
+   GET_CURRENT_CONTEXT(ctx);<br>
+   struct gl_buffer_object *bufObj;<br>
+<br>
+   bufObj = _mesa_lookup_bufferobj_err(<u></u>ctx, buffer, "glNamedBufferData");<br>
+   if (!bufObj)<br>
+      return;<br>
+<br>
+   /* In direct state access, buffer objects have an unspecified target since<br>
+    * they are not required to be bound.<br>
+    */<br>
+   _mesa_buffer_data(ctx, bufObj, GL_NONE, size, data, usage,<br>
+                     "glNamedBufferData");<br>
+}<br>
+<br>
    void GLAPIENTRY<br>
  _mesa_BufferSubData(GLenum target, GLintptrARB offset,<br>
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h<br>
index 3c337aa..ddd240c 100644<br>
--- a/src/mesa/main/bufferobj.h<br>
+++ b/src/mesa/main/bufferobj.h<br>
@@ -135,6 +135,11 @@ _mesa_buffer_storage(struct gl_context *ctx, struct gl_buffer_object *bufObj,<br>
                       GLbitfield flags, const char *func);<br>
    extern void<br>
+_mesa_buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,<br>
+                  GLenum target, GLsizeiptr size, const GLvoid *data,<br>
+                  GLenum usage, const char *func);<br>
</blockquote>
<br></div></div>
is there a reason to export this function? Why not having it static?<br></blockquote><div>Meta (mesa/src/main/drivers/common/) uses _mesa_BufferData.  It would be simpler to use this function _mesa_buffer_data.  After most of DSA is done, I get to start making Meta use the backend functions rather than api entry points.  This will hopefully save us from storing internal driver objects in hash tables and getting the context everywhere.<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Reviewed-by: Martin Peres <<a href="mailto:martin.peres@linux.intel.com" target="_blank">martin.peres@linux.intel.com</a>><div class="HOEnZb"><div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+extern void<br>
  _mesa_buffer_unmap_all_<u></u>mappings(struct gl_context *ctx,<br>
                                  struct gl_buffer_object *bufObj);<br>
  @@ -172,8 +177,12 @@ _mesa_NamedBufferStorage(<u></u>GLuint buffer, GLsizeiptr size, const GLvoid *data,<br>
                           GLbitfield flags);<br>
    void GLAPIENTRY<br>
-_mesa_BufferData(GLenum target, GLsizeiptrARB size,<br>
-                 const GLvoid * data, GLenum usage);<br>
+_mesa_BufferData(GLenum target, GLsizeiptr size,<br>
+                 const GLvoid *data, GLenum usage);<br>
+<br>
+void GLAPIENTRY<br>
+_mesa_NamedBufferData(GLuint buffer, GLsizeiptr size,<br>
+                      const GLvoid *data, GLenum usage);<br>
    void GLAPIENTRY<br>
  _mesa_BufferSubData(GLenum target, GLintptrARB offset,<br>
diff --git a/src/mesa/main/tests/<u></u>dispatch_sanity.cpp b/src/mesa/main/tests/<u></u>dispatch_sanity.cpp<br>
index 9f663be..595ee90 100644<br>
--- a/src/mesa/main/tests/<u></u>dispatch_sanity.cpp<br>
+++ b/src/mesa/main/tests/<u></u>dispatch_sanity.cpp<br>
@@ -957,6 +957,7 @@ const struct function gl_core_functions_possible[] = {<br>
     /* GL_ARB_direct_state_access */<br>
     { "glCreateBuffers", 45, -1 },<br>
     { "glNamedBufferStorage", 45, -1 },<br>
+   { "glNamedBufferData", 45, -1 },<br>
     { "glCreateTextures", 45, -1 },<br>
     { "glTextureStorage1D", 45, -1 },<br>
     { "glTextureStorage2D", 45, -1 },<br>
</blockquote>
<br>
</div></div></blockquote></div><br></div></div>