diff options
Diffstat (limited to 'src/mesa/main/marshal.c')
-rw-r--r-- | src/mesa/main/marshal.c | 133 |
1 files changed, 132 insertions, 1 deletions
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c index 5499bc41ae1..391b6e746c2 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)); + } +} |