aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-02-24 19:58:38 -0500
committerMarge Bot <[email protected]>2020-03-06 01:06:14 +0000
commitb8aa5edfc5632e7c7a164566b61c21a6658025b3 (patch)
tree1ee2e69a3fcbd4a3399bc19a46de77492f655983 /src/mesa/main
parent8eb03327497f3f0c0147ceea5c22213c4dfd1b13 (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/mesa/main')
-rw-r--r--src/mesa/main/marshal.c124
-rw-r--r--src/mesa/main/marshal.h9
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);