X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fshader%2Fslang%2Fslang_ir.h;h=69db4b5451ec111cfcb643e2dfd90570a1548022;hb=77e7535c0f94b94d26aa2e3d7b19c812beaba2ae;hp=5fd72be36a0020db3062eaf96a8993754a7d8f1e;hpb=b63c100677c76bb20a1871ea15298ca708acd04f;p=mesa.git diff --git a/src/mesa/shader/slang/slang_ir.h b/src/mesa/shader/slang/slang_ir.h index 5fd72be36a0..69db4b5451e 100644 --- a/src/mesa/shader/slang/slang_ir.h +++ b/src/mesa/shader/slang/slang_ir.h @@ -35,27 +35,50 @@ #include "imports.h" #include "slang_compile.h" +#include "slang_label.h" #include "mtypes.h" /** - * Intermediate Representation opcode + * Intermediate Representation opcodes */ typedef enum { IR_NOP = 0, IR_SEQ, /* sequence (eval left, then right) */ IR_SCOPE, /* new variable scope (one child) */ + IR_LABEL, /* target of a jump or cjump */ - IR_JUMP, /* unconditional jump */ - IR_CJUMP0, /* conditional jump if zero */ - IR_CJUMP1, /* conditional jump if one (or non-zero) */ - IR_COND, /* conditional expression */ - IR_IF, /* high-level IF */ - IR_ELSE, /* high-level ELSE */ - IR_ENDIF, /* high-level ENDIF */ - IR_CALL, /* call subroutine */ + + IR_COND, /* conditional expression/predicate */ + + IR_IF, /* high-level IF/then/else */ + /* Children[0] = conditional expression */ + /* Children[1] = if-true part */ + /* Children[2] = if-else part, or NULL */ + + IR_BEGIN_SUB, /* begin subroutine */ + IR_END_SUB, /* end subroutine */ + IR_RETURN, /* return from subroutine */ + IR_CALL, /* call subroutine */ + + IR_FUNC, /* inlined function code */ + + IR_LOOP, /* high-level loop-begin / loop-end */ + /* Children[0] = loop body */ + /* Children[1] = loop tail code, or NULL */ + + IR_CONT, /* continue loop */ + /* n->Parent = ptr to parent IR_LOOP Node */ + IR_BREAK, /* break loop */ + + IR_BREAK_IF_TRUE, + IR_CONT_IF_TRUE, + /* Children[0] = the condition expression */ + IR_MOVE, + + /* vector ops: */ IR_ADD, IR_SUB, IR_MUL, @@ -67,10 +90,12 @@ typedef enum IR_CLAMP, IR_MIN, IR_MAX, - IR_SEQUAL, /* Set if args are equal */ - IR_SNEQUAL, /* Set if args are not equal */ - IR_SGE, /* Set if greater or equal */ - IR_SGT, /* Set if greater than */ + IR_SEQUAL, /* Set if args are equal (vector) */ + IR_SNEQUAL, /* Set if args are not equal (vector) */ + IR_SGE, /* Set if greater or equal (vector) */ + IR_SGT, /* Set if greater than (vector) */ + IR_SLE, /* Set if less or equal (vector) */ + IR_SLT, /* Set if less than (vector) */ IR_POW, /* x^y */ IR_EXP, /* e^x */ IR_EXP2, /* 2^x */ @@ -89,18 +114,26 @@ typedef enum IR_NOISE2, /* noise(x, y) */ IR_NOISE3, /* noise(x, y, z) */ IR_NOISE4, /* noise(x, y, z, w) */ - IR_NOT, /* logical not */ + + IR_EQUAL, /* boolean equality */ + IR_NOTEQUAL,/* boolean inequality */ + IR_NOT, /* boolean not */ + IR_VAR, /* variable reference */ IR_VAR_DECL,/* var declaration */ + IR_ELEMENT, /* array element */ + IR_FIELD, /* struct field */ IR_SWIZZLE, /* swizzled storage access */ + IR_TEX, /* texture lookup */ IR_TEXB, /* texture lookup with LOD bias */ IR_TEXP, /* texture lookup with projection */ + IR_FLOAT, - IR_FIELD, IR_I_TO_F, /* int[4] to float[4] conversion */ IR_F_TO_I, /* float[4] to int[4] conversion */ + IR_KILL /* fragment kill/discard */ } slang_ir_opcode; @@ -114,6 +147,7 @@ struct _slang_ir_storage GLint Index; /**< -1 means unallocated */ GLint Size; /**< number of floats */ GLuint Swizzle; + GLint RefCount; /**< Used during IR tree delete */ }; typedef struct _slang_ir_storage slang_ir_storage; @@ -127,13 +161,45 @@ typedef struct slang_ir_node_ { slang_ir_opcode Opcode; struct slang_ir_node_ *Children[3]; - const char *Comment; - const char *Target; /**< Branch target string */ + slang_ir_storage *Store; /**< location of result of this operation */ + GLint InstLocation; /**< Location of instruction emitted for this node */ + + /** special fields depending on Opcode: */ + const char *Field; /**< If Opcode == IR_FIELD */ + int FieldOffset; /**< If Opcode == IR_FIELD */ GLuint Writemask; /**< If Opcode == IR_MOVE */ GLfloat Value[4]; /**< If Opcode == IR_FLOAT */ slang_variable *Var; /**< If Opcode == IR_VAR or IR_VAR_DECL */ - slang_ir_storage *Store; /**< location of result of this operation */ + struct slang_ir_node_ *List; /**< For various linked lists */ + struct slang_ir_node_ *Parent; /**< Pointer to logical parent (ie. loop) */ + slang_label *Label; /**< Used for branches */ } slang_ir_node; + +/** + * Assembly and IR info + */ +typedef struct +{ + slang_ir_opcode IrOpcode; + const char *IrName; + gl_inst_opcode InstOpcode; + GLuint ResultSize, NumParams; +} slang_ir_info; + + + +extern const slang_ir_info * +_slang_ir_info(slang_ir_opcode opcode); + + +extern void +_slang_free_ir_tree(slang_ir_node *n); + + +extern void +_slang_print_ir_tree(const slang_ir_node *n, int indent); + + #endif /* SLANG_IR_H */