From 108fdb54c6c1b82ec3131b0c2e00d554b3729cfb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 19 Feb 2020 19:54:00 -0500 Subject: [PATCH] glthread: replace custom ClearBuffer marshalling with generated one If the count attribute contains "enum", the count is evaluated only once. Reviewed-by: Timothy Arceri Part-of: --- src/mapi/glapi/gen/GL3x.xml | 14 +-- src/mesa/main/marshal.c | 223 ------------------------------------ src/mesa/main/marshal.h | 51 +++------ 3 files changed, 22 insertions(+), 266 deletions(-) diff --git a/src/mapi/glapi/gen/GL3x.xml b/src/mapi/glapi/gen/GL3x.xml index 3ffc1667607..5608353cb28 100644 --- a/src/mapi/glapi/gen/GL3x.xml +++ b/src/mapi/glapi/gen/GL3x.xml @@ -117,25 +117,25 @@ - + - + - + - + - + - + - + diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c index 24e419ca337..b6001d7dbed 100644 --- a/src/mesa/main/marshal.c +++ b/src/mesa/main/marshal.c @@ -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)); - } -} diff --git a/src/mesa/main/marshal.h b/src/mesa/main/marshal.h index a172ed30043..676050319f1 100644 --- a/src/mesa/main/marshal.h +++ b/src/mesa/main/marshal.h @@ -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 */ -- 2.30.2