Re: [Mesa-dev] [PATCH 2/2] mesa/marshal: add marshalling for glClearBuffer*

2017-07-14 Thread Marek Olšák
For the series:

Reviewed-by: Marek Olšák 

Marek

On Sun, Jul 9, 2017 at 6:21 PM, Grigori Goronzy  wrote:
> Add async marshalling/unmarshalling for all glClearBuffer variants.
> These entry points are commonly used in general and Alien Isolation
> specifically uses glClearBufferiv. Slightly reduces the number of
> thread synchronizations with glthread in that game.
> ---
>  src/mapi/glapi/gen/GL3x.xml |   6 +-
>  src/mesa/main/marshal.c | 133 
> +++-
>  src/mesa/main/marshal.h |  29 +-
>  3 files changed, 163 insertions(+), 5 deletions(-)
>
> diff --git a/src/mapi/glapi/gen/GL3x.xml b/src/mapi/glapi/gen/GL3x.xml
> index 24490da..7c86e8f 100644
> --- a/src/mapi/glapi/gen/GL3x.xml
> +++ b/src/mapi/glapi/gen/GL3x.xml
> @@ -117,13 +117,13 @@
>
>
>
> -  
> +  
>  
>  
>  
>
>
> -  
> +  
>  
>  
>  
> @@ -135,7 +135,7 @@
>  
>
>
> -  
> +  
>  
>  
>  
> diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c
> index 1edc580..5fc733f 100644
> --- a/src/mesa/main/marshal.c
> +++ b/src/mesa/main/marshal.c
> @@ -516,7 +516,7 @@ _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr 
> offset,
> }
>  }
>
> -/* ClearBufferfv: marshalled asynchronously */
> +/* ClearBuffer* (all variants): marshalled asynchronously */
>  struct marshal_cmd_ClearBuffer
>  {
> struct marshal_cmd_base cmd_base;
> @@ -537,6 +537,46 @@ _mesa_unmarshal_ClearBufferfv(struct gl_context *ctx,
>(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) {
> @@ -607,3 +647,94 @@ _mesa_marshal_ClearBufferfv(GLenum buffer, GLint 
> drawbuffer,
>   (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
> +   *

[Mesa-dev] [PATCH 2/2] mesa/marshal: add marshalling for glClearBuffer*

2017-07-09 Thread Grigori Goronzy
Add async marshalling/unmarshalling for all glClearBuffer variants.
These entry points are commonly used in general and Alien Isolation
specifically uses glClearBufferiv. Slightly reduces the number of
thread synchronizations with glthread in that game.
---
 src/mapi/glapi/gen/GL3x.xml |   6 +-
 src/mesa/main/marshal.c | 133 +++-
 src/mesa/main/marshal.h |  29 +-
 3 files changed, 163 insertions(+), 5 deletions(-)

diff --git a/src/mapi/glapi/gen/GL3x.xml b/src/mapi/glapi/gen/GL3x.xml
index 24490da..7c86e8f 100644
--- a/src/mapi/glapi/gen/GL3x.xml
+++ b/src/mapi/glapi/gen/GL3x.xml
@@ -117,13 +117,13 @@
 
   
 
-  
+  
 
 
 
   
 
-  
+  
 
 
 
@@ -135,7 +135,7 @@
 
   
 
-  
+  
 
 
 
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c
index 1edc580..5fc733f 100644
--- a/src/mesa/main/marshal.c
+++ b/src/mesa/main/marshal.c
@@ -516,7 +516,7 @@ _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr 
offset,
}
 }
 
-/* ClearBufferfv: marshalled asynchronously */
+/* ClearBuffer* (all variants): marshalled asynchronously */
 struct marshal_cmd_ClearBuffer
 {
struct marshal_cmd_base cmd_base;
@@ -537,6 +537,46 @@ _mesa_unmarshal_ClearBufferfv(struct gl_context *ctx,
   (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) {
@@ -607,3 +647,94 @@ _mesa_marshal_ClearBufferfv(GLenum buffer, GLint 
drawbuffer,
  (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_glthre