diff options
author | Marek Olšák <[email protected]> | 2020-02-24 19:58:38 -0500 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-03-06 01:06:14 +0000 |
commit | b8aa5edfc5632e7c7a164566b61c21a6658025b3 (patch) | |
tree | 1ee2e69a3fcbd4a3399bc19a46de77492f655983 /src | |
parent | 8eb03327497f3f0c0147ceea5c22213c4dfd1b13 (diff) |
glthread: merge glBufferSubData and glNamedBufferSubData into 1 set of functions
This is a big cleanup.
GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD also doesn't sync anymore.
Reviewed-by: Timothy Arceri <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3948>
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/marshal.c | 124 | ||||
-rw-r--r-- | src/mesa/main/marshal.h | 9 |
2 files changed, 55 insertions, 78 deletions
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c index df1ab78cd5d..9014cb1ff23 100644 --- a/src/mesa/main/marshal.c +++ b/src/mesa/main/marshal.c @@ -292,9 +292,10 @@ _mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size, struct marshal_cmd_BufferSubData { struct marshal_cmd_base cmd_base; - GLenum target; + GLenum target_or_name; GLintptr offset; GLsizeiptr size; + bool named; /* Next size bytes are GLubyte data[size] */ }; @@ -302,98 +303,75 @@ void _mesa_unmarshal_BufferSubData(struct gl_context *ctx, const struct marshal_cmd_BufferSubData *cmd) { - const GLenum target = cmd->target; + const GLenum target_or_name = cmd->target_or_name; const GLintptr offset = cmd->offset; const GLsizeiptr size = cmd->size; const void *data = (const void *) (cmd + 1); - CALL_BufferSubData(ctx->CurrentServerDispatch, - (target, offset, size, data)); + if (cmd->named) { + CALL_NamedBufferSubData(ctx->CurrentServerDispatch, + (target_or_name, offset, size, data)); + } else { + CALL_BufferSubData(ctx->CurrentServerDispatch, + (target_or_name, offset, size, data)); + } } -void GLAPIENTRY -_mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, - const GLvoid * data) +void +_mesa_unmarshal_NamedBufferSubData(struct gl_context *ctx, + const struct marshal_cmd_BufferSubData *cmd) +{ + unreachable("never used - all BufferSubData variants use DISPATCH_CMD_BufferSubData"); +} + +static void +_mesa_marshal_BufferSubData_merged(GLuint target_or_name, GLintptr offset, + GLsizeiptr size, const GLvoid *data, + bool named, const char *func) { GET_CURRENT_CONTEXT(ctx); size_t cmd_size = sizeof(struct marshal_cmd_BufferSubData) + size; + debug_print_marshal(func); - debug_print_marshal("BufferSubData"); - if (unlikely(size < 0)) { - _mesa_glthread_finish(ctx); - _mesa_error(ctx, GL_INVALID_VALUE, "BufferSubData(size < 0)"); + if (unlikely(size < 0 || size > INT_MAX || cmd_size < 0 || + cmd_size > MARSHAL_MAX_CMD_SIZE || !data || + (named && target_or_name == 0))) { + _mesa_glthread_finish_before(ctx, func); + if (named) { + CALL_NamedBufferSubData(ctx->CurrentServerDispatch, + (target_or_name, offset, size, data)); + } else { + CALL_BufferSubData(ctx->CurrentServerDispatch, + (target_or_name, offset, size, data)); + } return; } - if (target != GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD && - cmd_size <= MARSHAL_MAX_CMD_SIZE) { - struct marshal_cmd_BufferSubData *cmd = - _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_BufferSubData, - cmd_size); - cmd->target = target; - cmd->offset = offset; - cmd->size = size; - char *variable_data = (char *) (cmd + 1); - memcpy(variable_data, data, size); - _mesa_post_marshal_hook(ctx); - } else { - _mesa_glthread_finish(ctx); - CALL_BufferSubData(ctx->CurrentServerDispatch, - (target, offset, size, data)); - } -} - + struct marshal_cmd_BufferSubData *cmd = + _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_BufferSubData, + cmd_size); + cmd->target_or_name = target_or_name; + cmd->offset = offset; + cmd->size = size; + cmd->named = named; -/* NamedBufferSubData: marshalled asynchronously */ -struct marshal_cmd_NamedBufferSubData -{ - struct marshal_cmd_base cmd_base; - GLuint name; - GLintptr offset; - GLsizei size; - /* Next size bytes are GLubyte data[size] */ -}; + char *variable_data = (char *) (cmd + 1); + memcpy(variable_data, data, size); + _mesa_post_marshal_hook(ctx); +} -void -_mesa_unmarshal_NamedBufferSubData(struct gl_context *ctx, - const struct marshal_cmd_NamedBufferSubData *cmd) +void GLAPIENTRY +_mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, + const GLvoid * data) { - const GLuint name = cmd->name; - const GLintptr offset = cmd->offset; - const GLsizei size = cmd->size; - const void *data = (const void *) (cmd + 1); - - CALL_NamedBufferSubData(ctx->CurrentServerDispatch, - (name, offset, size, data)); + _mesa_marshal_BufferSubData_merged(target, offset, size, data, false, + "BufferSubData"); } void GLAPIENTRY _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data) { - GET_CURRENT_CONTEXT(ctx); - size_t cmd_size = sizeof(struct marshal_cmd_NamedBufferSubData) + size; - - debug_print_marshal("NamedBufferSubData"); - if (unlikely(size < 0)) { - _mesa_glthread_finish(ctx); - _mesa_error(ctx, GL_INVALID_VALUE, "NamedBufferSubData(size < 0)"); - return; - } - - if (buffer > 0 && cmd_size <= MARSHAL_MAX_CMD_SIZE) { - struct marshal_cmd_NamedBufferSubData *cmd = - _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_NamedBufferSubData, - cmd_size); - cmd->name = buffer; - cmd->offset = offset; - cmd->size = size; - char *variable_data = (char *) (cmd + 1); - memcpy(variable_data, data, size); - _mesa_post_marshal_hook(ctx); - } else { - _mesa_glthread_finish(ctx); - CALL_NamedBufferSubData(ctx->CurrentServerDispatch, - (buffer, offset, size, data)); - } + _mesa_marshal_BufferSubData_merged(buffer, offset, size, data, true, + "NamedBufferSubData"); } diff --git a/src/mesa/main/marshal.h b/src/mesa/main/marshal.h index 558c8d11b5b..c4b738aeb11 100644 --- a/src/mesa/main/marshal.h +++ b/src/mesa/main/marshal.h @@ -153,7 +153,6 @@ _mesa_create_marshal_table(const struct gl_context *ctx); struct marshal_cmd_ShaderSource; struct marshal_cmd_BufferData; struct marshal_cmd_BufferSubData; -struct marshal_cmd_NamedBufferSubData; void GLAPIENTRY _mesa_marshal_ShaderSource(GLuint shader, GLsizei count, @@ -186,14 +185,14 @@ void _mesa_unmarshal_BufferSubData(struct gl_context *ctx, const struct marshal_cmd_BufferSubData *cmd); +void +_mesa_unmarshal_NamedBufferSubData(struct gl_context *ctx, + const struct marshal_cmd_BufferSubData *cmd); + void GLAPIENTRY _mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data); -void -_mesa_unmarshal_NamedBufferSubData(struct gl_context *ctx, - const struct marshal_cmd_NamedBufferSubData *cmd); - void GLAPIENTRY _mesa_marshal_NamedBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr size, const GLvoid * data); |