glthread: merge glBufferData and glNamedBufferData into 1 set of functions
authorMarek Olšák <marek.olsak@amd.com>
Tue, 25 Feb 2020 00:58:38 +0000 (19:58 -0500)
committerMarge Bot <eric+marge@anholt.net>
Fri, 6 Mar 2020 01:06:14 +0000 (01:06 +0000)
This is a big cleanup.
GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD also doesn't sync anymore.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3948>

src/mesa/main/marshal.c
src/mesa/main/marshal.h

index f8eabf1b53c000609fdd2c3ea70e1e5f91e44a90..df1ab78cd5db62ac01f0171e9803bb057a19ae32 100644 (file)
@@ -186,10 +186,12 @@ _mesa_glthread_BindBuffer(struct gl_context *ctx, GLenum target, GLuint buffer)
 struct marshal_cmd_BufferData
 {
    struct marshal_cmd_base cmd_base;
-   GLenum target;
+   GLuint target_or_name;
    GLsizeiptr size;
    GLenum usage;
+   const GLvoid *data_external_mem;
    bool data_null; /* If set, no data follows for "data" */
+   bool named;
    /* Next size bytes are GLubyte data[size] */
 };
 
@@ -197,56 +199,95 @@ void
 _mesa_unmarshal_BufferData(struct gl_context *ctx,
                            const struct marshal_cmd_BufferData *cmd)
 {
-   const GLenum target = cmd->target;
-   const GLsizeiptr size = cmd->size;
+   const GLuint target_or_name = cmd->target_or_name;
+   const GLsizei size = cmd->size;
    const GLenum usage = cmd->usage;
    const void *data;
 
    if (cmd->data_null)
       data = NULL;
+   else if (!cmd->named && target_or_name == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD)
+      data = cmd->data_external_mem;
    else
       data = (const void *) (cmd + 1);
 
-   CALL_BufferData(ctx->CurrentServerDispatch, (target, size, data, usage));
+   if (cmd->named) {
+      CALL_NamedBufferData(ctx->CurrentServerDispatch,
+                           (target_or_name, size, data, usage));
+   } else {
+      CALL_BufferData(ctx->CurrentServerDispatch,
+                      (target_or_name, size, data, usage));
+   }
 }
 
-void GLAPIENTRY
-_mesa_marshal_BufferData(GLenum target, GLsizeiptr size, const GLvoid * data,
-                         GLenum usage)
+void
+_mesa_unmarshal_NamedBufferData(struct gl_context *ctx,
+                                const struct marshal_cmd_BufferData *cmd)
+{
+   unreachable("never used - all BufferData variants use DISPATCH_CMD_BufferData");
+}
+
+static void
+_mesa_marshal_BufferData_merged(GLuint target_or_name, GLsizeiptr size,
+                                const GLvoid *data, GLenum usage, bool named,
+                                const char *func)
 {
    GET_CURRENT_CONTEXT(ctx);
-   size_t cmd_size =
-      sizeof(struct marshal_cmd_BufferData) + (data ? size : 0);
+   bool external_mem = !named &&
+                       target_or_name == GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD;
+   bool copy_data = data && !external_mem;
+   int cmd_size = sizeof(struct marshal_cmd_BufferData) + (copy_data ? size : 0);
    debug_print_marshal("BufferData");
 
-   if (unlikely(size < 0)) {
-      _mesa_glthread_finish(ctx);
-      _mesa_error(ctx, GL_INVALID_VALUE, "BufferData(size < 0)");
+   if (unlikely(size < 0 || size > INT_MAX || cmd_size < 0 ||
+                cmd_size > MARSHAL_MAX_CMD_SIZE ||
+                (named && target_or_name == 0))) {
+      _mesa_glthread_finish_before(ctx, func);
+      if (named) {
+         CALL_NamedBufferData(ctx->CurrentServerDispatch,
+                              (target_or_name, size, data, usage));
+      } else {
+         CALL_BufferData(ctx->CurrentServerDispatch,
+                         (target_or_name, size, data, usage));
+      }
       return;
    }
 
-   if (target != GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD &&
-       cmd_size <= MARSHAL_MAX_CMD_SIZE) {
-      struct marshal_cmd_BufferData *cmd =
-         _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_BufferData,
-                                         cmd_size);
+   struct marshal_cmd_BufferData *cmd =
+      _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_BufferData,
+                                      cmd_size);
 
-      cmd->target = target;
-      cmd->size = size;
-      cmd->usage = usage;
-      cmd->data_null = !data;
-      if (data) {
-         char *variable_data = (char *) (cmd + 1);
-         memcpy(variable_data, data, size);
-      }
-      _mesa_post_marshal_hook(ctx);
-   } else {
-      _mesa_glthread_finish(ctx);
-      CALL_BufferData(ctx->CurrentServerDispatch,
-                      (target, size, data, usage));
+   cmd->target_or_name = target_or_name;
+   cmd->size = size;
+   cmd->usage = usage;
+   cmd->data_null = !data;
+   cmd->named = named;
+   cmd->data_external_mem = data;
+
+   if (copy_data) {
+      char *variable_data = (char *) (cmd + 1);
+      memcpy(variable_data, data, size);
    }
+   _mesa_post_marshal_hook(ctx);
 }
 
+void GLAPIENTRY
+_mesa_marshal_BufferData(GLenum target, GLsizeiptr size, const GLvoid * data,
+                         GLenum usage)
+{
+   _mesa_marshal_BufferData_merged(target, size, data, usage, false,
+                                   "BufferData");
+}
+
+void GLAPIENTRY
+_mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size,
+                              const GLvoid * data, GLenum usage)
+{
+   _mesa_marshal_BufferData_merged(buffer, size, data, usage, true,
+                                   "NamedBufferData");
+}
+
+
 /* BufferSubData: marshalled asynchronously */
 struct marshal_cmd_BufferSubData
 {
@@ -302,68 +343,6 @@ _mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size,
    }
 }
 
-/* NamedBufferData: marshalled asynchronously */
-struct marshal_cmd_NamedBufferData
-{
-   struct marshal_cmd_base cmd_base;
-   GLuint name;
-   GLsizei size;
-   GLenum usage;
-   bool data_null; /* If set, no data follows for "data" */
-   /* Next size bytes are GLubyte data[size] */
-};
-
-void
-_mesa_unmarshal_NamedBufferData(struct gl_context *ctx,
-                                const struct marshal_cmd_NamedBufferData *cmd)
-{
-   const GLuint name = cmd->name;
-   const GLsizei size = cmd->size;
-   const GLenum usage = cmd->usage;
-   const void *data;
-
-   if (cmd->data_null)
-      data = NULL;
-   else
-      data = (const void *) (cmd + 1);
-
-   CALL_NamedBufferData(ctx->CurrentServerDispatch,
-                        (name, size, data, usage));
-}
-
-void GLAPIENTRY
-_mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size,
-                              const GLvoid * data, GLenum usage)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   size_t cmd_size = sizeof(struct marshal_cmd_NamedBufferData) + (data ? size : 0);
-
-   debug_print_marshal("NamedBufferData");
-   if (unlikely(size < 0)) {
-      _mesa_glthread_finish(ctx);
-      _mesa_error(ctx, GL_INVALID_VALUE, "NamedBufferData(size < 0)");
-      return;
-   }
-
-   if (buffer > 0 && cmd_size <= MARSHAL_MAX_CMD_SIZE) {
-      struct marshal_cmd_NamedBufferData *cmd =
-         _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_NamedBufferData,
-                                         cmd_size);
-      cmd->name = buffer;
-      cmd->size = size;
-      cmd->usage = usage;
-      cmd->data_null = !data;
-      if (data) {
-         char *variable_data = (char *) (cmd + 1);
-         memcpy(variable_data, data, size);
-      }
-      _mesa_post_marshal_hook(ctx);
-   } else {
-      _mesa_glthread_finish(ctx);
-      CALL_NamedBufferData(ctx->CurrentServerDispatch,
-                           (buffer, size, data, usage));
-   }
-}
 
 /* NamedBufferSubData: marshalled asynchronously */
 struct marshal_cmd_NamedBufferSubData
index b75613b9a3e08d8a3ff5f5a433a460da54df6983..558c8d11b5bd768ba882c84fe9fbffcfb05cdd0a 100644 (file)
@@ -153,7 +153,6 @@ _mesa_create_marshal_table(const struct gl_context *ctx);
 struct marshal_cmd_ShaderSource;
 struct marshal_cmd_BufferData;
 struct marshal_cmd_BufferSubData;
-struct marshal_cmd_NamedBufferData;
 struct marshal_cmd_NamedBufferSubData;
 
 void GLAPIENTRY
@@ -171,10 +170,18 @@ void
 _mesa_unmarshal_BufferData(struct gl_context *ctx,
                            const struct marshal_cmd_BufferData *cmd);
 
+void
+_mesa_unmarshal_NamedBufferData(struct gl_context *ctx,
+                                const struct marshal_cmd_BufferData *cmd);
+
 void GLAPIENTRY
 _mesa_marshal_BufferData(GLenum target, GLsizeiptr size, const GLvoid * data,
                          GLenum usage);
 
+void GLAPIENTRY
+_mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size,
+                              const GLvoid * data, GLenum usage);
+
 void
 _mesa_unmarshal_BufferSubData(struct gl_context *ctx,
                               const struct marshal_cmd_BufferSubData *cmd);
@@ -183,14 +190,6 @@ void GLAPIENTRY
 _mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size,
                             const GLvoid * data);
 
-void
-_mesa_unmarshal_NamedBufferData(struct gl_context *ctx,
-                                const struct marshal_cmd_NamedBufferData *cmd);
-
-void GLAPIENTRY
-_mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size,
-                              const GLvoid * data, GLenum usage);
-
 void
 _mesa_unmarshal_NamedBufferSubData(struct gl_context *ctx,
                                    const struct marshal_cmd_NamedBufferSubData *cmd);