Commit 6ce99d16 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

d3d10/effect: Add signed integer compare instructions for expressions.

parent d49a6ab0
......@@ -411,6 +411,62 @@ static void pres_iadd(float **args, unsigned int n, const struct preshader_instr
}
}
static void pres_bilt(float **args, unsigned int n, const struct preshader_instr *instr)
{
int *arg1 = (int *)args[0];
int *arg2 = (int *)args[1];
float *retval = args[2];
unsigned int i;
for (i = 0; i < instr->comp_count; ++i)
{
unsigned int v = arg1[instr->scalar ? 0 : i] < arg2[i] ? ~0u : 0;
retval[i] = *(float *)&v;
}
}
static void pres_bige(float **args, unsigned int n, const struct preshader_instr *instr)
{
int *arg1 = (int *)args[0];
int *arg2 = (int *)args[1];
float *retval = args[2];
unsigned int i;
for (i = 0; i < instr->comp_count; ++i)
{
unsigned int v = arg1[instr->scalar ? 0 : i] >= arg2[i] ? ~0u : 0;
retval[i] = *(float *)&v;
}
}
static void pres_bieq(float **args, unsigned int n, const struct preshader_instr *instr)
{
int *arg1 = (int *)args[0];
int *arg2 = (int *)args[1];
float *retval = args[2];
unsigned int i;
for (i = 0; i < instr->comp_count; ++i)
{
unsigned int v = arg1[instr->scalar ? 0 : i] == arg2[i] ? ~0u : 0;
retval[i] = *(float *)&v;
}
}
static void pres_bine(float **args, unsigned int n, const struct preshader_instr *instr)
{
int *arg1 = (int *)args[0];
int *arg2 = (int *)args[1];
float *retval = args[2];
unsigned int i;
for (i = 0; i < instr->comp_count; ++i)
{
unsigned int v = arg1[instr->scalar ? 0 : i] != arg2[i] ? ~0u : 0;
retval[i] = *(float *)&v;
}
}
static void pres_udiv(float **args, unsigned int n, const struct preshader_instr *instr)
{
unsigned int *arg1 = (unsigned int *)args[0];
......@@ -544,6 +600,10 @@ static const struct preshader_op_info preshader_ops[] =
{ 0x205, "mul", pres_mul },
{ 0x206, "atan2",pres_atan2},
{ 0x208, "div", pres_div },
{ 0x210, "bilt", pres_bilt },
{ 0x211, "bige", pres_bige },
{ 0x212, "bieq", pres_bieq },
{ 0x213, "bine", pres_bine },
{ 0x216, "iadd", pres_iadd },
{ 0x21a, "udiv", pres_udiv },
{ 0x21d, "imin", pres_imin },
......
......@@ -8267,13 +8267,18 @@ technique10 tech
{
SetBlendState( NULL, g_var3.x / g_var3.y, 0 );
}
pass p20
{
SetBlendState( NULL, g_var3.x < g_var3.y ? (g_var3.x >= g_var3.z ? 0 : 1 ) :
(g_var3.x != g_var3.z ? g_var3.z == g_var3.w : 2), 0 );
}
}
#endif
static DWORD fx_test_value_expression[] =
{
0x43425844, 0x2f343430, 0x7bdca8e3, 0x8bdb9976, 0xddfe53fd, 0x00000001, 0x00002898, 0x00000001,
0x00000024, 0x30315846, 0x0000286c, 0xfeff1001, 0x00000001, 0x00000004, 0x00000001, 0x00000000,
0x00000000, 0x00000000, 0x00000001, 0x000022b4, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
0x43425844, 0x0665faf3, 0x70ffa2d0, 0x6f046007, 0x12b30760, 0x00000001, 0x00002bd4, 0x00000001,
0x00000024, 0x30315846, 0x00002ba8, 0xfeff1001, 0x00000001, 0x00000004, 0x00000001, 0x00000000,
0x00000000, 0x00000000, 0x00000001, 0x000025b4, 0x00000000, 0x00000000, 0x00000001, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6f6c4724,
0x736c6162, 0x6f6c6600, 0x00347461, 0x0000000d, 0x00000001, 0x00000000, 0x00000010, 0x00000010,
0x00000010, 0x0000210a, 0x61765f67, 0x5f670072, 0x32726176, 0x746e6900, 0x003d0034, 0x00010000,
......@@ -8552,13 +8557,37 @@ static DWORD fx_test_value_expression[] =
0x00000004, 0x00000001, 0x13000001, 0x00000001, 0x00000000, 0x00000007, 0x00000008, 0x00000000,
0x00000004, 0x00000002, 0x13000001, 0x00000001, 0x00000000, 0x00000007, 0x00000008, 0x00000000,
0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000001, 0x00000002, 0x00000000,
0x00000001, 0x00000002, 0x00000000, 0x00303270, 0x000002e0, 0x43425844, 0x561ee53c, 0x9807d928,
0x8a3e8c4e, 0x78f7bcb7, 0x00000001, 0x000002e0, 0x00000003, 0x0000002c, 0x000000a8, 0x000000c4,
0x42415443, 0x00000074, 0x0000001c, 0x0000004b, 0x46580400, 0x00000001, 0x0000001c, 0x00000100,
0x00000048, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000000, 0x61765f67, 0xab003372,
0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820,
0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x30312072, 0xab00312e, 0x34494c43,
0x00000014, 0x00000004, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x434c5846, 0x00000214,
0x0000000c, 0x21200001, 0x00000002, 0x00000000, 0x00000002, 0x00000003, 0x00000000, 0x00000002,
0x00000002, 0x00000000, 0x00000007, 0x00000000, 0x23000001, 0x00000002, 0x00000000, 0x00000007,
0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000007, 0x00000004, 0x21300001,
0x00000002, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000,
0x00000007, 0x00000000, 0x30100001, 0x00000003, 0x00000000, 0x00000007, 0x00000000, 0x00000000,
0x00000007, 0x00000004, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x00000007, 0x00000008,
0x21100001, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002, 0x00000002,
0x00000000, 0x00000007, 0x00000000, 0x30100001, 0x00000003, 0x00000000, 0x00000007, 0x00000000,
0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000001, 0x00000001, 0x00000000, 0x00000007,
0x00000004, 0x21000001, 0x00000002, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000002,
0x00000001, 0x00000000, 0x00000007, 0x00000000, 0x30100001, 0x00000003, 0x00000000, 0x00000007,
0x00000000, 0x00000000, 0x00000007, 0x00000004, 0x00000000, 0x00000007, 0x00000008, 0x00000000,
0x00000007, 0x0000000c, 0x13000001, 0x00000001, 0x00000000, 0x00000007, 0x0000000c, 0x00000000,
0x00000004, 0x00000000, 0x13000001, 0x00000001, 0x00000000, 0x00000007, 0x0000000c, 0x00000000,
0x00000004, 0x00000001, 0x13000001, 0x00000001, 0x00000000, 0x00000007, 0x0000000c, 0x00000000,
0x00000004, 0x00000002, 0x13000001, 0x00000001, 0x00000000, 0x00000007, 0x0000000c, 0x00000000,
0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000001, 0x00000002, 0x00000000,
0x00000001, 0x00000002, 0x00000000, 0x00000004, 0x00000040, 0x00000000, 0x00000004, 0xffffffff,
0x00000000, 0x00000030, 0x00000014, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000036, 0x00000014, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x0000005e,
0x00000042, 0x00000000, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000087, 0x0000006b,
0x00000000, 0x00000030, 0x00000000, 0x00000000, 0x00000000, 0x000000bc, 0x000000a0, 0x00000000,
0xffffffff, 0x00000001, 0x00000019, 0x00000000, 0x00000006, 0x000000c5, 0x00000000, 0x000001b5,
0x00000014, 0x00000000, 0x000001ba, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006,
0x00000015, 0x00000000, 0x000001ba, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006,
0x000001bd, 0x0000000b, 0x00000000, 0x00000001, 0x00000405, 0x00000002, 0x00000000, 0x00000001,
0x00000411, 0x0000041d, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00000420,
0x0000000b, 0x00000000, 0x00000001, 0x00000574, 0x00000002, 0x00000000, 0x00000001, 0x00000580,
......@@ -8595,7 +8624,9 @@ static DWORD fx_test_value_expression[] =
0x00001e28, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00001e2c, 0x0000000b,
0x00000000, 0x00000001, 0x00001fac, 0x00000002, 0x00000000, 0x00000001, 0x00001fb8, 0x00001fc4,
0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00001fc8, 0x0000000b, 0x00000000,
0x00000001, 0x0000229c, 0x00000002, 0x00000000, 0x00000001, 0x000022a8,
0x00000001, 0x0000229c, 0x00000002, 0x00000000, 0x00000001, 0x000022a8, 0x000022b4, 0x00000003,
0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x000022b8, 0x0000000b, 0x00000000, 0x00000001,
0x0000259c, 0x00000002, 0x00000000, 0x00000001, 0x000025a8,
};
static float get_frc(float v)
......@@ -9017,6 +9048,46 @@ static void test_effect_value_expression(void)
ok(blend_factor[3] == 2.0f, "Got unexpected blend_factor[3] %.8e.\n", blend_factor[3]);
ok(!sample_mask, "Got unexpected sample_mask %#x.\n", sample_mask);
/* Integer comparison */
pass = t->lpVtbl->GetPassByName(t, "p20");
ok(pass->lpVtbl->IsValid(pass), "Expected valid pass.\n");
i[0] = 1;
i[1] = 5;
i[2] = 6;
i[3] = 5;
hr = g_var3->lpVtbl->SetIntVector(g_var3, i);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = pass->lpVtbl->Apply(pass, 0);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ID3D10Device_OMGetBlendState(device, &blend_state, blend_factor, &sample_mask);
ok(!blend_state, "Unexpected blend state %p.\n", blend_state);
ok(blend_factor[0] == 1.0f, "Got unexpected blend_factor[0] %.8e.\n", blend_factor[0]);
ok(blend_factor[1] == 1.0f, "Got unexpected blend_factor[1] %.8e.\n", blend_factor[1]);
ok(blend_factor[2] == 1.0f, "Got unexpected blend_factor[2] %.8e.\n", blend_factor[2]);
ok(blend_factor[3] == 1.0f, "Got unexpected blend_factor[3] %.8e.\n", blend_factor[3]);
ok(!sample_mask, "Got unexpected sample_mask %#x.\n", sample_mask);
i[0] = 2;
i[1] = 1;
i[2] = 2;
i[3] = 5;
hr = g_var3->lpVtbl->SetIntVector(g_var3, i);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = pass->lpVtbl->Apply(pass, 0);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ID3D10Device_OMGetBlendState(device, &blend_state, blend_factor, &sample_mask);
ok(!blend_state, "Unexpected blend state %p.\n", blend_state);
ok(blend_factor[0] == 2.0f, "Got unexpected blend_factor[0] %.8e.\n", blend_factor[0]);
ok(blend_factor[1] == 2.0f, "Got unexpected blend_factor[1] %.8e.\n", blend_factor[1]);
ok(blend_factor[2] == 2.0f, "Got unexpected blend_factor[2] %.8e.\n", blend_factor[2]);
ok(blend_factor[3] == 2.0f, "Got unexpected blend_factor[3] %.8e.\n", blend_factor[3]);
ok(!sample_mask, "Got unexpected sample_mask %#x.\n", sample_mask);
effect->lpVtbl->Release(effect);
refcount = ID3D10Device_Release(device);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment