#ifndef PROG_INSTRUCTION_H
#define PROG_INSTRUCTION_H
#include "main/glheader.h"
#define SWIZZLE_X 0
#define SWIZZLE_Y 1
#define SWIZZLE_Z 2
#define SWIZZLE_W 3
#define SWIZZLE_ZERO 4
#define SWIZZLE_ONE 5
#define SWIZZLE_NIL 7
#define MAKE_SWIZZLE4(a,b,c,d) (((a)<<0) | ((b)<<3) | ((c)<<6) | ((d)<<9))
#define SWIZZLE_NOOP MAKE_SWIZZLE4(0,1,2,3)
#define GET_SWZ(swz, idx) (((swz) >> ((idx)*3)) & 0x7)
#define GET_BIT(msk, idx) (((msk) >> (idx)) & 0x1)
#define HAS_EXTENDED_SWIZZLE(swz) (swz & 0x924)
#define SWIZZLE_XYZW MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W)
#define SWIZZLE_XXXX MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)
#define SWIZZLE_YYYY MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y)
#define SWIZZLE_ZZZZ MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)
#define SWIZZLE_WWWW MAKE_SWIZZLE4(SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W)
#define WRITEMASK_X 0x1
#define WRITEMASK_Y 0x2
#define WRITEMASK_XY 0x3
#define WRITEMASK_Z 0x4
#define WRITEMASK_XZ 0x5
#define WRITEMASK_YZ 0x6
#define WRITEMASK_XYZ 0x7
#define WRITEMASK_W 0x8
#define WRITEMASK_XW 0x9
#define WRITEMASK_YW 0xa
#define WRITEMASK_XYW 0xb
#define WRITEMASK_ZW 0xc
#define WRITEMASK_XZW 0xd
#define WRITEMASK_YZW 0xe
#define WRITEMASK_XYZW 0xf
#define NEGATE_X 0x1
#define NEGATE_Y 0x2
#define NEGATE_Z 0x4
#define NEGATE_W 0x8
#define NEGATE_XYZ 0x7
#define NEGATE_XYZW 0xf
#define NEGATE_NONE 0x0
enum prog_opcode {
OPCODE_NOP = 0,
OPCODE_ABS,
OPCODE_ADD,
OPCODE_ARL,
OPCODE_BGNLOOP,
OPCODE_BGNSUB,
OPCODE_BRK,
OPCODE_CAL,
OPCODE_CMP,
OPCODE_CONT,
OPCODE_COS,
OPCODE_DDX,
OPCODE_DDY,
OPCODE_DP2,
OPCODE_DP3,
OPCODE_DP4,
OPCODE_DPH,
OPCODE_DST,
OPCODE_ELSE,
OPCODE_END,
OPCODE_ENDIF,
OPCODE_ENDLOOP,
OPCODE_ENDSUB,
OPCODE_EX2,
OPCODE_EXP,
OPCODE_FLR,
OPCODE_FRC,
OPCODE_IF,
OPCODE_KIL,
OPCODE_LG2,
OPCODE_LIT,
OPCODE_LOG,
OPCODE_LRP,
OPCODE_MAD,
OPCODE_MAX,
OPCODE_MIN,
OPCODE_MOV,
OPCODE_MUL,
OPCODE_NOISE1,
OPCODE_NOISE2,
OPCODE_NOISE3,
OPCODE_NOISE4,
OPCODE_POW,
OPCODE_RCP,
OPCODE_RET,
OPCODE_RSQ,
OPCODE_SCS,
OPCODE_SGE,
OPCODE_SIN,
OPCODE_SLT,
OPCODE_SSG,
OPCODE_SUB,
OPCODE_SWZ,
OPCODE_TEX,
OPCODE_TXB,
OPCODE_TXD,
OPCODE_TXL,
OPCODE_TXP,
OPCODE_TRUNC,
OPCODE_XPD,
MAX_OPCODE
};
#define INST_INDEX_BITS 12
struct prog_src_register
{
GLuint File:4;
GLint Index:(INST_INDEX_BITS+1);
GLuint Swizzle:12;
GLuint RelAddr:1;
GLuint Negate:4;
};
struct prog_dst_register
{
GLuint File:4;
GLuint Index:INST_INDEX_BITS;
GLuint WriteMask:4;
GLuint RelAddr:1;
};
struct prog_instruction
{
enum prog_opcode Opcode;
struct prog_src_register SrcReg[3];
struct prog_dst_register DstReg;
GLuint Saturate:1;
GLuint TexSrcUnit:5;
GLuint TexSrcTarget:4;
GLuint TexShadow:1;
GLint BranchTarget;
};
#ifdef __cplusplus
extern "C" {
#endif
struct gl_program;
extern void
_mesa_init_instructions(struct prog_instruction *inst, GLuint count);
extern struct prog_instruction *
_mesa_copy_instructions(struct prog_instruction *dest,
const struct prog_instruction *src, GLuint n);
extern GLuint
_mesa_num_inst_src_regs(enum prog_opcode opcode);
extern GLuint
_mesa_num_inst_dst_regs(enum prog_opcode opcode);
extern GLboolean
_mesa_is_tex_instruction(enum prog_opcode opcode);
extern GLboolean
_mesa_check_soa_dependencies(const struct prog_instruction *inst);
extern const char *
_mesa_opcode_string(enum prog_opcode opcode);
#ifdef __cplusplus
}
#endif
#endif