[Mesa-dev] [PATCH] glthread: get rid of unmarshal dispatch enum/table

Grigori Goronzy greg at chown.ath.cx
Fri Jul 7 23:31:00 UTC 2017


On 2017-07-01 18:46, Marek Olšák wrote:
> Instead of passing the function pointer through the queue, passing
> just a call ID (uint16_t) is preferable.
> 
> If the switch statement is an issue, doing a function pointer lookup
> from a static array should be OK.
> 

OK, then let's drop this patch. gcc turns the switch/case block into an 
efficient jump table with the ID method, so an array for function lookup 
instead of that doesn't improve anything.
I didn't see any measurable benefit of the function pointer method 
either.

Best regards
Grigori

> 
> On Fri, Jun 30, 2017 at 7:14 PM, Grigori Goronzy <greg at chown.ath.cx> 
> wrote:
>> On 2017-06-30 15:27, Nicolai Hähnle wrote:
>>> 
>>> On 30.06.2017 02:29, Grigori Goronzy wrote:
>>>> 
>>>> Use function pointers to identify the unmarshalling function, which
>>>> is simpler and gets rid of a lot generated code.
>>>> 
>>>> This removes an indirection and possibly results in a slight speedup
>>>> as well.
>>> 
>>> 
>>> The fact that it blows up cmd_base from 4 bytes to 16 bytes might
>>> result in a slowdown. Marek's recent changes clearly indicated that
>>> looking at memory behavior matters quite a bit for glthread. So I'm
>>> inclined to say No on this unless you can demonstrate a consistent
>>> speedup.
>>> 
>> 
>> That's indeed a notable difference. I suspect it isn't so much the 
>> byte size
>> of the marshalled commands that affects throughput, but the number of
>> commands per batch and their associated costs when unmarshalling, so 
>> the
>> larger size of cmd_base might not matter much (perhaps with adjusted 
>> max
>> batch size). In any case, I'll try get hold of some numbers.
>> 
>> Best regards
>> Grigori
>> 
>> 
>>> Cheers,
>>> Nicolai
>>> 
>>> 
>>>> ---
>>>>   src/mapi/glapi/gen/Makefile.am     |  4 --
>>>>   src/mapi/glapi/gen/gl_marshal.py   | 36 ++--------------
>>>>   src/mapi/glapi/gen/gl_marshal_h.py | 86
>>>> --------------------------------------
>>>>   src/mesa/Android.gen.mk            |  7 ----
>>>>   src/mesa/Makefile.sources          |  1 -
>>>>   src/mesa/SConscript                |  8 ----
>>>>   src/mesa/main/.gitignore           |  1 -
>>>>   src/mesa/main/glthread.c           |  9 +++-
>>>>   src/mesa/main/glthread.h           |  2 -
>>>>   src/mesa/main/marshal.c            | 19 ++++-----
>>>>   src/mesa/main/marshal.h            | 14 +++----
>>>>   11 files changed, 26 insertions(+), 161 deletions(-)
>>>>   delete mode 100644 src/mapi/glapi/gen/gl_marshal_h.py
>>>> 
>>>> diff --git a/src/mapi/glapi/gen/Makefile.am
>>>> b/src/mapi/glapi/gen/Makefile.am
>>>> index bd04519..62007a4 100644
>>>> --- a/src/mapi/glapi/gen/Makefile.am
>>>> +++ b/src/mapi/glapi/gen/Makefile.am
>>>> @@ -76,7 +76,6 @@ EXTRA_DIST= \
>>>>         gl_genexec.py \
>>>>         gl_gentable.py \
>>>>         gl_marshal.py \
>>>> -       gl_marshal_h.py \
>>>>         gl_procs.py \
>>>>         gl_SPARC_asm.py \
>>>>         gl_table.py \
>>>> @@ -297,9 +296,6 @@ $(MESA_DIR)/main/api_exec.c: gl_genexec.py 
>>>> apiexec.py
>>>> $(COMMON)
>>>>   $(MESA_DIR)/main/marshal_generated.c: gl_marshal.py marshal_XML.py
>>>> $(COMMON)
>>>>         $(PYTHON_GEN) $(srcdir)/gl_marshal.py -f
>>>> $(srcdir)/gl_and_es_API.xml > $@
>>>>   -$(MESA_DIR)/main/marshal_generated.h: gl_marshal_h.py 
>>>> marshal_XML.py
>>>> $(COMMON)
>>>> -       $(PYTHON_GEN) $(srcdir)/gl_marshal_h.py -f
>>>> $(srcdir)/gl_and_es_API.xml > $@
>>>> -
>>>>   $(MESA_DIR)/main/dispatch.h: gl_table.py $(COMMON)
>>>>         $(PYTHON_GEN) $(srcdir)/gl_table.py -f
>>>> $(srcdir)/gl_and_es_API.xml -m remap_table > $@
>>>>   diff --git a/src/mapi/glapi/gen/gl_marshal.py
>>>> b/src/mapi/glapi/gen/gl_marshal.py
>>>> index efa4d9e..e71ede3 100644
>>>> --- a/src/mapi/glapi/gen/gl_marshal.py
>>>> +++ b/src/mapi/glapi/gen/gl_marshal.py
>>>> @@ -34,7 +34,6 @@ header = """
>>>>   #include "dispatch.h"
>>>>   #include "glthread.h"
>>>>   #include "marshal.h"
>>>> -#include "marshal_generated.h"
>>>>   """
>>>>     @@ -106,7 +105,7 @@ class PrintCode(gl_XML.gl_print_base):
>>>>         def print_async_dispatch(self, func):
>>>>           out('cmd = _mesa_glthread_allocate_command(ctx, '
>>>> -            'DISPATCH_CMD_{0}, cmd_size);'.format(func.name))
>>>> +            '(unmarshal_func)_mesa_unmarshal_{0},
>>>> cmd_size);'.format(func.name))
>>>>           for p in func.fixed_params:
>>>>               if p.count:
>>>>                   out('memcpy(cmd->{0}, {0}, {1});'.format(
>>>> @@ -166,7 +165,7 @@ class PrintCode(gl_XML.gl_print_base):
>>>>           out('};')
>>>>         def print_async_unmarshal(self, func):
>>>> -        out('static inline void')
>>>> +        out('static void')
>>>>           out(('_mesa_unmarshal_{0}(struct gl_context *ctx, '
>>>>                'const struct marshal_cmd_{0} 
>>>> *cmd)').format(func.name))
>>>>           out('{')
>>>> @@ -205,6 +204,7 @@ class PrintCode(gl_XML.gl_print_base):
>>>>                       else:
>>>>                           out('variable_data +=
>>>> {0};'.format(p.size_string(False)))
>>>>   +            
>>>> out('debug_print_unmarshal("{0}");'.format(func.name))
>>>>               self.print_sync_call(func)
>>>>           out('}')
>>>>   @@ -276,35 +276,6 @@ class PrintCode(gl_XML.gl_print_base):
>>>>           out('')
>>>>           out('')
>>>>   -    def print_unmarshal_dispatch_cmd(self, api):
>>>> -        out('size_t')
>>>> -        out('_mesa_unmarshal_dispatch_cmd(struct gl_context *ctx, '
>>>> -            'const void *cmd)')
>>>> -        out('{')
>>>> -        with indent():
>>>> -            out('const struct marshal_cmd_base *cmd_base = cmd;')
>>>> -            out('switch (cmd_base->cmd_id) {')
>>>> -            for func in api.functionIterateAll():
>>>> -                flavor = func.marshal_flavor()
>>>> -                if flavor in ('skip', 'sync'):
>>>> -                    continue
>>>> -                out('case DISPATCH_CMD_{0}:'.format(func.name))
>>>> -                with indent():
>>>> -
>>>> out('debug_print_unmarshal("{0}");'.format(func.name))
>>>> -                    out(('_mesa_unmarshal_{0}(ctx, (const struct
>>>> marshal_cmd_{0} *)'
>>>> -                         ' cmd);').format(func.name))
>>>> -                    out('break;')
>>>> -            out('default:')
>>>> -            with indent():
>>>> -                out('assert(!"Unrecognized command ID");')
>>>> -                out('break;')
>>>> -            out('}')
>>>> -            out('')
>>>> -            out('return cmd_base->cmd_size;')
>>>> -        out('}')
>>>> -        out('')
>>>> -        out('')
>>>> -
>>>>       def print_create_marshal_table(self, api):
>>>>           out('struct _glapi_table *')
>>>>           out('_mesa_create_marshal_table(const struct gl_context 
>>>> *ctx)')
>>>> @@ -338,7 +309,6 @@ class PrintCode(gl_XML.gl_print_base):
>>>>                   async_funcs.append(func)
>>>>               elif flavor == 'sync':
>>>>                   self.print_sync_body(func)
>>>> -        self.print_unmarshal_dispatch_cmd(api)
>>>>           self.print_create_marshal_table(api)
>>>>     diff --git a/src/mapi/glapi/gen/gl_marshal_h.py
>>>> b/src/mapi/glapi/gen/gl_marshal_h.py
>>>> deleted file mode 100644
>>>> index 6e39148..0000000
>>>> --- a/src/mapi/glapi/gen/gl_marshal_h.py
>>>> +++ /dev/null
>>>> @@ -1,86 +0,0 @@
>>>> -#!/usr/bin/env python
>>>> -
>>>> -# Copyright (C) 2012 Intel Corporation
>>>> -#
>>>> -# Permission is hereby granted, free of charge, to any person 
>>>> obtaining
>>>> a
>>>> -# copy of this software and associated documentation files (the
>>>> "Software"),
>>>> -# to deal in the Software without restriction, including without
>>>> limitation
>>>> -# the rights to use, copy, modify, merge, publish, distribute,
>>>> sublicense,
>>>> -# and/or sell copies of the Software, and to permit persons to whom 
>>>> the
>>>> -# Software is furnished to do so, subject to the following 
>>>> conditions:
>>>> -#
>>>> -# The above copyright notice and this permission notice (including 
>>>> the
>>>> next
>>>> -# paragraph) shall be included in all copies or substantial 
>>>> portions of
>>>> the
>>>> -# Software.
>>>> -#
>>>> -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>>>> EXPRESS OR
>>>> -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>>>> MERCHANTABILITY,
>>>> -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO 
>>>> EVENT
>>>> SHALL
>>>> -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES 
>>>> OR
>>>> OTHER
>>>> -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
>>>> ARISING
>>>> -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
>>>> OTHER
>>>> DEALINGS
>>>> -# IN THE SOFTWARE.
>>>> -
>>>> -import getopt
>>>> -import gl_XML
>>>> -import license
>>>> -import marshal_XML
>>>> -import sys
>>>> -
>>>> -
>>>> -header = """
>>>> -#ifndef MARSHAL_GENERATABLE_H
>>>> -#define MARSHAL_GENERATABLE_H
>>>> -"""
>>>> -
>>>> -footer = """
>>>> -#endif /* MARSHAL_GENERATABLE_H */
>>>> -"""
>>>> -
>>>> -
>>>> -class PrintCode(gl_XML.gl_print_base):
>>>> -    def __init__(self):
>>>> -        super(PrintCode, self).__init__()
>>>> -
>>>> -        self.name = 'gl_marshal_h.py'
>>>> -        self.license = license.bsd_license_template % (
>>>> -            'Copyright (C) 2012 Intel Corporation', 'INTEL 
>>>> CORPORATION')
>>>> -
>>>> -    def printRealHeader(self):
>>>> -        print header
>>>> -
>>>> -    def printRealFooter(self):
>>>> -        print footer
>>>> -
>>>> -    def printBody(self, api):
>>>> -        print 'enum marshal_dispatch_cmd_id'
>>>> -        print '{'
>>>> -        for func in api.functionIterateAll():
>>>> -            flavor = func.marshal_flavor()
>>>> -            if flavor in ('skip', 'sync'):
>>>> -                continue
>>>> -            print '   DISPATCH_CMD_{0},'.format(func.name)
>>>> -        print '};'
>>>> -
>>>> -
>>>> -def show_usage():
>>>> -    print 'Usage: %s [-f input_file_name]' % sys.argv[0]
>>>> -    sys.exit(1)
>>>> -
>>>> -
>>>> -if __name__ == '__main__':
>>>> -    file_name = 'gl_API.xml'
>>>> -
>>>> -    try:
>>>> -        (args, trail) = getopt.getopt(sys.argv[1:], 'm:f:')
>>>> -    except Exception,e:
>>>> -        show_usage()
>>>> -
>>>> -    for (arg,val) in args:
>>>> -        if arg == '-f':
>>>> -            file_name = val
>>>> -
>>>> -    printer = PrintCode()
>>>> -
>>>> -    api = gl_XML.parse_GL_API(file_name,
>>>> marshal_XML.marshal_item_factory())
>>>> -    printer.Print(api)
>>>> diff --git a/src/mesa/Android.gen.mk b/src/mesa/Android.gen.mk
>>>> index ee2d1de..691fb3b 100644
>>>> --- a/src/mesa/Android.gen.mk
>>>> +++ b/src/mesa/Android.gen.mk
>>>> @@ -41,7 +41,6 @@ sources := \
>>>>         main/remap_helper.h \
>>>>         main/get_hash.h \
>>>>         main/marshal_generated.c \
>>>> -       main/marshal_generated.h
>>>>     LOCAL_SRC_FILES := $(filter-out $(sources), $(LOCAL_SRC_FILES))
>>>>   @@ -110,12 +109,6 @@ $(intermediates)/main/marshal_generated.c:
>>>> PRIVATE_XML := -f $(glapi)/gl_and_es_
>>>>   $(intermediates)/main/marshal_generated.c: $(dispatch_deps)
>>>>         $(call es-gen)
>>>>   -$(intermediates)/main/marshal_generated.h: PRIVATE_SCRIPT :=
>>>> $(MESA_PYTHON2) $(glapi)/gl_marshal_h.py
>>>> -$(intermediates)/main/marshal_generated.h: PRIVATE_XML := -f
>>>> $(glapi)/gl_and_es_API.xml
>>>> -
>>>> -$(intermediates)/main/marshal_generated.h: $(dispatch_deps)
>>>> -       $(call es-gen)
>>>> -
>>>>   GET_HASH_GEN := $(LOCAL_PATH)/main/get_hash_generator.py
>>>>     $(intermediates)/main/get_hash.h: PRIVATE_SCRIPT := 
>>>> $(MESA_PYTHON2)
>>>> $(GET_HASH_GEN)
>>>> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
>>>> index 86fbf39..e9b1b82 100644
>>>> --- a/src/mesa/Makefile.sources
>>>> +++ b/src/mesa/Makefile.sources
>>>> @@ -137,7 +137,6 @@ MAIN_FILES = \
>>>>         main/marshal.c \
>>>>         main/marshal.h \
>>>>         main/marshal_generated.c \
>>>> -       main/marshal_generated.h \
>>>>         main/matrix.c \
>>>>         main/matrix.h \
>>>>         main/mipmap.c \
>>>> diff --git a/src/mesa/SConscript b/src/mesa/SConscript
>>>> index b63e15a..27bcb85 100644
>>>> --- a/src/mesa/SConscript
>>>> +++ b/src/mesa/SConscript
>>>> @@ -133,14 +133,6 @@ env.CodeGenerate(
>>>>       command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET'
>>>>       )
>>>>   -# The marshal_generated.h file is generated from the GL/ES 
>>>> API.xml
>>>> file
>>>> -env.CodeGenerate(
>>>> -    target = 'main/marshal_generated.h',
>>>> -    script = GLAPI + 'gen/gl_marshal_h.py',
>>>> -    source = [GLAPI + 'gen/gl_and_es_API.xml'] + env.Glob(GLAPI +
>>>> 'gen/*.xml'),
>>>> -    command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET'
>>>> -    )
>>>> -
>>>>   #
>>>>   # Libraries
>>>>   #
>>>> diff --git a/src/mesa/main/.gitignore b/src/mesa/main/.gitignore
>>>> index 8cc33cf..31dae60 100644
>>>> --- a/src/mesa/main/.gitignore
>>>> +++ b/src/mesa/main/.gitignore
>>>> @@ -10,4 +10,3 @@ format_info.c
>>>>   format_pack.c
>>>>   format_unpack.c
>>>>   marshal_generated.c
>>>> -marshal_generated.h
>>>> diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
>>>> index c71c037..8c7a8e0 100644
>>>> --- a/src/mesa/main/glthread.c
>>>> +++ b/src/mesa/main/glthread.c
>>>> @@ -35,10 +35,15 @@
>>>>   #include "main/mtypes.h"
>>>>   #include "main/glthread.h"
>>>>   #include "main/marshal.h"
>>>> -#include "main/marshal_generated.h"
>>>>   #include "util/u_atomic.h"
>>>>   #include "util/u_thread.h"
>>>>   +static size_t glthread_unmarshal_cmd(struct gl_context *ctx, 
>>>> const
>>>> void *cmd)
>>>> +{
>>>> +    const struct marshal_cmd_base *cmd_base = (struct 
>>>> marshal_cmd_base
>>>> *)cmd;
>>>> +    cmd_base->cmd_func(ctx, cmd);
>>>> +    return cmd_base->cmd_size;
>>>> +}
>>>>     static void
>>>>   glthread_unmarshal_batch(void *job, int thread_index)
>>>> @@ -50,7 +55,7 @@ glthread_unmarshal_batch(void *job, int 
>>>> thread_index)
>>>>      _glapi_set_dispatch(ctx->CurrentServerDispatch);
>>>>        while (pos < batch->used)
>>>> -      pos += _mesa_unmarshal_dispatch_cmd(ctx, 
>>>> &batch->buffer[pos]);
>>>> +      pos += glthread_unmarshal_cmd(ctx, &batch->buffer[pos]);
>>>>        assert(pos == batch->used);
>>>>      batch->used = 0;
>>>> diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
>>>> index 306246c..07bccba 100644
>>>> --- a/src/mesa/main/glthread.h
>>>> +++ b/src/mesa/main/glthread.h
>>>> @@ -49,8 +49,6 @@
>>>>   #include <stdbool.h>
>>>>   #include "util/u_queue.h"
>>>>   -enum marshal_dispatch_cmd_id;
>>>> -
>>>>   /** A single batch of commands queued up for execution. */
>>>>   struct glthread_batch
>>>>   {
>>>> diff --git a/src/mesa/main/marshal.c b/src/mesa/main/marshal.c
>>>> index 8db4531..6c5c687 100644
>>>> --- a/src/mesa/main/marshal.c
>>>> +++ b/src/mesa/main/marshal.c
>>>> @@ -31,7 +31,6 @@
>>>>   #include "main/macros.h"
>>>>   #include "marshal.h"
>>>>   #include "dispatch.h"
>>>> -#include "marshal_generated.h"
>>>>     struct marshal_cmd_Flush
>>>>   {
>>>> @@ -52,7 +51,7 @@ _mesa_marshal_Flush(void)
>>>>   {
>>>>      GET_CURRENT_CONTEXT(ctx);
>>>>      struct marshal_cmd_Flush *cmd =
>>>> -      _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_Flush,
>>>> +      _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_Flush,
>>>>                                         sizeof(struct
>>>> marshal_cmd_Flush));
>>>>      (void) cmd;
>>>>      _mesa_post_marshal_hook(ctx);
>>>> @@ -91,7 +90,7 @@ _mesa_marshal_Enable(GLenum cap)
>>>>         _mesa_glthread_finish(ctx);
>>>>         _mesa_glthread_restore_dispatch(ctx);
>>>>      } else {
>>>> -      cmd = _mesa_glthread_allocate_command(ctx, 
>>>> DISPATCH_CMD_Enable,
>>>> +      cmd = _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_Enable,
>>>>                                               sizeof(*cmd));
>>>>         cmd->cap = cap;
>>>>         _mesa_post_marshal_hook(ctx);
>>>> @@ -172,7 +171,7 @@ _mesa_marshal_ShaderSource(GLuint shader, 
>>>> GLsizei
>>>> count,
>>>>        if (total_cmd_size <= MARSHAL_MAX_CMD_SIZE) {
>>>>         struct marshal_cmd_ShaderSource *cmd =
>>>> -         _mesa_glthread_allocate_command(ctx, 
>>>> DISPATCH_CMD_ShaderSource,
>>>> +         _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_ShaderSource,
>>>>                                            total_cmd_size);
>>>>         GLint *cmd_length = (GLint *) (cmd + 1);
>>>>         GLchar *cmd_strings = (GLchar *) (cmd_length + count);
>>>> @@ -277,7 +276,7 @@ _mesa_marshal_BindBuffer(GLenum target, GLuint
>>>> buffer)
>>>>      track_vbo_binding(ctx, target, buffer);
>>>>        if (cmd_size <= MARSHAL_MAX_CMD_SIZE) {
>>>> -      cmd = _mesa_glthread_allocate_command(ctx,
>>>> DISPATCH_CMD_BindBuffer,
>>>> +      cmd = _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_BindBuffer,
>>>>                                               cmd_size);
>>>>         cmd->target = target;
>>>>         cmd->buffer = buffer;
>>>> @@ -334,7 +333,7 @@ _mesa_marshal_BufferData(GLenum target, 
>>>> GLsizeiptr
>>>> size, const GLvoid * data,
>>>>      if (target != GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD &&
>>>>          cmd_size <= MARSHAL_MAX_CMD_SIZE) {
>>>>         struct marshal_cmd_BufferData *cmd =
>>>> -         _mesa_glthread_allocate_command(ctx, 
>>>> DISPATCH_CMD_BufferData,
>>>> +         _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_BufferData,
>>>>                                            cmd_size);
>>>>           cmd->target = target;
>>>> @@ -393,7 +392,7 @@ _mesa_marshal_BufferSubData(GLenum target, 
>>>> GLintptr
>>>> offset, GLsizeiptr size,
>>>>      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,
>>>> +         _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_BufferSubData,
>>>>                                            cmd_size);
>>>>         cmd->target = target;
>>>>         cmd->offset = offset;
>>>> @@ -447,7 +446,7 @@ _mesa_marshal_NamedBufferData(GLuint buffer,
>>>> GLsizeiptr size,
>>>>        if (buffer > 0 && cmd_size <= MARSHAL_MAX_CMD_SIZE) {
>>>>         struct marshal_cmd_NamedBufferData *cmd =
>>>> -         _mesa_glthread_allocate_command(ctx,
>>>> DISPATCH_CMD_NamedBufferData,
>>>> +         _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_NamedBufferData,
>>>>                                            cmd_size);
>>>>         cmd->name = buffer;
>>>>         cmd->size = size;
>>>> @@ -501,7 +500,7 @@ _mesa_marshal_NamedBufferSubData(GLuint buffer,
>>>> GLintptr offset,
>>>>        if (buffer > 0 && cmd_size <= MARSHAL_MAX_CMD_SIZE) {
>>>>         struct marshal_cmd_NamedBufferSubData *cmd =
>>>> -         _mesa_glthread_allocate_command(ctx,
>>>> DISPATCH_CMD_NamedBufferSubData,
>>>> +         _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_NamedBufferSubData,
>>>>                                            cmd_size);
>>>>         cmd->name = buffer;
>>>>         cmd->offset = offset;
>>>> @@ -569,7 +568,7 @@ _mesa_marshal_ClearBufferfv(GLenum buffer, GLint
>>>> drawbuffer,
>>>>      size_t cmd_size = sizeof(struct marshal_cmd_ClearBufferfv) + 
>>>> size;
>>>>      if (cmd_size <= MARSHAL_MAX_CMD_SIZE) {
>>>>         struct marshal_cmd_ClearBufferfv *cmd =
>>>> -         _mesa_glthread_allocate_command(ctx,
>>>> DISPATCH_CMD_ClearBufferfv,
>>>> +         _mesa_glthread_allocate_command(ctx,
>>>> (unmarshal_func)_mesa_unmarshal_ClearBufferfv,
>>>>                                            cmd_size);
>>>>         cmd->buffer = buffer;
>>>>         cmd->drawbuffer = drawbuffer;
>>>> diff --git a/src/mesa/main/marshal.h b/src/mesa/main/marshal.h
>>>> index 999c75e..02893f8 100644
>>>> --- a/src/mesa/main/marshal.h
>>>> +++ b/src/mesa/main/marshal.h
>>>> @@ -34,12 +34,15 @@
>>>>   #include "main/context.h"
>>>>   #include "main/macros.h"
>>>>   +
>>>> +typedef void (*unmarshal_func)(struct gl_context *ctx, const void
>>>> *data);
>>>> +
>>>>   struct marshal_cmd_base
>>>>   {
>>>>      /**
>>>> -    * Type of command.  See enum marshal_dispatch_cmd_id.
>>>> +    * Pointer to unmarshalling function.
>>>>       */
>>>> -   uint16_t cmd_id;
>>>> +   unmarshal_func cmd_func;
>>>>        /**
>>>>       * Size of command, in multiples of 4 bytes, including 
>>>> cmd_base.
>>>> @@ -49,7 +52,7 @@ struct marshal_cmd_base
>>>>     static inline void *
>>>>   _mesa_glthread_allocate_command(struct gl_context *ctx,
>>>> -                                uint16_t cmd_id,
>>>> +                                unmarshal_func func,
>>>>                                   size_t size)
>>>>   {
>>>>      struct glthread_state *glthread = ctx->GLThread;
>>>> @@ -64,7 +67,7 @@ _mesa_glthread_allocate_command(struct gl_context 
>>>> *ctx,
>>>>        cmd_base = (struct marshal_cmd_base 
>>>> *)&next->buffer[next->used];
>>>>      next->used += aligned_size;
>>>> -   cmd_base->cmd_id = cmd_id;
>>>> +   cmd_base->cmd_func = func;
>>>>      cmd_base->cmd_size = aligned_size;
>>>>      return cmd_base;
>>>>   }
>>>> @@ -136,9 +139,6 @@ debug_print_unmarshal(const char *func)
>>>>   struct _glapi_table *
>>>>   _mesa_create_marshal_table(const struct gl_context *ctx);
>>>>   -size_t
>>>> -_mesa_unmarshal_dispatch_cmd(struct gl_context *ctx, const void 
>>>> *cmd);
>>>> -
>>>>   static inline void
>>>>   _mesa_post_marshal_hook(struct gl_context *ctx)
>>>>   {
>>>> 
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list