[Mesa-dev] [PATCH] glthread: get rid of unmarshal dispatch enum/table
Grigori Goronzy
greg at chown.ath.cx
Fri Jun 30 00:29:13 UTC 2017
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.
---
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)
{
--
2.7.4
More information about the mesa-dev
mailing list