#include "dispatch.h"
#include "glthread.h"
#include "marshal.h"
-#include "marshal_generated.h"
"""
out('')
def print_unmarshal_dispatch_cmd(self, api):
- out('size_t')
- out('_mesa_unmarshal_dispatch_cmd(struct gl_context *ctx, '
- 'const void *cmd)')
- out('{')
+ out('const _mesa_unmarshal_func _mesa_unmarshal_dispatch[NUM_DISPATCH_CMD] = {')
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('[DISPATCH_CMD_{0}] = (_mesa_unmarshal_func)_mesa_unmarshal_{0},'.format(func.name))
+ out('};')
out('')
out('')
if flavor in ('skip', 'sync'):
continue
print(' DISPATCH_CMD_{0},'.format(func.name))
+ print(' NUM_DISPATCH_CMD,')
print('};')
#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"
_glapi_set_dispatch(ctx->CurrentServerDispatch);
- while (pos < batch->used)
- pos += _mesa_unmarshal_dispatch_cmd(ctx, &batch->buffer[pos]);
+ while (pos < batch->used) {
+ const struct marshal_cmd_base *cmd =
+ (const struct marshal_cmd_base *)&batch->buffer[pos];
+
+ _mesa_unmarshal_dispatch[cmd->cmd_id](ctx, cmd);
+ pos += cmd->cmd_size;
+ }
assert(pos == batch->used);
batch->used = 0;
#include "main/macros.h"
#include "marshal.h"
#include "dispatch.h"
-#include "marshal_generated.h"
struct marshal_cmd_Flush
{
#include "main/glthread.h"
#include "main/context.h"
#include "main/macros.h"
+#include "marshal_generated.h"
struct marshal_cmd_base
{
uint16_t cmd_size;
};
+typedef void (*_mesa_unmarshal_func)(struct gl_context *ctx, const void *cmd);
+extern const _mesa_unmarshal_func _mesa_unmarshal_dispatch[NUM_DISPATCH_CMD];
+
static inline void *
_mesa_glthread_allocate_command(struct gl_context *ctx,
uint16_t cmd_id,
#endif
}
-static inline void
-debug_print_unmarshal(const char *func)
-{
-#if DEBUG_MARSHAL_PRINT_CALLS
- printf("unmarshal: %s\n", func);
-#endif
-}
-
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)
{