Home | History | Annotate | Download | only in program
      1 /*
      2  * Copyright  2009 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #ifndef PROGRAM_PARSER_H
     25 #define PROGRAM_PARSER_H
     26 
     27 #include "main/config.h"
     28 #include "program/prog_parameter.h"
     29 
     30 struct gl_context;
     31 
     32 enum asm_type {
     33    at_none,
     34    at_address,
     35    at_attrib,
     36    at_param,
     37    at_temp,
     38    at_output
     39 };
     40 
     41 struct asm_symbol {
     42    struct asm_symbol *next;    /**< List linkage for freeing. */
     43    const char *name;
     44    enum asm_type type;
     45    unsigned attrib_binding;
     46    unsigned output_binding;   /**< Output / result register number. */
     47 
     48    /**
     49     * One of PROGRAM_STATE_VAR or PROGRAM_CONSTANT.
     50     */
     51    unsigned param_binding_type;
     52 
     53    /**
     54     * Offset into the program_parameter_list where the tokens representing our
     55     * bound state (or constants) start.
     56     */
     57    unsigned param_binding_begin;
     58 
     59    /**
     60     * Constants put into the parameter list may be swizzled.  This
     61     * field contain's the symbol's swizzle. (SWIZZLE_X/Y/Z/W)
     62     */
     63    unsigned param_binding_swizzle;
     64 
     65    /* This is how many entries in the program_parameter_list we take up
     66     * with our state tokens or constants. Note that this is _not_ the same as
     67     * the number of param registers we eventually use.
     68     */
     69    unsigned param_binding_length;
     70 
     71    /**
     72     * Index of the temp register assigned to this variable.
     73     */
     74    unsigned temp_binding;
     75 
     76    /**
     77     * Flag whether or not a PARAM is an array
     78     */
     79    unsigned param_is_array:1;
     80 
     81 
     82    /**
     83     * Flag whether or not a PARAM array is accessed indirectly
     84     */
     85    unsigned param_accessed_indirectly:1;
     86 
     87 
     88    /**
     89     * \brief Is first pass of parameter layout done with this variable?
     90     *
     91     * The parameter layout routine operates in two passes.  This flag tracks
     92     * whether or not the first pass has handled this variable.
     93     *
     94     * \sa _mesa_layout_parameters
     95     */
     96    unsigned pass1_done:1;
     97 };
     98 
     99 
    100 struct asm_vector {
    101    unsigned count;
    102    gl_constant_value data[4];
    103 };
    104 
    105 
    106 struct asm_swizzle_mask {
    107    unsigned swizzle:12;
    108    unsigned mask:4;
    109 };
    110 
    111 
    112 struct asm_src_register {
    113    struct prog_src_register Base;
    114 
    115    /**
    116     * Symbol associated with indirect access to parameter arrays.
    117     *
    118     * If \c Base::RelAddr is 1, this will point to the symbol for the parameter
    119     * that is being dereferenced.  Further, \c Base::Index will be the offset
    120     * from the address register being used.
    121     */
    122    struct asm_symbol *Symbol;
    123 };
    124 
    125 
    126 struct asm_instruction {
    127    struct prog_instruction Base;
    128    struct asm_instruction *next;
    129    struct asm_src_register SrcReg[3];
    130 };
    131 
    132 
    133 struct asm_parser_state {
    134    struct gl_context *ctx;
    135    struct gl_program *prog;
    136 
    137    /** Memory context to attach instructions to. */
    138    void *mem_ctx;
    139 
    140    /**
    141     * Per-program target limits
    142     */
    143    struct gl_program_constants *limits;
    144 
    145    struct _mesa_symbol_table *st;
    146 
    147    /**
    148     * Linked list of symbols
    149     *
    150     * This list is \b only used when cleaning up compiler state and freeing
    151     * memory.
    152     */
    153    struct asm_symbol *sym;
    154 
    155    /**
    156     * State for the lexer.
    157     */
    158    void *scanner;
    159 
    160    /**
    161     * Linked list of instructions generated during parsing.
    162     */
    163    /*@{*/
    164    struct asm_instruction *inst_head;
    165    struct asm_instruction *inst_tail;
    166    /*@}*/
    167 
    168 
    169    /**
    170     * Selected limits copied from gl_constants
    171     *
    172     * These are limits from the GL context, but various bits in the program
    173     * must be validated against these values.
    174     */
    175    /*@{*/
    176    unsigned MaxTextureCoordUnits;
    177    unsigned MaxTextureImageUnits;
    178    unsigned MaxTextureUnits;
    179    unsigned MaxClipPlanes;
    180    unsigned MaxLights;
    181    unsigned MaxProgramMatrices;
    182    unsigned MaxDrawBuffers;
    183    /*@}*/
    184 
    185    /**
    186     * Value to use in state vector accessors for environment and local
    187     * parameters
    188     */
    189    unsigned state_param_enum;
    190 
    191 
    192    /**
    193     * Input attributes bound to specific names
    194     *
    195     * This is only needed so that errors can be properly produced when
    196     * multiple ATTRIB statements bind illegal combinations of vertex
    197     * attributes.
    198     */
    199    GLbitfield64 InputsBound;
    200 
    201    enum {
    202       invalid_mode = 0,
    203       ARB_vertex,
    204       ARB_fragment
    205    } mode;
    206 
    207    struct {
    208       unsigned PositionInvariant:1;
    209       unsigned Fog:2;
    210       unsigned PrecisionHint:2;
    211       unsigned DrawBuffers:1;
    212       unsigned Shadow:1;
    213       unsigned TexRect:1;
    214       unsigned TexArray:1;
    215       unsigned OriginUpperLeft:1;
    216       unsigned PixelCenterInteger:1;
    217    } option;
    218 
    219    struct {
    220       unsigned UsesKill:1;
    221    } fragment;
    222 };
    223 
    224 #define OPTION_NONE        0
    225 #define OPTION_FOG_EXP     1
    226 #define OPTION_FOG_EXP2    2
    227 #define OPTION_FOG_LINEAR  3
    228 #define OPTION_NICEST      1
    229 #define OPTION_FASTEST     2
    230 
    231 typedef struct YYLTYPE {
    232    int first_line;
    233    int first_column;
    234    int last_line;
    235    int last_column;
    236    int position;
    237 } YYLTYPE;
    238 
    239 #define YYLTYPE_IS_DECLARED 1
    240 #define YYLTYPE_IS_TRIVIAL 1
    241 
    242 
    243 extern GLboolean _mesa_parse_arb_program(struct gl_context *ctx, GLenum target,
    244     const GLubyte *str, GLsizei len, struct asm_parser_state *state);
    245 
    246 
    247 
    248 /* From program_lexer.l. */
    249 extern void _mesa_program_lexer_dtor(void *scanner);
    250 
    251 extern void _mesa_program_lexer_ctor(void **scanner,
    252     struct asm_parser_state *state, const char *string, size_t len);
    253 
    254 
    255 /**
    256  *\name From program_parse_extra.c
    257  */
    258 /*@{*/
    259 
    260 /**
    261  * Parses and processes an option string to an ARB vertex program
    262  *
    263  * \return
    264  * Non-zero on success, zero on failure.
    265  */
    266 extern int _mesa_ARBvp_parse_option(struct asm_parser_state *state,
    267     const char *option);
    268 
    269 /**
    270  * Parses and processes an option string to an ARB fragment program
    271  *
    272  * \return
    273  * Non-zero on success, zero on failure.
    274  */
    275 extern int _mesa_ARBfp_parse_option(struct asm_parser_state *state,
    276     const char *option);
    277 
    278 /**
    279  * Parses and processes instruction suffixes
    280  *
    281  * Instruction suffixes, such as \c _SAT, are processed.  The relevant bits
    282  * are set in \c inst.  If suffixes are encountered that are either not known
    283  * or not supported by the modes and options set in \c state, zero will be
    284  * returned.
    285  *
    286  * \return
    287  * Non-zero on success, zero on failure.
    288  */
    289 extern int _mesa_parse_instruction_suffix(const struct asm_parser_state *state,
    290     const char *suffix, struct prog_instruction *inst);
    291 
    292 /*@}*/
    293 
    294 #endif /* PROGRAM_PARSER_H */
    295