d3dx9: Add d3ds_dotswiz opcode to preshader.

Signed-off-by: Paul Gofman <gofmanp@gmail.com>
Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2016-05-20 20:43:56 +03:00 committed by Alexandre Julliard
parent 7d2bba4647
commit 4786f53ef8
2 changed files with 23 additions and 8 deletions

View File

@ -44,6 +44,8 @@ enum pres_ops
PRESHADER_OP_COS,
PRESHADER_OP_RSQ,
PRESHADER_OP_EXP,
PRESHADER_OP_DOTSWIZ6,
PRESHADER_OP_DOTSWIZ8,
};
typedef double (*pres_op_func)(double *args, int n);
@ -61,6 +63,17 @@ static double pres_dot(double *args, int n)
sum += args[i] * args[i + n];
return sum;
}
static double pres_dotswiz6(double *args, int n)
{
return pres_dot(args, 3);
}
static double pres_dotswiz8(double *args, int n)
{
return pres_dot(args, 4);
}
static double pres_neg(double *args, int n) {return -args[0];}
static double pres_rcp(double *args, int n) {return 1.0 / args[0];}
static double pres_lt(double *args, int n) {return args[0] < args[1] ? 1.0 : 0.0;}
@ -97,7 +110,7 @@ static double pres_exp(double *args, int n) {return pow(2.0, args[0]);}
struct op_info
{
unsigned int opcode;
char mnem[8];
char mnem[16];
unsigned int input_count;
BOOL func_all_comps;
pres_op_func func;
@ -122,6 +135,8 @@ static const struct op_info pres_op_info[] =
{0x109, "cos", 1, 0, pres_cos}, /* PRESHADER_OP_COS */
{0x107, "rsq", 1, 0, pres_rsq}, /* PRESHADER_OP_RSQ */
{0x105, "exp", 1, 0, pres_exp}, /* PRESHADER_OP_EXP */
{0x70e, "d3ds_dotswiz", 6, 0, pres_dotswiz6}, /* PRESHADER_OP_DOTSWIZ6 */
{0x70e, "d3ds_dotswiz", 8, 0, pres_dotswiz8}, /* PRESHADER_OP_DOTSWIZ8 */
};
enum pres_value_type
@ -178,7 +193,7 @@ struct d3dx_pres_operand
unsigned int offset;
};
#define MAX_INPUTS_COUNT 3
#define MAX_INPUTS_COUNT 8
struct d3dx_pres_ins
{
@ -410,18 +425,18 @@ static unsigned int *parse_pres_ins(unsigned int *ptr, unsigned int count, struc
input_count = *ptr++;
count -= 2;
for (i = 0; i < ARRAY_SIZE(pres_op_info); ++i)
if (ins_code == pres_op_info[i].opcode)
if (ins_code == pres_op_info[i].opcode && input_count == pres_op_info[i].input_count)
break;
if (i == ARRAY_SIZE(pres_op_info))
{
FIXME("Unknown opcode %#x, raw %#x.\n", ins_code, ins_raw);
FIXME("Unknown opcode %#x, input_count %u, raw %#x.\n", ins_code, input_count, ins_raw);
return NULL;
}
ins->op = i;
if (input_count > ARRAY_SIZE(ins->inputs) || input_count != pres_op_info[i].input_count)
if (input_count > ARRAY_SIZE(ins->inputs))
{
FIXME("Actual input args %u, expected %u, instruction %s.\n", input_count,
pres_op_info[i].input_count, pres_op_info[i].mnem);
FIXME("Actual input args count %u exceeds inputs array size, instruction %s.\n", input_count,
pres_op_info[i].mnem);
return NULL;
}
for (i = 0; i < input_count; ++i)

View File

@ -3872,7 +3872,7 @@ static void test_effect_preshader(IDirect3DDevice9 *device)
{"den mul",{FALSE, FALSE, FALSE, FALSE}, {0x7f800000, 0xff800000, 0xbb94f209, 0x000051ec}},
{"dot", {FALSE, FALSE, FALSE, FALSE}, {0x00000000, 0x7f800000, 0x41f00000, 0x00000000}},
{"prec", {FALSE, FALSE, TRUE, FALSE}, {0x2b8cbccc, 0x2c0cbccc, 0xac531800, 0x00000000}},
{"dotswiz", { TRUE, TRUE, TRUE, FALSE}, {0xc00ccccd, 0xc0d33334, 0xc10ccccd, 0}},
{"dotswiz", {FALSE, FALSE, FALSE, FALSE}, {0xc00ccccd, 0xc0d33334, 0xc10ccccd, 0}},
{"reladdr", { TRUE, TRUE, TRUE, TRUE}, {0xc00ccccd, 0x40000000, 0x41a00000, 0x41500000}},
};
#define TEST_EFFECT_PRES_NFLOATV ARRAY_SIZE(test_effect_preshader_fconstsv)