|
|
|
#ifndef _INCLUDED_OPCODES_H |
|
#define _INCLUDED_OPCODES_H |
|
|
|
|
|
#ifndef _INCLUDED_ASSEMBLER_H |
|
#error "Must include Assembler.h, not this file" |
|
#endif |
|
|
|
|
|
// Within namespace sha |
|
extern DWORD* sptr; |
|
|
|
|
|
SA_INLINE void BeginVS(DWORD * ptr) |
|
{ |
|
// All shaders begin with a version number |
|
sptr = ptr; |
|
nb_instructions = 0; |
|
*sptr++ = D3DVS_VERSION(1, 1); |
|
} |
|
|
|
|
|
SA_INLINE void EndVS(void) |
|
{ |
|
*sptr++ = D3DVS_END(); |
|
sptr = 0; |
|
} |
|
|
|
|
|
SA_INLINE void BeginPS(DWORD* ptr) |
|
{ |
|
sptr = ptr; |
|
nb_instructions = 0; |
|
*sptr++ = D3DPS_VERSION(1, 1); |
|
} |
|
|
|
|
|
SA_INLINE void EndPS(void) |
|
{ |
|
*sptr++ = D3DPS_END(); |
|
sptr = 0; |
|
} |
|
|
|
|
|
#define MATHOP_3_SINGLE(name, op, mod) \ |
|
__forceinline void name(CDWORD dst, CDWORD src_a, CDWORD src_b) \ |
|
{ \ |
|
opcode3(sptr, op, dst | mod, src_a, src_b); \ |
|
} |
|
|
|
|
|
#define MATHOP_4_SINGLE(name, op, mod) \ |
|
__forceinline void name(CDWORD dst, CDWORD src_a, CDWORD src_b, CDWORD src_c) \ |
|
{ \ |
|
opcode4(sptr, op, dst | mod, src_a, src_b, src_c); \ |
|
} |
|
|
|
|
|
#define MATHOP(name, c, op) \ |
|
MATHOP_##c##_SINGLE(name, op, 0) \ |
|
MATHOP_##c##_SINGLE(name##_##x2, op, (1 << D3DSP_DSTSHIFT_SHIFT)) \ |
|
MATHOP_##c##_SINGLE(name##_##x4, op, (2 << D3DSP_DSTSHIFT_SHIFT)) \ |
|
MATHOP_##c##_SINGLE(name##_##sat, op, D3DSPDM_SATURATE) \ |
|
MATHOP_##c##_SINGLE(name##_##x2_sat, op, ((1 << D3DSP_DSTSHIFT_SHIFT) | D3DSPDM_SATURATE)) \ |
|
MATHOP_##c##_SINGLE(name##_##x4_sat, op, ((2 << D3DSP_DSTSHIFT_SHIFT) | D3DSPDM_SATURATE)) |
|
|
|
|
|
MATHOP(mul, 3, D3DSIO_MUL); |
|
MATHOP(dp3, 3, D3DSIO_DP3); |
|
MATHOP(dp4, 3, D3DSIO_DP4); |
|
MATHOP(min, 3, D3DSIO_MIN); |
|
MATHOP(max, 3, D3DSIO_MAX); |
|
MATHOP(add, 3, D3DSIO_ADD); |
|
MATHOP(sub, 3, D3DSIO_SUB); |
|
MATHOP(mad, 4, D3DSIO_MAD); |
|
|
|
|
|
SA_INLINE void nop(void) |
|
{ |
|
opcode0(sptr, D3DSIO_NOP); |
|
} |
|
|
|
|
|
SA_INLINE void mov(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_MOV, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void rcp(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_RCP, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void rsq(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_RSQ, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void slt(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_SLT, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void sge(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_SGE, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void exp(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_EXP, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void log(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_LOG, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void lit(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_LIT, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void dst(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_DST, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void lrp(CDWORD dst, CDWORD src_a, CDWORD src_b, CDWORD src_c) |
|
{ |
|
opcode4(sptr, D3DSIO_LRP, dst, src_a, src_b, src_c); |
|
} |
|
|
|
|
|
SA_INLINE void frc(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_FRC, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void m4x4(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_M4x4, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void m4x3(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_M4x3, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void m3x4(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_M3x4, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void m3x3(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_M3x3, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void m3x2(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_M3x2, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void texcoord(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXCOORD, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texkill(CDWORD dst) |
|
{ |
|
opcode1_dst(sptr, D3DSIO_TEXKILL, dst); |
|
} |
|
|
|
|
|
SA_INLINE void tex(CDWORD dst) |
|
{ |
|
opcode1_dst(sptr, D3DSIO_TEX, dst); |
|
} |
|
|
|
|
|
SA_INLINE void texbem(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXBEM, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texbeml(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXBEML, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texreg2ar(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXREG2AR, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texreg2gb(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXREG2GB, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x2pad(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x2PAD, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x2tex(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x2TEX, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x3pad(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x3PAD, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x3tex(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x3TEX, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x3spec(CDWORD dst, CDWORD src_a, CDWORD src_b) |
|
{ |
|
opcode3(sptr, D3DSIO_TEXM3x3SPEC, dst, src_a, src_b); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x3vspec(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x3VSPEC, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void cnd(CDWORD dst, CDWORD src_a, CDWORD src_b, CDWORD src_c, CDWORD src_d) |
|
{ |
|
opcode4(sptr, D3DSIO_CND, dst, src_a, src_b, src_d); |
|
} |
|
|
|
|
|
SA_INLINE void def(CDWORD dst, CDWORD src_a, CDWORD src_b, CDWORD src_c, CDWORD src_d) |
|
{ |
|
opcode5(sptr, D3DSIO_DEF, dst, src_a, src_b, src_c, src_d); |
|
} |
|
|
|
|
|
SA_INLINE void texreg2rgb(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXREG2RGB, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texdp3tex(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXDP3TEX, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x2depth(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x2DEPTH, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texdp3(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXDP3, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void texm3x3(CDWORD dst, CDWORD src) |
|
{ |
|
opcode2(sptr, D3DSIO_TEXM3x3, dst, src); |
|
} |
|
|
|
|
|
SA_INLINE void cmp(CDWORD dst, CDWORD src_a, CDWORD src_b, CDWORD src_c) |
|
{ |
|
opcode4(sptr, D3DSIO_CMP, dst, src_a, src_b, src_c); |
|
} |
|
|
|
|
|
#endif /* _INCLUDED_OPCODES_H */ |