X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_program.h;h=de02c3185fddd4a8c4ca35a97f172cd6df6c0b72;hb=f3aa4de034b0d791ce2e38e8aeb3b3abdb4e3b50;hp=f6d5f6d76ce761db7f4fe94d8f502150546a2d4f;hpb=9273150f9a8394f4ef630a96f0089ad8cad607f5;p=mesa.git diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h index f6d5f6d76ce..de02c3185fd 100644 --- a/src/mesa/state_tracker/st_program.h +++ b/src/mesa/state_tracker/st_program.h @@ -35,60 +35,73 @@ #define ST_PROGRAM_H #include "mtypes.h" -#include "pipe/tgsi/core/tgsi_token.h" +#include "pipe/p_shader_tokens.h" +#include "x86/rtasm/x86sse.h" -#define ST_FP_MAX_TOKENS 1024 +#define ST_MAX_SHADER_TOKENS 1024 + +struct cso_fragment_shader; +struct cso_vertex_shader; +struct translated_vertex_program; + + +/** + * Derived from Mesa gl_fragment_program: + */ struct st_fragment_program { struct gl_fragment_program Base; - GLboolean error; /* If program is malformed for any reason. */ + GLuint serialNo; - GLuint id; /* String id, for tracking - * ProgramStringNotify changes. - */ + GLuint input_to_slot[FRAG_ATTRIB_MAX]; /**< Maps FRAG_ATTRIB_x to slot */ + GLuint num_input_slots; + /** The program in TGSI format */ + struct tgsi_token tokens[ST_MAX_SHADER_TOKENS]; - struct tgsi_token tokens[ST_FP_MAX_TOKENS]; - GLboolean dirty; - - struct pipe_constant_buffer constants; + /** Pointer to the corresponding cached shader */ + const struct cso_fragment_shader *fs; -#if 0 - GLfloat (*cbuffer)[4]; - GLuint nr_constants; + GLuint param_state; - /* Translate all the parameters, etc, into a constant buffer which - * we update on state changes. + /** List of vertex programs which have been translated such that their + * outputs match this fragment program's inputs. */ - struct - { - GLuint reg; /* Constant idx */ - const GLfloat *values; /* Pointer to tracked values */ - } *param; - GLuint nr_params; -#endif - - GLuint param_state; + struct translated_vertex_program *vertex_programs; }; +/** + * Derived from Mesa gl_fragment_program: + */ struct st_vertex_program { - struct gl_vertex_program Base; - GLboolean error; /* If program is malformed for any reason. */ + struct gl_vertex_program Base; /**< The Mesa vertex program */ + GLuint serialNo; + + /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */ + GLuint input_to_index[VERT_ATTRIB_MAX]; + /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */ + GLuint index_to_input[PIPE_MAX_SHADER_INPUTS]; + + /** The program in TGSI format */ + struct tgsi_token tokens[ST_MAX_SHADER_TOKENS]; - GLuint id; /* String id, for tracking - * ProgramStringNotify changes. - */ + /** Pointer to the corresponding cached shader */ + const struct cso_vertex_shader *cso; + + /** For using our private draw module (glRasterPos) */ + struct draw_vertex_shader *draw_shader; - GLboolean dirty; GLuint param_state; }; -void st_init_cb_program( struct st_context *st ); -void st_destroy_cb_program( struct st_context *st ); + +extern void +st_init_program_functions(struct dd_function_table *functions); + static inline struct st_fragment_program * st_fragment_program( struct gl_fragment_program *fp ) @@ -96,10 +109,27 @@ st_fragment_program( struct gl_fragment_program *fp ) return (struct st_fragment_program *)fp; } + static inline struct st_vertex_program * st_vertex_program( struct gl_vertex_program *vp ) { return (struct st_vertex_program *)vp; } + +extern const struct cso_fragment_shader * +st_translate_fragment_program(struct st_context *st, + struct st_fragment_program *fp, + const GLuint inputMapping[], + struct tgsi_token *tokens, + GLuint maxTokens); + + +extern void +st_translate_vertex_program(struct st_context *st, + struct st_vertex_program *vp, + const GLuint vert_output_to_slot[], + struct tgsi_token *tokens, + GLuint maxTokens); + #endif