On Sat, Jun 24, 2017 at 9:59 AM, Grigori Goronzy <g...@chown.ath.cx> wrote: > These entry points are used by Alien Isolation and caused > synchronization with glthread. The async marshalling implementation > is similar to glBuffer(Sub)Data. > > Results in an approximately 6x drop in glthread synchronizations and a > ~30% FPS jump in Alien Isolation (Medium preset, Athlon 860K, RX 480). > > This does not care about the EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD special > case like the Buffer(Sub)Data marshalling functions. > --- > I'm not a fan of the code duplication and I'll try to address that in > further changes to glthread/marshalling, but the improvement is so > noticeable that I'd like to share it. Alien Isolation is now playable on > my system while it wasn't before. > > src/mapi/glapi/gen/ARB_direct_state_access.xml | 4 +- > src/mesa/main/marshal.c | 108 > +++++++++++++++++++++++++ > src/mesa/main/marshal.h | 18 +++++ > 3 files changed, 128 insertions(+), 2 deletions(-) > > diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml > b/src/mapi/glapi/gen/ARB_direct_state_access.xml > index cb24d79..d3d2246 100644 > --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml > +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml > @@ -61,14 +61,14 @@ > <param name="flags" type="GLbitfield" /> > </function> > > - <function name="NamedBufferData"> > + <function name="NamedBufferData" marshal="custom"> > <param name="buffer" type="GLuint" /> > <param name="size" type="GLsizeiptr" /> > <param name="data" type="const GLvoid *" /> > <param name="usage" type="GLenum" /> > </function> > > - <function name="NamedBufferSubData" no_error="true"> > + <function name="NamedBufferSubData" no_error="true" marshal="custom"> > <param name="buffer" type="GLuint" /> > <param name="offset" type="GLintptr" /> > <param name="size" type="GLsizeiptr" /> > diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c > index 4840f32..1fddf8e 100644 > --- a/src/mesa/main/marshal.c > +++ b/src/mesa/main/marshal.c > @@ -408,6 +408,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));
Indentation > +} > + > +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)); Indentation > + } > +} > + > +/* 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)); Indentation > +} > + > +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)); Indentation _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev