[Mesa-dev] [PATCH 2/2] mesa/marshal: add marshalling for glClearBuffer*
Marek Olšák
maraeo at gmail.com
Fri Jul 14 18:01:00 UTC 2017
For the series:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Sun, Jul 9, 2017 at 6:21 PM, Grigori Goronzy <greg at chown.ath.cx> 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 @@
>
> <!-- These functions are unique to GL3 -->
>
> - <function name="ClearBufferiv" es2="3.0">
> + <function name="ClearBufferiv" es2="3.0" marshal="custom">
> <param name="buffer" type="GLenum"/>
> <param name="drawbuffer" type="GLint"/>
> <param name="value" type="const GLint *"/>
> </function>
>
> - <function name="ClearBufferuiv" es2="3.0">
> + <function name="ClearBufferuiv" es2="3.0" marshal="custom">
> <param name="buffer" type="GLenum"/>
> <param name="drawbuffer" type="GLint"/>
> <param name="value" type="const GLuint *"/>
> @@ -135,7 +135,7 @@
> <param name="value" type="const GLfloat *"/>
> </function>
>
> - <function name="ClearBufferfi" es2="3.0">
> + <function name="ClearBufferfi" es2="3.0" marshal="custom">
> <param name="buffer" type="GLenum"/>
> <param name="drawbuffer" type="GLint"/>
> <param name="depth" type="GLfloat"/>
> 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_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));
> + }
> +}
> diff --git a/src/mesa/main/marshal.h b/src/mesa/main/marshal.h
> index 1567e7b..f2dc842 100644
> --- a/src/mesa/main/marshal.h
> +++ b/src/mesa/main/marshal.h
> @@ -183,7 +183,10 @@ 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_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,
> @@ -254,4 +257,28 @@ void GLAPIENTRY
> _mesa_marshal_ClearBufferfv(GLenum buffer, GLint drawbuffer,
> const GLfloat *value);
>
> +void GLAPIENTRY
> +_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 GLAPIENTRY
> +_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 GLAPIENTRY
> +_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);
> +
> #endif /* MARSHAL_H */
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list