[Mesa-dev] [PATCH 12/21] main: Added entry points for ClearNamedBuffer[Sub]Data.

Laura Ekstrand laura at jlekstrand.net
Wed Jan 21 17:40:25 PST 2015


---
 src/mapi/glapi/gen/ARB_direct_state_access.xml |  18 +++
 src/mesa/main/bufferobj.c                      | 156 ++++++++++++++-----------
 src/mesa/main/bufferobj.h                      |  34 ++++--
 src/mesa/main/tests/dispatch_sanity.cpp        |   2 +
 src/mesa/state_tracker/st_cb_bufferobjects.c   |   4 +-
 5 files changed, 135 insertions(+), 79 deletions(-)

diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml
index 8c80dfb..4b29e00 100644
--- a/src/mapi/glapi/gen/ARB_direct_state_access.xml
+++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml
@@ -43,6 +43,24 @@
       <param name="size" type="GLsizeiptr" />
    </function>
 
+   <function name="ClearNamedBufferData" offset="assign">
+      <param name="buffer" type="GLuint" />
+      <param name="internalformat" type="GLenum" />
+      <param name="format" type="GLenum" />
+      <param name="type" type="GLenum" />
+      <param name="data" type="const GLvoid *" />
+   </function>
+
+   <function name="ClearNamedBufferSubData" offset="assign">
+      <param name="buffer" type="GLuint" />
+      <param name="internalformat" type="GLenum" />
+      <param name="offset" type="GLintptr" />
+      <param name="size" type="GLsizeiptr" />
+      <param name="format" type="GLenum" />
+      <param name="type" type="GLenum" />
+      <param name="data" type="const GLvoid *" />
+   </function>
+
   <!-- Texture object functions -->
 
    <function name="CreateTextures" offset="assign">
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index 31ae006..1ec1681 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -660,11 +660,11 @@ _mesa_buffer_get_subdata( struct gl_context *ctx, GLintptrARB offset,
  * dd_function_table::ClearBufferSubData.
  */
 void
-_mesa_buffer_clear_subdata(struct gl_context *ctx,
-                           GLintptr offset, GLsizeiptr size,
-                           const GLvoid *clearValue,
-                           GLsizeiptr clearValueSize,
-                           struct gl_buffer_object *bufObj)
+_mesa_ClearBufferSubData_sw(struct gl_context *ctx,
+                            GLintptr offset, GLsizeiptr size,
+                            const GLvoid *clearValue,
+                            GLsizeiptr clearValueSize,
+                            struct gl_buffer_object *bufObj)
 {
    GLsizeiptr i;
    GLubyte *dest;
@@ -1113,7 +1113,7 @@ _mesa_init_buffer_object_functions(struct dd_function_table *driver)
    driver->UnmapBuffer = _mesa_buffer_unmap;
 
    /* GL_ARB_clear_buffer_object */
-   driver->ClearBufferSubData = _mesa_buffer_clear_subdata;
+   driver->ClearBufferSubData = _mesa_ClearBufferSubData_sw;
 
    /* GL_ARB_map_buffer_range */
    driver->MapBufferRange = _mesa_buffer_map_range;
@@ -1666,57 +1666,93 @@ _mesa_GetBufferSubData(GLenum target, GLintptr offset,
    ctx->Driver.GetBufferSubData( ctx, offset, size, data, bufObj );
 }
 
-
-void GLAPIENTRY
-_mesa_ClearBufferData(GLenum target, GLenum internalformat, GLenum format,
-                      GLenum type, const GLvoid* data)
+/**
+ * \param subdata   true if caller is *SubData, false if *Data
+ */
+void
+_mesa_clear_buffer_sub_data(struct gl_context *ctx,
+                            struct gl_buffer_object *bufObj,
+                            GLenum internalformat,
+                            GLintptr offset, GLsizeiptr size,
+                            GLenum format, GLenum type,
+                            const GLvoid *data,
+                            const char *func, bool subdata)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   struct gl_buffer_object* bufObj;
    mesa_format mesaFormat;
    GLubyte clearValue[MAX_PIXEL_BYTES];
    GLsizeiptr clearValueSize;
 
-   bufObj = get_buffer(ctx, "glClearBufferData", target, GL_INVALID_VALUE);
-   if (!bufObj) {
-      return;
-   }
-
-   if (_mesa_check_disallowed_mapping(bufObj)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glClearBufferData(buffer currently mapped)");
+   /* This checks for disallowed mappings. */
+   if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size,
+                                         subdata, func)) {
       return;
    }
 
    mesaFormat = validate_clear_buffer_format(ctx, internalformat,
-                                             format, type,
-                                             "glClearBufferData");
+                                             format, type, func);
+
    if (mesaFormat == MESA_FORMAT_NONE) {
       return;
    }
 
    clearValueSize = _mesa_get_format_bytes(mesaFormat);
-   if (bufObj->Size % clearValueSize != 0) {
+   if (offset % clearValueSize != 0 || size % clearValueSize != 0) {
       _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glClearBufferData(size is not a multiple of "
-                  "internalformat size)");
+                  "%s(offset or size is not a multiple of "
+                  "internalformat size)", func);
       return;
    }
 
    if (data == NULL) {
       /* clear to zeros, per the spec */
-      ctx->Driver.ClearBufferSubData(ctx, 0, bufObj->Size,
-                                     NULL, clearValueSize, bufObj);
+      if (size > 0) {
+         ctx->Driver.ClearBufferSubData(ctx, offset, size,
+                                        NULL, clearValueSize, bufObj);
+      }
       return;
    }
 
    if (!convert_clear_buffer_data(ctx, mesaFormat, clearValue,
-                                  format, type, data, "glClearBufferData")) {
+                                  format, type, data, func)) {
       return;
    }
 
-   ctx->Driver.ClearBufferSubData(ctx, 0, bufObj->Size,
-                                  clearValue, clearValueSize, bufObj);
+   if (size > 0) {
+      ctx->Driver.ClearBufferSubData(ctx, offset, size,
+                                     clearValue, clearValueSize, bufObj);
+   }
+}
+
+void GLAPIENTRY
+_mesa_ClearBufferData(GLenum target, GLenum internalformat, GLenum format,
+                      GLenum type, const GLvoid *data)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_buffer_object *bufObj;
+
+   bufObj = get_buffer(ctx, "glClearBufferData", target, GL_INVALID_VALUE);
+   if (!bufObj)
+      return;
+
+   _mesa_clear_buffer_sub_data(ctx, bufObj, internalformat, 0, bufObj->Size,
+                               format, type, data,
+                               "glClearBufferData", false);
+}
+
+void GLAPIENTRY
+_mesa_ClearNamedBufferData(GLuint buffer, GLenum internalformat,
+                           GLenum format, GLenum type, const GLvoid *data)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_buffer_object *bufObj;
+
+   bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glClearNamedBufferData");
+   if (!bufObj)
+      return;
+
+   _mesa_clear_buffer_sub_data(ctx, bufObj, internalformat, 0, bufObj->Size,
+                               format, type, data,
+                               "glClearNamedBufferData", false);
 }
 
 
@@ -1724,57 +1760,37 @@ void GLAPIENTRY
 _mesa_ClearBufferSubData(GLenum target, GLenum internalformat,
                          GLintptr offset, GLsizeiptr size,
                          GLenum format, GLenum type,
-                         const GLvoid* data)
+                         const GLvoid *data)
 {
    GET_CURRENT_CONTEXT(ctx);
-   struct gl_buffer_object* bufObj;
-   mesa_format mesaFormat;
-   GLubyte clearValue[MAX_PIXEL_BYTES];
-   GLsizeiptr clearValueSize;
+   struct gl_buffer_object *bufObj;
 
    bufObj = get_buffer(ctx, "glClearBufferSubData", target, GL_INVALID_VALUE);
    if (!bufObj)
       return;
 
-   if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size,
-                                         true, "glClearBufferSubData")) {
-      return;
-   }
-
-   mesaFormat = validate_clear_buffer_format(ctx, internalformat,
-                                             format, type,
-                                             "glClearBufferSubData");
-   if (mesaFormat == MESA_FORMAT_NONE) {
-      return;
-   }
-
-   clearValueSize = _mesa_get_format_bytes(mesaFormat);
-   if (offset % clearValueSize != 0 || size % clearValueSize != 0) {
-      _mesa_error(ctx, GL_INVALID_VALUE,
-                  "glClearBufferSubData(offset or size is not a multiple of "
-                  "internalformat size)");
-      return;
-   }
+   _mesa_clear_buffer_sub_data(ctx, bufObj, internalformat, offset, size,
+                               format, type, data,
+                               "glClearBufferSubData", true);
+}
 
-   if (data == NULL) {
-      /* clear to zeros, per the spec */
-      if (size > 0) {
-         ctx->Driver.ClearBufferSubData(ctx, offset, size,
-                                        NULL, clearValueSize, bufObj);
-      }
-      return;
-   }
+void GLAPIENTRY
+_mesa_ClearNamedBufferSubData(GLuint buffer, GLenum internalformat,
+                              GLintptr offset, GLsizeiptr size,
+                              GLenum format, GLenum type,
+                              const GLvoid *data)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_buffer_object *bufObj;
 
-   if (!convert_clear_buffer_data(ctx, mesaFormat, clearValue,
-                                  format, type, data,
-                                  "glClearBufferSubData")) {
+   bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
+                                       "glClearNamedBufferSubData");
+   if (!bufObj)
       return;
-   }
 
-   if (size > 0) {
-      ctx->Driver.ClearBufferSubData(ctx, offset, size,
-                                     clearValue, clearValueSize, bufObj);
-   }
+   _mesa_clear_buffer_sub_data(ctx, bufObj, internalformat, offset, size,
+                               format, type, data,
+                               "glClearNamedBufferSubData", true);
 }
 
 
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
index 206c002..b6e833d 100644
--- a/src/mesa/main/bufferobj.h
+++ b/src/mesa/main/bufferobj.h
@@ -156,11 +156,20 @@ _mesa_copy_buffer_sub_data(struct gl_context *ctx,
                            GLsizeiptr size, const char *func);
 
 extern void
-_mesa_buffer_clear_subdata(struct gl_context *ctx,
-                           GLintptr offset, GLsizeiptr size,
-                           const GLvoid *clearValue,
-                           GLsizeiptr clearValueSize,
-                           struct gl_buffer_object *bufObj);
+_mesa_ClearBufferSubData_sw(struct gl_context *ctx,
+                            GLintptr offset, GLsizeiptr size,
+                            const GLvoid *clearValue,
+                            GLsizeiptr clearValueSize,
+                            struct gl_buffer_object *bufObj);
+
+extern void
+_mesa_clear_buffer_sub_data(struct gl_context *ctx,
+                            struct gl_buffer_object *bufObj,
+                            GLenum internalformat,
+                            GLintptr offset, GLsizeiptr size,
+                            GLenum format, GLenum type,
+                            const GLvoid *data,
+                            const char *func, bool subdata);
 
 /*
  * API functions
@@ -211,13 +220,24 @@ _mesa_GetBufferSubData(GLenum target, GLintptrARB offset,
 void GLAPIENTRY
 _mesa_ClearBufferData(GLenum target, GLenum internalformat,
                       GLenum format, GLenum type,
-                      const GLvoid * data);
+                      const GLvoid *data);
+
+void GLAPIENTRY
+_mesa_ClearNamedBufferData(GLuint buffer, GLenum internalformat,
+                           GLenum format, GLenum type,
+                           const GLvoid *data);
 
 void GLAPIENTRY
 _mesa_ClearBufferSubData(GLenum target, GLenum internalformat,
                          GLintptr offset, GLsizeiptr size,
                          GLenum format, GLenum type,
-                         const GLvoid * data);
+                         const GLvoid *data);
+
+void GLAPIENTRY
+_mesa_ClearNamedBufferSubData(GLuint buffer, GLenum internalformat,
+                              GLintptr offset, GLsizeiptr size,
+                              GLenum format, GLenum type,
+                              const GLvoid *data);
 
 void * GLAPIENTRY
 _mesa_MapBuffer(GLenum target, GLenum access);
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
index 30d2040..9dcfecc 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -960,6 +960,8 @@ const struct function gl_core_functions_possible[] = {
    { "glNamedBufferData", 45, -1 },
    { "glNamedBufferSubData", 45, -1 },
    { "glCopyNamedBufferSubData", 45, -1 },
+   { "glClearNamedBufferData", 45, -1 },
+   { "glClearNamedBufferSubData", 45, -1 },
    { "glCreateTextures", 45, -1 },
    { "glTextureStorage1D", 45, -1 },
    { "glTextureStorage2D", 45, -1 },
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
index 55f3644..3042e8d 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -470,8 +470,8 @@ st_clear_buffer_subdata(struct gl_context *ctx,
    static const char zeros[16] = {0};
 
    if (!pipe->clear_buffer) {
-      _mesa_buffer_clear_subdata(ctx, offset, size,
-                                 clearValue, clearValueSize, bufObj);
+      _mesa_ClearBufferSubData_sw(ctx, offset, size,
+                                  clearValue, clearValueSize, bufObj);
       return;
    }
 
-- 
2.1.0



More information about the mesa-dev mailing list