From: Nikolay Sivov nsivov@codeweavers.com
--- dlls/d3d10/effect.c | 28 ++++++++ dlls/d3d10/tests/effect.c | 144 +++++++++++++++++++++++++++++--------- 2 files changed, 140 insertions(+), 32 deletions(-)
diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c index f7ca3cdb0d0..b6bc7f255c0 100644 --- a/dlls/d3d10/effect.c +++ b/dlls/d3d10/effect.c @@ -415,6 +415,32 @@ static void pres_imax(float **args, unsigned int n, const struct preshader_instr } }
+static void pres_umin(float **args, unsigned int n, const struct preshader_instr *instr) +{ + unsigned int *arg1 = (unsigned int *)args[0], *arg2 = (unsigned int *)args[1]; + float *retval = args[2]; + unsigned int i; + + for (i = 0; i < instr->comp_count; ++i) + { + unsigned int v = min(arg1[instr->scalar ? 0 : i], arg2[i]); + retval[i] = *(float *)&v; + } +} + +static void pres_umax(float **args, unsigned int n, const struct preshader_instr *instr) +{ + unsigned int *arg1 = (unsigned int *)args[0], *arg2 = (unsigned int *)args[1]; + float *retval = args[2]; + unsigned int i; + + for (i = 0; i < instr->comp_count; ++i) + { + unsigned int v = max(arg1[instr->scalar ? 0 : i], arg2[i]); + retval[i] = *(float *)&v; + } +} + static void pres_movc(float **args, unsigned int n, const struct preshader_instr *instr) { float *arg1 = args[0], *arg2 = args[1], *arg3 = args[2]; @@ -455,6 +481,8 @@ static const struct preshader_op_info preshader_ops[] = { 0x208, "div", pres_div }, { 0x21a, "udiv", pres_udiv }, { 0x21e, "imax", pres_imax }, + { 0x21f, "umin", pres_umin }, + { 0x220, "umax", pres_umax }, { 0x301, "movc", pres_movc }, };
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c index cd30e90490f..1eb58f468e8 100644 --- a/dlls/d3d10/tests/effect.c +++ b/dlls/d3d10/tests/effect.c @@ -8193,13 +8193,21 @@ technique10 tech { SetBlendState( NULL, g_var.x ? g_var.y : g_var.z, 0 ); } + pass p11 + { + SetBlendState( NULL, min(g_var4.x, g_var4.y), 0 ); + } + pass p12 + { + SetBlendState( NULL, max(g_var4.x, g_var4.y), 0 ); + } } #endif static DWORD fx_test_value_expression[] = { - 0x43425844, 0x9a61208c, 0xd8ca913f, 0xafbac229, 0x5c5772ef, 0x00000001, 0x0000174c, 0x00000001, - 0x00000024, 0x30315846, 0x00001720, 0xfeff1001, 0x00000001, 0x00000004, 0x00000001, 0x00000000, - 0x00000000, 0x00000000, 0x00000001, 0x00001384, 0x00000000, 0x00000000, 0x00000001, 0x00000000, + 0x43425844, 0x54f34e21, 0x72cdbbec, 0xe1e35608, 0x72302d4b, 0x00000001, 0x00001af4, 0x00000001, + 0x00000024, 0x30315846, 0x00001ac8, 0xfeff1001, 0x00000001, 0x00000004, 0x00000001, 0x00000000, + 0x00000000, 0x00000000, 0x00000001, 0x000016b4, 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, @@ -8356,34 +8364,63 @@ static DWORD fx_test_value_expression[] = 0x00000002, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 0x00000000, 0x00000004, 0x00000002, 0x30100001, 0x00000003, 0x00000000, 0x00000007, 0x00000000, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000002, 0x00000002, 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, 0x0000000b, 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, 0x0000058c, 0x00000003, 0x00000000, 0x0000000a, - 0x00000000, 0x00000006, 0x0000058f, 0x0000000b, 0x00000000, 0x00000001, 0x000007bf, 0x00000002, - 0x00000000, 0x00000001, 0x000007cb, 0x000007d7, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, - 0x00000006, 0x000007da, 0x0000000b, 0x00000000, 0x00000001, 0x00000902, 0x00000002, 0x00000000, - 0x00000001, 0x0000090e, 0x0000091a, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, - 0x0000091d, 0x0000000b, 0x00000000, 0x00000001, 0x00000a45, 0x00000002, 0x00000000, 0x00000001, - 0x00000a51, 0x00000a5d, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00000a60, - 0x0000000b, 0x00000000, 0x00000001, 0x00000b5c, 0x00000002, 0x00000000, 0x00000001, 0x00000b68, - 0x00000b74, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00000b77, 0x0000000b, - 0x00000000, 0x00000001, 0x00000cc7, 0x00000002, 0x00000000, 0x00000001, 0x00000cd3, 0x00000cdf, - 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00000ce2, 0x0000000b, 0x00000000, - 0x00000001, 0x00000dd2, 0x00000002, 0x00000000, 0x00000001, 0x00000dde, 0x00000dea, 0x00000003, - 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00000ded, 0x0000000b, 0x00000000, 0x00000001, - 0x00000fe9, 0x00000002, 0x00000000, 0x00000001, 0x00000ff5, 0x00001001, 0x00000003, 0x00000000, - 0x0000000a, 0x00000000, 0x00000006, 0x00001004, 0x0000000b, 0x00000000, 0x00000001, 0x00001180, - 0x00000002, 0x00000000, 0x00000001, 0x0000118c, 0x00001198, 0x00000003, 0x00000000, 0x0000000a, - 0x00000000, 0x00000006, 0x0000119c, 0x0000000b, 0x00000000, 0x00000001, 0x0000136c, 0x00000002, - 0x00000000, 0x00000001, 0x00001378, + 0x0000ffff, 0x00000001, 0x00000002, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x00313170, + 0x00000178, 0x43425844, 0xb2dec0d7, 0x6d936ace, 0x1e31a035, 0x7de038f5, 0x00000001, 0x00000178, + 0x00000003, 0x0000002c, 0x000000a8, 0x000000b4, 0x42415443, 0x00000074, 0x0000001c, 0x0000004b, + 0x46580400, 0x00000001, 0x0000001c, 0x00000100, 0x00000048, 0x00000030, 0x00000002, 0x00000001, + 0x00000038, 0x00000000, 0x61765f67, 0xab003472, 0x00020001, 0x00040001, 0x00000001, 0x00000000, + 0x4d007874, 0x6f726369, 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, + 0x656c6970, 0x30312072, 0xab00312e, 0x34494c43, 0x00000004, 0x00000000, 0x434c5846, 0x000000bc, + 0x00000005, 0x21f00001, 0x00000002, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000002, + 0x00000000, 0x00000000, 0x00000007, 0x00000000, 0x13100001, 0x00000001, 0x00000000, 0x00000007, + 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x13100001, 0x00000001, 0x00000000, 0x00000007, + 0x00000000, 0x00000000, 0x00000004, 0x00000001, 0x13100001, 0x00000001, 0x00000000, 0x00000007, + 0x00000000, 0x00000000, 0x00000004, 0x00000002, 0x13100001, 0x00000001, 0x00000000, 0x00000007, + 0x00000000, 0x00000000, 0x00000004, 0x00000003, 0xf0f0f0f0, 0x0f0f0f0f, 0x0000ffff, 0x00000001, + 0x00000002, 0x00000000, 0x00000001, 0x00000002, 0x00000000, 0x00323170, 0x00000178, 0x43425844, + 0x0334f480, 0xa1c4caca, 0x9e1735e8, 0x1d8a5fb0, 0x00000001, 0x00000178, 0x00000003, 0x0000002c, + 0x000000a8, 0x000000b4, 0x42415443, 0x00000074, 0x0000001c, 0x0000004b, 0x46580400, 0x00000001, + 0x0000001c, 0x00000100, 0x00000048, 0x00000030, 0x00000002, 0x00000001, 0x00000038, 0x00000000, + 0x61765f67, 0xab003472, 0x00020001, 0x00040001, 0x00000001, 0x00000000, 0x4d007874, 0x6f726369, + 0x74666f73, 0x29522820, 0x534c4820, 0x6853204c, 0x72656461, 0x6d6f4320, 0x656c6970, 0x30312072, + 0xab00312e, 0x34494c43, 0x00000004, 0x00000000, 0x434c5846, 0x000000bc, 0x00000005, 0x22000001, + 0x00000002, 0x00000000, 0x00000002, 0x00000001, 0x00000000, 0x00000002, 0x00000000, 0x00000000, + 0x00000007, 0x00000000, 0x13100001, 0x00000001, 0x00000000, 0x00000007, 0x00000000, 0x00000000, + 0x00000004, 0x00000000, 0x13100001, 0x00000001, 0x00000000, 0x00000007, 0x00000000, 0x00000000, + 0x00000004, 0x00000001, 0x13100001, 0x00000001, 0x00000000, 0x00000007, 0x00000000, 0x00000000, + 0x00000004, 0x00000002, 0x13100001, 0x00000001, 0x00000000, 0x00000007, 0x00000000, 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, + 0x0000000d, 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, + 0x0000058c, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x0000058f, 0x0000000b, + 0x00000000, 0x00000001, 0x000007bf, 0x00000002, 0x00000000, 0x00000001, 0x000007cb, 0x000007d7, + 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x000007da, 0x0000000b, 0x00000000, + 0x00000001, 0x00000902, 0x00000002, 0x00000000, 0x00000001, 0x0000090e, 0x0000091a, 0x00000003, + 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x0000091d, 0x0000000b, 0x00000000, 0x00000001, + 0x00000a45, 0x00000002, 0x00000000, 0x00000001, 0x00000a51, 0x00000a5d, 0x00000003, 0x00000000, + 0x0000000a, 0x00000000, 0x00000006, 0x00000a60, 0x0000000b, 0x00000000, 0x00000001, 0x00000b5c, + 0x00000002, 0x00000000, 0x00000001, 0x00000b68, 0x00000b74, 0x00000003, 0x00000000, 0x0000000a, + 0x00000000, 0x00000006, 0x00000b77, 0x0000000b, 0x00000000, 0x00000001, 0x00000cc7, 0x00000002, + 0x00000000, 0x00000001, 0x00000cd3, 0x00000cdf, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, + 0x00000006, 0x00000ce2, 0x0000000b, 0x00000000, 0x00000001, 0x00000dd2, 0x00000002, 0x00000000, + 0x00000001, 0x00000dde, 0x00000dea, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, + 0x00000ded, 0x0000000b, 0x00000000, 0x00000001, 0x00000fe9, 0x00000002, 0x00000000, 0x00000001, + 0x00000ff5, 0x00001001, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00001004, + 0x0000000b, 0x00000000, 0x00000001, 0x00001180, 0x00000002, 0x00000000, 0x00000001, 0x0000118c, + 0x00001198, 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x0000119c, 0x0000000b, + 0x00000000, 0x00000001, 0x0000136c, 0x00000002, 0x00000000, 0x00000001, 0x00001378, 0x00001384, + 0x00000003, 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00001388, 0x0000000b, 0x00000000, + 0x00000001, 0x00001504, 0x00000002, 0x00000000, 0x00000001, 0x00001510, 0x0000151c, 0x00000003, + 0x00000000, 0x0000000a, 0x00000000, 0x00000006, 0x00001520, 0x0000000b, 0x00000000, 0x00000001, + 0x0000169c, 0x00000002, 0x00000000, 0x00000001, 0x000016a8, };
static float get_frc(float v) @@ -8393,7 +8430,7 @@ static float get_frc(float v)
static void test_effect_value_expression(void) { - ID3D10EffectVectorVariable *g_var, *g_var2, *g_var3; + ID3D10EffectVectorVariable *g_var, *g_var2, *g_var3, *g_var4; ID3D10EffectDepthStencilVariable *ds; D3D10_DEPTH_STENCIL_DESC ds_desc; ID3D10BlendState *blend_state; @@ -8406,6 +8443,7 @@ static void test_effect_value_expression(void) UINT sample_mask; ULONG refcount; HRESULT hr; + int i[4];
if (!(device = create_device())) { @@ -8428,6 +8466,9 @@ static void test_effect_value_expression(void) v = effect->lpVtbl->GetVariableByName(effect, "g_var3"); g_var3 = v->lpVtbl->AsVector(v); ok(g_var3->lpVtbl->IsValid(g_var3), "Expected valid vector variable.\n"); + v = effect->lpVtbl->GetVariableByName(effect, "g_var4"); + g_var4 = v->lpVtbl->AsVector(v); + ok(g_var4->lpVtbl->IsValid(g_var4), "Expected valid vector variable.\n");
/* min/max */ pass = t->lpVtbl->GetPassByName(t, "p3"); @@ -8645,6 +8686,45 @@ static void test_effect_value_expression(void) ok(blend_factor[3] == 0.1f, "Got unexpected blend_factor[3] %.8e.\n", blend_factor[3]); ok(!sample_mask, "Got unexpected sample_mask %#x.\n", sample_mask);
+ /* umin/umax */ + pass = t->lpVtbl->GetPassByName(t, "p11"); + ok(pass->lpVtbl->IsValid(pass), "Expected valid pass.\n"); + + i[0] = 3; + i[1] = 2; + hr = g_var4->lpVtbl->SetIntVector(g_var4, 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); + + pass = t->lpVtbl->GetPassByName(t, "p12"); + ok(pass->lpVtbl->IsValid(pass), "Expected valid pass.\n"); + + i[0] = 2; + i[1] = 5; + hr = g_var4->lpVtbl->SetIntVector(g_var4, 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] == 5.0f, "Got unexpected blend_factor[0] %.8e.\n", blend_factor[0]); + ok(blend_factor[1] == 5.0f, "Got unexpected blend_factor[1] %.8e.\n", blend_factor[1]); + ok(blend_factor[2] == 5.0f, "Got unexpected blend_factor[2] %.8e.\n", blend_factor[2]); + ok(blend_factor[3] == 5.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);