summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorGrigori Goronzy <[email protected]>2017-06-24 18:59:55 +0200
committerTimothy Arceri <[email protected]>2017-06-26 09:06:23 +1000
commit95fb1c187a0ea8d13f401145282363228b91b246 (patch)
treef20a58cb521d1b48ddf8b522c2820b9a518597d4 /src/mesa/main
parent6a68170c8360d702a25e59740d04f79a4f8323a7 (diff)
mesa/marshal: add custom marshalling for glNamedBuffer(Sub)Data
These entry points are used by Alien Isolation and caused synchronization with glthread. The async marshalling implementation is similar to glBuffer(Sub)Data. However unlike Buffer(Sub)Data we don't need to worry about EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, as this isn't applicable to these DSA variants. Results in an approximately 6x drop in glthread synchronizations and a ~30% FPS jump in Alien Isolation (Medium preset, Athlon 860K, RX 480). Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/marshal.c108
-rw-r--r--src/mesa/main/marshal.h18
2 files changed, 126 insertions, 0 deletions
diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c
index ae4efb5ecbb..d4c46a27175 100644
--- a/src/mesa/main/marshal.c
+++ b/src/mesa/main/marshal.c
@@ -410,6 +410,114 @@ _mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size,
}
}
+/* NamedBufferData: marshalled asynchronously */
+struct marshal_cmd_NamedBufferData
+{
+ struct marshal_cmd_base cmd_base;
+ GLuint name;
+ GLsizei size;
+ GLenum usage;
+ /* Next size bytes are GLubyte data[size] */
+};
+
+void
+_mesa_unmarshal_NamedBufferData(struct gl_context *ctx,
+ const struct marshal_cmd_NamedBufferData *cmd)
+{
+ const GLuint name = cmd->name;
+ const GLsizei size = cmd->size;
+ const GLenum usage = cmd->usage;
+ const void *data = (const void *) (cmd + 1);
+
+ CALL_NamedBufferData(ctx->CurrentServerDispatch,
+ (name, size, data, usage));
+}
+
+void GLAPIENTRY
+_mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size,
+ const GLvoid * data, GLenum usage)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ size_t cmd_size = sizeof(struct marshal_cmd_NamedBufferData) + size;
+
+ debug_print_marshal("NamedBufferData");
+ if (unlikely(size < 0)) {
+ _mesa_glthread_finish(ctx);
+ _mesa_error(ctx, GL_INVALID_VALUE, "NamedBufferData(size < 0)");
+ return;
+ }
+
+ if (buffer > 0 && cmd_size <= MARSHAL_MAX_CMD_SIZE) {
+ struct marshal_cmd_NamedBufferData *cmd =
+ _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_NamedBufferData,
+ cmd_size);
+ cmd->name = buffer;
+ cmd->size = size;
+ cmd->usage = usage;
+ char *variable_data = (char *) (cmd + 1);
+ memcpy(variable_data, data, size);
+ _mesa_post_marshal_hook(ctx);
+ } else {
+ _mesa_glthread_finish(ctx);
+ CALL_NamedBufferData(ctx->CurrentServerDispatch,
+ (buffer, size, data, usage));
+ }
+}
+
+/* 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] */
+};
+
+void
+_mesa_unmarshal_NamedBufferSubData(struct gl_context *ctx,
+ const struct marshal_cmd_NamedBufferSubData *cmd)
+{
+ 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));
+}
+
+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));
+ }
+}
+
/* ClearBufferfv: marshalled asynchronously */
struct marshal_cmd_ClearBufferfv
{
diff --git a/src/mesa/main/marshal.h b/src/mesa/main/marshal.h
index 4842d27eebf..46f76634fb6 100644
--- a/src/mesa/main/marshal.h
+++ b/src/mesa/main/marshal.h
@@ -205,6 +205,8 @@ struct marshal_cmd_Flush;
struct marshal_cmd_BindBuffer;
struct marshal_cmd_BufferData;
struct marshal_cmd_BufferSubData;
+struct marshal_cmd_NamedBufferData;
+struct marshal_cmd_NamedBufferSubData;
struct marshal_cmd_ClearBufferfv;
void
@@ -253,6 +255,22 @@ _mesa_marshal_BufferSubData(GLenum target, GLintptr offset, GLsizeiptr size,
const GLvoid * data);
void
+_mesa_unmarshal_NamedBufferData(struct gl_context *ctx,
+ const struct marshal_cmd_NamedBufferData *cmd);
+
+void GLAPIENTRY
+_mesa_marshal_NamedBufferData(GLuint buffer, GLsizeiptr size,
+ const GLvoid * data, GLenum usage);
+
+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);
+
+void
_mesa_unmarshal_ClearBufferfv(struct gl_context *ctx,
const struct marshal_cmd_ClearBufferfv *cmd);