diff options
author | Keith Whitwell <[email protected]> | 2004-06-30 11:48:21 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2004-06-30 11:48:21 +0000 |
commit | 009aa3ef5ea6bc13c903d6f902b7039adef8fc74 (patch) | |
tree | 5a5cf488e21fc1445732af4d86a0f8622c343023 /src/mesa/tnl/t_context.h | |
parent | 8e77da1cd7d63af5e7ffcf7ea220cdaf1bdc8162 (diff) |
Add infrastructure for t_vertex.c codegen. Add an example driver
for this which spits out C code for the generated functions.
Diffstat (limited to 'src/mesa/tnl/t_context.h')
-rw-r--r-- | src/mesa/tnl/t_context.h | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h index 3d099b205a0..7e1aaead885 100644 --- a/src/mesa/tnl/t_context.h +++ b/src/mesa/tnl/t_context.h @@ -524,6 +524,7 @@ struct tnl_pipeline { GLuint nr_stages; }; +struct tnl_clipspace; struct tnl_clipspace_attr; typedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out, @@ -532,6 +533,9 @@ typedef void (*extract_func)( const struct tnl_clipspace_attr *a, GLfloat *out, typedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v, const GLfloat *in ); +typedef void (*emit_func)( GLcontext *ctx, GLuint start, + GLuint end, void *dest ); + /** * Describes how to convert/move a vertex attribute from a vertex array @@ -540,6 +544,7 @@ typedef void (*insert_func)( const struct tnl_clipspace_attr *a, GLubyte *v, struct tnl_clipspace_attr { GLuint attrib; /* which vertex attrib (0=position, etc) */ + GLuint format; GLuint vertoffset; /* position of the attrib in the vertex struct */ GLuint vertattrsize; /* size of the attribute in bytes */ GLubyte *inputptr; @@ -551,6 +556,40 @@ struct tnl_clipspace_attr }; +struct tnl_clipspace_codegen { + GLboolean (*emit_header)( struct tnl_clipspace_codegen *, + struct tnl_clipspace *); + GLboolean (*emit_footer)( struct tnl_clipspace_codegen * ); + GLboolean (*emit_attr_header)( struct tnl_clipspace_codegen *, + struct tnl_clipspace_attr *, + GLint j, GLenum out_type, + GLboolean need_vp ); + GLboolean (*emit_attr_footer)( struct tnl_clipspace_codegen * ); + GLboolean (*emit_mov)( struct tnl_clipspace_codegen *, + GLint, GLint ); + GLboolean (*emit_const)( struct tnl_clipspace_codegen *, + GLint, GLfloat ); + GLboolean (*emit_mad)( struct tnl_clipspace_codegen *, + GLint, GLint, GLint, GLint ); + GLboolean (*emit_float_to_chan)( struct tnl_clipspace_codegen *, + GLint, GLint ); + GLboolean (*emit_const_chan)( struct tnl_clipspace_codegen *, + GLint, GLchan ); + GLboolean (*emit_float_to_ubyte)( struct tnl_clipspace_codegen *, + GLint, GLint ); + GLboolean (*emit_const_ubyte)( struct tnl_clipspace_codegen *, + GLint, GLubyte ); + emit_func (*emit_store_func)( struct tnl_clipspace_codegen * ); + + struct _tnl_dynfn codegen_list; + + char *buf; + int buf_size; + int buf_used; + int out_offset; +}; + + typedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last ); typedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 ); @@ -586,9 +625,11 @@ struct tnl_clipspace struct tnl_clipspace_attr attr[_TNL_ATTRIB_MAX]; GLuint attr_count; - void (*emit)( GLcontext *ctx, GLuint start, GLuint end, void *dest ); + emit_func emit; interp_func interp; copy_pv_func copy_pv; + + struct tnl_clipspace_codegen codegen; }; |