glthread: replace custom ClearBuffer marshalling with generated one
authorMarek Olšák <marek.olsak@amd.com>
Thu, 20 Feb 2020 00:54:00 +0000 (19:54 -0500)
committerMarge Bot <eric+marge@anholt.net>
Fri, 6 Mar 2020 01:06:14 +0000 (01:06 +0000)
If the count attribute contains "enum", the count is evaluated only once.

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

src/mapi/glapi/gen/GL3x.xml
src/mesa/main/marshal.c
src/mesa/main/marshal.h

index 3ffc1667607048ef3403a794a3352735f8c30251..5608353cb28756181d5cf4f2714bec804f455367 100644 (file)
 
   <!-- These functions are unique to GL3 -->
 
-  <function name="ClearBufferiv" es2="3.0" marshal="custom" no_error="true">
+  <function name="ClearBufferiv" es2="3.0" no_error="true">
     <param name="buffer" type="GLenum"/>
     <param name="drawbuffer" type="GLint"/>
-    <param name="value" type="const GLint *"/>
+    <param name="value" type="const GLint *" count="_mesa_buffer_enum_to_count(buffer)"/>
   </function>
 
-  <function name="ClearBufferuiv" es2="3.0" marshal="custom" no_error="true">
+  <function name="ClearBufferuiv" es2="3.0" no_error="true">
     <param name="buffer" type="GLenum"/>
     <param name="drawbuffer" type="GLint"/>
-    <param name="value" type="const GLuint *"/>
+    <param name="value" type="const GLuint *" count="_mesa_buffer_enum_to_count(buffer)"/>
   </function>
 
-  <function name="ClearBufferfv" es2="3.0" marshal="custom" no_error="true">
+  <function name="ClearBufferfv" es2="3.0" no_error="true">
     <param name="buffer" type="GLenum"/>
     <param name="drawbuffer" type="GLint"/>
-    <param name="value" type="const GLfloat *"/>
+    <param name="value" type="const GLfloat *" count="_mesa_buffer_enum_to_count(buffer)"/>
   </function>
 
-  <function name="ClearBufferfi" es2="3.0" marshal="custom" no_error="true">
+  <function name="ClearBufferfi" es2="3.0" no_error="true">
     <param name="buffer" type="GLenum"/>
     <param name="drawbuffer" type="GLint"/>
     <param name="depth" type="GLfloat"/>
index 24e419ca3375cf04668c8f09bb7f62253481eaa1..b6001d7dbeddace0b655d4f3a004a44474ee73f1 100644 (file)
@@ -536,226 +536,3 @@ _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr offset,
                               (buffer, offset, size, data));
    }
 }
-
-/* ClearBuffer* (all variants): marshalled asynchronously */
-struct marshal_cmd_ClearBuffer
-{
-   struct marshal_cmd_base cmd_base;
-   GLenum buffer;
-   GLint drawbuffer;
-};
-
-void
-_mesa_unmarshal_ClearBufferfv(struct gl_context *ctx,
-                              const struct marshal_cmd_ClearBuffer *cmd)
-{
-   const GLenum buffer = cmd->buffer;
-   const GLint drawbuffer = cmd->drawbuffer;
-   const char *variable_data = (const char *) (cmd + 1);
-   const GLfloat *value = (const GLfloat *) variable_data;
-
-   CALL_ClearBufferfv(ctx->CurrentServerDispatch,
-                      (buffer, drawbuffer, value));
-}
-
-void
-_mesa_unmarshal_ClearBufferiv(struct gl_context *ctx,
-                              const struct marshal_cmd_ClearBuffer *cmd)
-{
-   const GLenum buffer = cmd->buffer;
-   const GLint drawbuffer = cmd->drawbuffer;
-   const char *variable_data = (const char *) (cmd + 1);
-   const GLint *value = (const GLint *) variable_data;
-
-   CALL_ClearBufferiv(ctx->CurrentServerDispatch,
-                      (buffer, drawbuffer, value));
-}
-
-void
-_mesa_unmarshal_ClearBufferuiv(struct gl_context *ctx,
-                               const struct marshal_cmd_ClearBuffer *cmd)
-{
-   const GLenum buffer = cmd->buffer;
-   const GLint drawbuffer = cmd->drawbuffer;
-   const char *variable_data = (const char *) (cmd + 1);
-   const GLuint *value = (const GLuint *) variable_data;
-
-   CALL_ClearBufferuiv(ctx->CurrentServerDispatch,
-                       (buffer, drawbuffer, value));
-}
-
-void
-_mesa_unmarshal_ClearBufferfi(struct gl_context *ctx,
-                              const struct marshal_cmd_ClearBuffer *cmd)
-{
-   const GLenum buffer = cmd->buffer;
-   const GLint drawbuffer = cmd->drawbuffer;
-   const char *variable_data = (const char *) (cmd + 1);
-   const GLfloat *depth = (const GLfloat *) variable_data;
-   const GLint *stencil = (const GLint *) (variable_data + 4);
-
-   CALL_ClearBufferfi(ctx->CurrentServerDispatch,
-                      (buffer, drawbuffer, *depth, *stencil));
-}
-
-static inline size_t buffer_to_size(GLenum buffer)
-{
-   switch (buffer) {
-   case GL_COLOR:
-      return 4;
-   case GL_DEPTH_STENCIL:
-      return 2;
-   case GL_STENCIL:
-   case GL_DEPTH:
-      return 1;
-   default:
-      return 0;
-   }
-}
-
-static inline bool clear_buffer_add_command(struct gl_context *ctx, uint16_t id,
-                                            GLenum buffer, GLint drawbuffer,
-                                            const GLuint *value, size_t size)
-{
-   size_t cmd_size = sizeof(struct marshal_cmd_ClearBuffer) + 4 * size;
-   if (cmd_size <= MARSHAL_MAX_CMD_SIZE) {
-      struct marshal_cmd_ClearBuffer *cmd =
-         _mesa_glthread_allocate_command(ctx, id,
-                                         cmd_size);
-      cmd->buffer = buffer;
-      cmd->drawbuffer = drawbuffer;
-      GLuint *variable_data = (GLuint *) (cmd + 1);
-      if (size == 4)
-         COPY_4V(variable_data,  value);
-      else if (size == 2)
-         COPY_2V(variable_data, value);
-      else
-         *variable_data = *value;
-
-      _mesa_post_marshal_hook(ctx);
-      return true;
-   }
-
-   return false;
-}
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferfv(GLenum buffer, GLint drawbuffer,
-                            const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   debug_print_marshal("ClearBufferfv");
-
-   if (!(buffer == GL_DEPTH || buffer == GL_COLOR)) {
-      _mesa_glthread_finish(ctx);
-
-      /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
-       * of the OpenGL 4.5 spec states:
-       *
-       *    "An INVALID_ENUM error is generated by ClearBufferfv and
-       *     ClearNamedFramebufferfv if buffer is not COLOR or DEPTH."
-       */
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfv(buffer=%s)",
-                  _mesa_enum_to_string(buffer));
-   }
-
-   size_t size = buffer_to_size(buffer);
-   if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferfv, buffer,
-                                 drawbuffer, (GLuint *)value, size)) {
-      debug_print_sync("ClearBufferfv");
-      _mesa_glthread_finish(ctx);
-      CALL_ClearBufferfv(ctx->CurrentServerDispatch,
-                         (buffer, drawbuffer, value));
-   }
-}
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferiv(GLenum buffer, GLint drawbuffer,
-                            const GLint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   debug_print_marshal("ClearBufferiv");
-
-   if (!(buffer == GL_STENCIL || buffer == GL_COLOR)) {
-      _mesa_glthread_finish(ctx);
-
-      /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
-       * of the OpenGL 4.5 spec states:
-       *
-       *    "An INVALID_ENUM error is generated by ClearBufferiv and
-       *     ClearNamedFramebufferiv if buffer is not COLOR or STENCIL."
-       */
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferiv(buffer=%s)",
-                  _mesa_enum_to_string(buffer));
-   }
-
-   size_t size = buffer_to_size(buffer);
-   if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferiv, buffer,
-                                 drawbuffer, (GLuint *)value, size)) {
-      debug_print_sync("ClearBufferiv");
-      _mesa_glthread_finish(ctx);
-      CALL_ClearBufferiv(ctx->CurrentServerDispatch,
-                         (buffer, drawbuffer, value));
-   }
-}
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferuiv(GLenum buffer, GLint drawbuffer,
-                             const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   debug_print_marshal("ClearBufferuiv");
-
-   if (buffer != GL_COLOR) {
-      _mesa_glthread_finish(ctx);
-
-      /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
-       * of the OpenGL 4.5 spec states:
-       *
-       *    "An INVALID_ENUM error is generated by ClearBufferuiv and
-       *     ClearNamedFramebufferuiv if buffer is not COLOR."
-       */
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferuiv(buffer=%s)",
-                  _mesa_enum_to_string(buffer));
-   }
-
-   if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferuiv, buffer,
-                                 drawbuffer, (GLuint *)value, 4)) {
-      debug_print_sync("ClearBufferuiv");
-      _mesa_glthread_finish(ctx);
-      CALL_ClearBufferuiv(ctx->CurrentServerDispatch,
-                         (buffer, drawbuffer, value));
-   }
-}
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferfi(GLenum buffer, GLint drawbuffer,
-                            const GLfloat depth, const GLint stencil)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   debug_print_marshal("ClearBufferfi");
-
-   if (buffer != GL_DEPTH_STENCIL) {
-      _mesa_glthread_finish(ctx);
-
-      /* Page 498 of the PDF, section '17.4.3.1 Clearing Individual Buffers'
-       * of the OpenGL 4.5 spec states:
-       *
-       *    "An INVALID_ENUM error is generated by ClearBufferfi and
-       *     ClearNamedFramebufferfi if buffer is not DEPTH_STENCIL."
-       */
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfi(buffer=%s)",
-                  _mesa_enum_to_string(buffer));
-   }
-
-   fi_type value[2];
-   value[0].f = depth;
-   value[1].i = stencil;
-   if (!clear_buffer_add_command(ctx, DISPATCH_CMD_ClearBufferfi, buffer,
-                                 drawbuffer, (GLuint *)value, 2)) {
-      debug_print_sync("ClearBufferfi");
-      _mesa_glthread_finish(ctx);
-      CALL_ClearBufferfi(ctx->CurrentServerDispatch,
-                         (buffer, drawbuffer, depth, stencil));
-   }
-}
index a172ed30043e43b7a9185cc8ef64e2168d7452a6..676050319f1d8485fa1c40e743b5cd3990b27182 100644 (file)
@@ -183,11 +183,6 @@ struct marshal_cmd_BufferData;
 struct marshal_cmd_BufferSubData;
 struct marshal_cmd_NamedBufferData;
 struct marshal_cmd_NamedBufferSubData;
-struct marshal_cmd_ClearBuffer;
-#define marshal_cmd_ClearBufferfv   marshal_cmd_ClearBuffer
-#define marshal_cmd_ClearBufferiv   marshal_cmd_ClearBuffer
-#define marshal_cmd_ClearBufferuiv  marshal_cmd_ClearBuffer
-#define marshal_cmd_ClearBufferfi   marshal_cmd_ClearBuffer
 
 void
 _mesa_unmarshal_Enable(struct gl_context *ctx,
@@ -250,36 +245,20 @@ void GLAPIENTRY
 _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size,
                                  const GLvoid * data);
 
-void
-_mesa_unmarshal_ClearBufferfv(struct gl_context *ctx,
-                              const struct marshal_cmd_ClearBuffer *cmd);
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferfv(GLenum buffer, GLint drawbuffer,
-                            const GLfloat *value);
-
-void
-_mesa_unmarshal_ClearBufferiv(struct gl_context *ctx,
-                              const struct marshal_cmd_ClearBuffer *cmd);
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferiv(GLenum buffer, GLint drawbuffer,
-                            const GLint *value);
-
-void
-_mesa_unmarshal_ClearBufferuiv(struct gl_context *ctx,
-                               const struct marshal_cmd_ClearBuffer *cmd);
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferuiv(GLenum buffer, GLint drawbuffer,
-                             const GLuint *value);
-
-void
-_mesa_unmarshal_ClearBufferfi(struct gl_context *ctx,
-                              const struct marshal_cmd_ClearBuffer *cmd);
-
-void GLAPIENTRY
-_mesa_marshal_ClearBufferfi(GLenum buffer, GLint drawbuffer,
-                            const GLfloat depth, const GLint stencil);
+static inline unsigned
+_mesa_buffer_enum_to_count(GLenum buffer)
+{
+   switch (buffer) {
+   case GL_COLOR:
+      return 4;
+   case GL_DEPTH_STENCIL:
+      return 2;
+   case GL_STENCIL:
+   case GL_DEPTH:
+      return 1;
+   default:
+      return 0;
+   }
+}
 
 #endif /* MARSHAL_H */