Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Added some more preshader opcodes, cleaned up opcode handling elsewhere.
  • Loading branch information
icculus committed May 30, 2011
1 parent 17b629e commit b2fc751
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 34 deletions.
7 changes: 7 additions & 0 deletions mojoshader.c
Expand Up @@ -7269,18 +7269,25 @@ static void parse_preshader(Context *ctx, uint32 tokcount)
case 0x1070: opcode = MOJOSHADER_PRESHADEROP_RSQ; break;
case 0x1080: opcode = MOJOSHADER_PRESHADEROP_SIN; break;
case 0x1090: opcode = MOJOSHADER_PRESHADEROP_COS; break;
case 0x10A0: opcode = MOJOSHADER_PRESHADEROP_ASIN; break;
case 0x10B0: opcode = MOJOSHADER_PRESHADEROP_ACOS; break;
case 0x10C0: opcode = MOJOSHADER_PRESHADEROP_ATAN; break;
case 0x2000: opcode = MOJOSHADER_PRESHADEROP_MIN; break;
case 0x2010: opcode = MOJOSHADER_PRESHADEROP_MAX; break;
case 0x2020: opcode = MOJOSHADER_PRESHADEROP_CMPLT; break;
case 0x2030: opcode = MOJOSHADER_PRESHADEROP_CMPGE; break;
case 0x2040: opcode = MOJOSHADER_PRESHADEROP_ADD; break;
case 0x2050: opcode = MOJOSHADER_PRESHADEROP_MUL; break;
case 0x2060: opcode = MOJOSHADER_PRESHADEROP_ATAN2; break;
case 0x3000: opcode = MOJOSHADER_PRESHADEROP_CMP; break;
case 0x5000: opcode = MOJOSHADER_PRESHADEROP_DOT; break;
case 0xA000: opcode = MOJOSHADER_PRESHADEROP_MIN_SCALAR; break;
case 0xA010: opcode = MOJOSHADER_PRESHADEROP_MAX_SCALAR; break;
case 0xA020: opcode = MOJOSHADER_PRESHADEROP_CMPLT_SCALAR; break;
case 0xA030: opcode = MOJOSHADER_PRESHADEROP_CMPGE_SCALAR; break;
case 0xA040: opcode = MOJOSHADER_PRESHADEROP_ADD_SCALAR; break;
case 0xA050: opcode = MOJOSHADER_PRESHADEROP_MUL_SCALAR; break;
case 0xA060: opcode = MOJOSHADER_PRESHADEROP_ATAN2_SCALAR; break;
case 0xD000: opcode = MOJOSHADER_PRESHADEROP_DOT_SCALAR; break;
default: fail(ctx, "Unknown preshader opcode."); break;
} // switch
Expand Down
34 changes: 21 additions & 13 deletions mojoshader.h
Expand Up @@ -359,27 +359,35 @@ typedef enum MOJOSHADER_preshaderOpcode
{
MOJOSHADER_PRESHADEROP_NOP,
MOJOSHADER_PRESHADEROP_MOV,
MOJOSHADER_PRESHADEROP_CMP,
MOJOSHADER_PRESHADEROP_DOT,
MOJOSHADER_PRESHADEROP_DOT_SCALAR,
MOJOSHADER_PRESHADEROP_NEG,
MOJOSHADER_PRESHADEROP_MAX,
MOJOSHADER_PRESHADEROP_MAX_SCALAR,
MOJOSHADER_PRESHADEROP_CMPLT,
MOJOSHADER_PRESHADEROP_CMPLT_SCALAR,
MOJOSHADER_PRESHADEROP_CMPGE,
MOJOSHADER_PRESHADEROP_CMPGE_SCALAR,
MOJOSHADER_PRESHADEROP_RCP,
MOJOSHADER_PRESHADEROP_FRC,
MOJOSHADER_PRESHADEROP_EXP,
MOJOSHADER_PRESHADEROP_ADD,
MOJOSHADER_PRESHADEROP_ADD_SCALAR,
MOJOSHADER_PRESHADEROP_MUL,
MOJOSHADER_PRESHADEROP_MUL_SCALAR,
MOJOSHADER_PRESHADEROP_LOG,
MOJOSHADER_PRESHADEROP_RSQ,
MOJOSHADER_PRESHADEROP_SIN,
MOJOSHADER_PRESHADEROP_COS,
MOJOSHADER_PRESHADEROP_ASIN,
MOJOSHADER_PRESHADEROP_ACOS,
MOJOSHADER_PRESHADEROP_ATAN,
MOJOSHADER_PRESHADEROP_MIN,
MOJOSHADER_PRESHADEROP_MAX,
MOJOSHADER_PRESHADEROP_CMPLT,
MOJOSHADER_PRESHADEROP_CMPGE,
MOJOSHADER_PRESHADEROP_ADD,
MOJOSHADER_PRESHADEROP_MUL,
MOJOSHADER_PRESHADEROP_ATAN2,
MOJOSHADER_PRESHADEROP_CMP,
MOJOSHADER_PRESHADEROP_DOT,
MOJOSHADER_PRESHADEROP_SCALAR_OPS,
MOJOSHADER_PRESHADEROP_MIN_SCALAR = MOJOSHADER_PRESHADEROP_SCALAR_OPS,
MOJOSHADER_PRESHADEROP_MAX_SCALAR,
MOJOSHADER_PRESHADEROP_CMPLT_SCALAR,
MOJOSHADER_PRESHADEROP_CMPGE_SCALAR,
MOJOSHADER_PRESHADEROP_ADD_SCALAR,
MOJOSHADER_PRESHADEROP_MUL_SCALAR,
MOJOSHADER_PRESHADEROP_ATAN2_SCALAR,
MOJOSHADER_PRESHADEROP_DOT_SCALAR,
} MOJOSHADER_preshaderOpcode;

typedef enum MOJOSHADER_preshaderOperandType
Expand Down
30 changes: 9 additions & 21 deletions utils/testparse.c
Expand Up @@ -114,9 +114,10 @@ static void print_preshader(const MOJOSHADER_preshader *preshader,
int i, j, k;

static const char *opcodestr[] = {
"nop", "mov", "cmp", "dot", "dot", "neg", "max", "max",
"cmplt", "cmplt", "cmpge", "cmpge", "rcp", "frc", "exp",
"add", "add", "mul", "mul", "log", "rsq", "sin", "cos"
"nop", "mov", "neg", "rcp", "frc", "exp", "log", "rsq", "sin", "cos",
"asin", "acos", "atan", "min", "max", "cmplt", "cmpge", "add", "mul",
"atan2", "cmp", "dot", "min", "max", "cmplt", "cmpge", "add", "mul",
"atan2", "dot"
};

static char mask[] = { 'x', 'y', 'z', 'w' };
Expand All @@ -125,28 +126,15 @@ static void print_preshader(const MOJOSHADER_preshader *preshader,
for (i = 0; i < preshader->instruction_count; i++, inst++)
{
const MOJOSHADER_preshaderOperand *operand = inst->operands;
const int scalarstart = (int) MOJOSHADER_PRESHADEROP_SCALAR_OPS;
const int isscalarop = (inst->opcode >= scalarstart);

INDENT(); printf(" %s", opcodestr[inst->opcode]);

INDENT();
printf(" %s", opcodestr[inst->opcode]);
for (j = 0; j < inst->operand_count; j++, operand++)
{
const int elems = inst->element_count;
int isscalar = 0;
if (j == 1) // This is probably wrong.
{
switch (inst->opcode)
{
case MOJOSHADER_PRESHADEROP_DOT_SCALAR:
case MOJOSHADER_PRESHADEROP_MAX_SCALAR:
case MOJOSHADER_PRESHADEROP_CMPLT_SCALAR:
case MOJOSHADER_PRESHADEROP_CMPGE_SCALAR:
case MOJOSHADER_PRESHADEROP_ADD_SCALAR:
case MOJOSHADER_PRESHADEROP_MUL_SCALAR:
isscalar = 1; break;
default:
isscalar = 0; break;
} // switch
} // if
const int isscalar = ((isscalarop) && (j == 1)); // probably wrong.

if (j != 0)
printf(",");
Expand Down

0 comments on commit b2fc751

Please sign in to comment.