Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- tests/d3d12.c | 332 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 332 insertions(+)
diff --git a/tests/d3d12.c b/tests/d3d12.c index f289a10d..55c9ca4d 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -41,6 +41,11 @@ struct ivec4 int x, y, z, w; };
+struct dvec2 +{ + double x, y; +}; + static bool compare_uvec4(const struct uvec4* v1, const struct uvec4 *v2) { return v1->x == v2->x && v1->y == v2->y && v1->z == v2->z && v1->w == v2->w; @@ -651,6 +656,21 @@ static bool is_memory_pool_L1_supported(ID3D12Device *device) return !architecture.UMA; }
+static bool is_shader_float64_supported(ID3D12Device *device) +{ + D3D12_FEATURE_DATA_D3D12_OPTIONS options; + HRESULT hr; + + if (FAILED(hr = ID3D12Device_CheckFeatureSupport(device, + D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options)))) + { + trace("Failed to check feature support, hr %#x.\n", hr); + return false; + } + + return options.DoublePrecisionFloatShaderOps; +} + #define create_cb_root_signature(a, b, c, e) create_cb_root_signature_(__LINE__, a, b, c, e) static ID3D12RootSignature *create_cb_root_signature_(unsigned int line, ID3D12Device *device, unsigned int reg_idx, D3D12_SHADER_VISIBILITY shader_visibility, @@ -7510,6 +7530,7 @@ static void test_shader_instructions(void) D3D12_SHADER_BYTECODE shader; struct test_context context; ID3D12CommandQueue *queue; + bool test_shader_float64; ID3D12Resource *cb; unsigned int i; HRESULT hr; @@ -9054,6 +9075,278 @@ static void test_shader_instructions(void) 0x00100e46, 0x00000001, 0x0100003e, }; static struct named_shader ps_swapc5 = {"swapc5", ps_swapc5_code, sizeof(ps_swapc5_code)}; + static const DWORD ps_dmov_code[] = + { +#if 0 + double2 src0; + + void main(out uint4 dst : SV_Target) + { + asuint(-src0.y, dst.x, dst.y); + asuint(-src0.x, dst.z, dst.w); + } +#endif + 0x43425844, 0x16bd7e63, 0x6b535ab7, 0xb7f182c2, 0x6f3819a8, 0x00000001, 0x000000f0, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x000000e0, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000064, 0x00000050, + 0x00000019, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x070000c7, 0x001000f2, 0x00000000, 0x802084e6, 0x00000041, + 0x00000000, 0x00000000, 0x05000036, 0x001020f2, 0x00000000, 0x00100e46, 0x00000000, 0x0100003e, + 0x30494653, 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_dmov = {"dmov", ps_dmov_code, sizeof(ps_dmov_code)}; + static const DWORD ps_dadd_code[] = + { + /* Also test constant double2 vector. */ +#if 0 + double src0; + + void main(out uint4 dst : SV_Target) + { + double2 a = double2(src0 + 1.0000002433080226l, src0 + 2.000000481493771l); + asuint(a.x, dst.x, dst.y); + asuint(a.y, dst.z, dst.w); + } +#endif + 0x43425844, 0x23e20252, 0xf4d2708e, 0x87956944, 0xc61e7052, 0x00000001, 0x00000100, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x000000f0, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000074, 0x00000050, + 0x0000001d, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x0b0000bf, 0x001000f2, 0x00000000, 0x00208446, 0x00000000, + 0x00000000, 0x00005002, 0x41500000, 0x3ff00000, 0x40a00000, 0x40000000, 0x05000036, 0x001020f2, + 0x00000000, 0x00100e46, 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_dadd = {"dadd", ps_dadd_code, sizeof(ps_dadd_code)}; + static const DWORD ps_dmin_dmax_code[] = + { +#if 0 + double2 src0; + + void main(out uint4 dst : SV_Target) + { + asuint(min(src0.x, src0.y), dst.x, dst.y); + asuint(max(src0.x, src0.y), dst.z, dst.w); + } +#endif + 0x43425844, 0x6f8b547e, 0x3552757c, 0x92a81fa1, 0x00990b21, 0x00000001, 0x00000130, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000120, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x000000a4, 0x00000050, + 0x00000029, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x090000c1, 0x00100032, 0x00000000, 0x00208ee6, 0x00000000, + 0x00000000, 0x00208446, 0x00000000, 0x00000000, 0x05000036, 0x00102032, 0x00000000, 0x00100046, + 0x00000000, 0x090000c0, 0x00100032, 0x00000000, 0x00208ee6, 0x00000000, 0x00000000, 0x00208446, + 0x00000000, 0x00000000, 0x05000036, 0x001020c2, 0x00000000, 0x00100406, 0x00000000, 0x0100003e, + 0x30494653, 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_dmin_dmax = {"dmin_dmax", ps_dmin_dmax_code, sizeof(ps_dmin_dmax_code)}; + static const DWORD ps_dmovc_code[] = + { +#if 0 + double src0; + + void main(out uint4 dst : SV_Target) + { + asuint(src0 > 1.0 ? src0 : 4.5, dst.x, dst.y); + dst.zw = 0; + } +#endif + 0x43425844, 0x43c017c3, 0x117edcff, 0xd44d42dc, 0xb3affdd5, 0x00000001, 0x00000154, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000144, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x000000c8, 0x00000050, + 0x00000032, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x0b0000c5, 0x00100012, 0x00000000, 0x00005002, 0x00000000, + 0x3ff00000, 0x00000000, 0x00000000, 0x00208446, 0x00000000, 0x00000000, 0x0d0000c8, 0x00100032, + 0x00000000, 0x00100006, 0x00000000, 0x00208446, 0x00000000, 0x00000000, 0x00005002, 0x00000000, + 0x40120000, 0x00000000, 0x00000000, 0x05000036, 0x00102032, 0x00000000, 0x00100046, 0x00000000, + 0x08000036, 0x001020c2, 0x00000000, 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0100003e, 0x30494653, 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_dmovc = {"dmovc", ps_dmovc_code, sizeof(ps_dmovc_code)}; + static const DWORD ps_dmodifier_code[] = + { + /* Already tested negation in the dmov test. */ +#if 0 + double src0; + + void main(out uint4 dst : SV_Target) + { + asuint(abs(src0), dst.x, dst.y); + asuint(saturate(src0) + 1.5, dst.z, dst.w); + } +#endif + 0x43425844, 0x15bb537e, 0x47ef3ae3, 0xba88acf7, 0x0b3624e0, 0x00000001, 0x00000144, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000134, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x000000b8, 0x00000050, + 0x0000002e, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x060020c7, 0x00100032, 0x00000000, 0x00208446, 0x00000000, + 0x00000000, 0x0a0000bf, 0x00100032, 0x00000000, 0x00100446, 0x00000000, 0x00005002, 0x00000000, + 0x3ff80000, 0x00000000, 0x00000000, 0x05000036, 0x001020c2, 0x00000000, 0x00100406, 0x00000000, + 0x070000c7, 0x00100032, 0x00000000, 0x80208446, 0x00000081, 0x00000000, 0x00000000, 0x05000036, + 0x00102032, 0x00000000, 0x00100046, 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000001, + 0x00000000, + }; + static struct named_shader ps_dmodifier = {"dmodifier", ps_dmodifier_code, sizeof(ps_dmodifier_code)}; + static const DWORD ps_deq_code[] = + { +#if 0 + double2 src0; + + void main(out uint4 dst : SV_Target) + { + dst = (uint4)0; + if (src0.x == src0.y) + dst.x = 0xffffffff; + } +#endif + 0x43425844, 0x24c9cee6, 0xd38c521f, 0xcde7c8b6, 0xc173a8e3, 0x00000001, 0x00000118, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000108, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x0000008c, 0x00000050, + 0x00000023, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x090000c3, 0x00100012, 0x00000000, 0x00208ee6, 0x00000000, + 0x00000000, 0x00208446, 0x00000000, 0x00000000, 0x05000036, 0x00102012, 0x00000000, 0x0010000a, + 0x00000000, 0x08000036, 0x001020e2, 0x00000000, 0x00004002, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_deq = {"deq", ps_deq_code, sizeof(ps_deq_code)}; + static const DWORD ps_dne_code[] = + { +#if 0 + double2 src0; + + void main(out uint4 dst : SV_Target) + { + dst = (uint4)0; + if (src0.x != src0.y) + dst.x = 0xffffffff; + } +#endif + 0x43425844, 0x99700929, 0x3b743000, 0xdfc89958, 0xfc2b89ab, 0x00000001, 0x00000118, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000108, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x0000008c, 0x00000050, + 0x00000023, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x090000c6, 0x00100012, 0x00000000, 0x00208ee6, 0x00000000, + 0x00000000, 0x00208446, 0x00000000, 0x00000000, 0x05000036, 0x00102012, 0x00000000, 0x0010000a, + 0x00000000, 0x08000036, 0x001020e2, 0x00000000, 0x00004002, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_dne = {"dne", ps_dne_code, sizeof(ps_dne_code)}; + static const DWORD ps_dtou_code[] = + { +#if 0 + double src0; + + void main(out uint4 dst : SV_Target) + { + dst = uint4(src0, -src0, 0, 0); + } +#endif + 0x43425844, 0x6ca74abd, 0xe970e02d, 0xa65b35db, 0xd2f58586, 0x00000001, 0x00000128, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000118, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x0000009c, 0x00000050, + 0x00000027, 0x0102186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x060000d7, 0x00100012, 0x00000000, 0x00208446, 0x00000000, + 0x00000000, 0x070000d7, 0x00100022, 0x00000000, 0x80208446, 0x00000041, 0x00000000, 0x00000000, + 0x05000036, 0x00102032, 0x00000000, 0x00100046, 0x00000000, 0x08000036, 0x001020c2, 0x00000000, + 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0100003e, 0x30494653, 0x00000008, + 0x00000021, 0x00000000, + }; + static struct named_shader ps_dtou = {"dtou", ps_dtou_code, sizeof(ps_dtou_code)}; + static const DWORD ps_dtoi_code[] = + { +#if 0 + double src0; + + void main(out uint4 dst : SV_Target) + { + dst = int4(src0, -src0, 0, 0); + } +#endif + 0x43425844, 0x38d82727, 0x8666b36c, 0x91954b7e, 0xf376163a, 0x00000001, 0x00000128, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000118, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x0000009c, 0x00000050, + 0x00000027, 0x0102186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x060000d6, 0x00100012, 0x00000000, 0x00208446, 0x00000000, + 0x00000000, 0x070000d6, 0x00100022, 0x00000000, 0x80208446, 0x00000041, 0x00000000, 0x00000000, + 0x05000036, 0x00102032, 0x00000000, 0x00100046, 0x00000000, 0x08000036, 0x001020c2, 0x00000000, + 0x00004002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0100003e, 0x30494653, 0x00000008, + 0x00000021, 0x00000000, + }; + static const struct named_shader ps_dtoi = {"dtoi", ps_dtoi_code, sizeof(ps_dtoi_code)}; + static const DWORD ps_ftod_code[] = + { +#if 0 + float2 src0; + + void main(out uint4 dst : SV_Target) + { + double2 a = double2(src0.x, src0.y); + asuint(a.x, dst.x, dst.y); + asuint(a.y, dst.z, dst.w); + } +#endif + 0x43425844, 0xad43f67d, 0x04a1aba0, 0x253502f1, 0x2c9c1735, 0x00000001, 0x000000ec, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x000000dc, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000060, 0x00000050, + 0x00000018, 0x0100186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x060000ca, 0x001000f2, 0x00000000, 0x00208046, 0x00000000, + 0x00000000, 0x05000036, 0x001020f2, 0x00000000, 0x00100e46, 0x00000000, 0x0100003e, 0x30494653, + 0x00000008, 0x00000001, 0x00000000, + }; + static struct named_shader ps_ftod = {"ftod", ps_ftod_code, sizeof(ps_ftod_code)}; + static const DWORD ps_ddiv_code[] = + { +#if 0 + double2 src0; + + void main(out uint4 dst : SV_Target) + { + asuint(src0.x / src0.y, dst.x, dst.y); + dst.zw = 0; + } +#endif + 0x43425844, 0x1c8a3236, 0x400a6b3b, 0x5554bf56, 0x4ff834b8, 0x00000001, 0x00000118, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x00000108, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x0000008c, 0x00000050, + 0x00000023, 0x0102186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x090000d2, 0x00100032, 0x00000000, 0x00208446, 0x00000000, + 0x00000000, 0x00208ee6, 0x00000000, 0x00000000, 0x05000036, 0x00102032, 0x00000000, 0x00100046, + 0x00000000, 0x08000036, 0x001020c2, 0x00000000, 0x00004002, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x0100003e, 0x30494653, 0x00000008, 0x00000021, 0x00000000, + }; + static const struct named_shader ps_ddiv = {"ddiv", ps_ddiv_code, sizeof(ps_ddiv_code)}; + static const DWORD ps_drcp_code[] = + { +#if 0 + double2 src0; + + void main(out uint4 dst : SV_Target) + { + double2 a = rcp(src0); + asuint(a.x, dst.x, dst.y); + asuint(a.y, dst.z, dst.w); + } +#endif + 0x43425844, 0xdcbd25ba, 0x2d5cccb9, 0x84ed8028, 0x3d62632a, 0x00000001, 0x000000ec, 0x00000004, + 0x00000030, 0x00000040, 0x00000074, 0x000000dc, 0x4e475349, 0x00000008, 0x00000000, 0x00000008, + 0x4e47534f, 0x0000002c, 0x00000001, 0x00000008, 0x00000020, 0x00000000, 0x00000000, 0x00000001, + 0x00000000, 0x0000000f, 0x545f5653, 0x65677261, 0xabab0074, 0x58454853, 0x00000060, 0x00000050, + 0x00000018, 0x0102186a, 0x04000059, 0x00208e46, 0x00000000, 0x00000001, 0x03000065, 0x001020f2, + 0x00000000, 0x02000068, 0x00000001, 0x060000d4, 0x001000f2, 0x00000000, 0x00208e46, 0x00000000, + 0x00000000, 0x05000036, 0x001020f2, 0x00000000, 0x00100e46, 0x00000000, 0x0100003e, 0x30494653, + 0x00000008, 0x00000021, 0x00000000, + }; + static struct named_shader ps_drcp = {"drcp", ps_drcp_code, sizeof(ps_drcp_code)}; static const struct { const struct named_shader *ps; @@ -9290,13 +9583,21 @@ static void test_shader_instructions(void) struct vec4 src1; struct vec4 src2; } f; + struct + { + struct dvec2 src0; + struct dvec2 src1; + struct dvec2 src2; + } d; } input; union { struct uvec4 u; struct ivec4 i; struct vec4 f; + struct dvec2 d; } output; + bool is_float64; bool skip_on_warp; } uint_tests[] = @@ -9526,6 +9827,29 @@ static void test_shader_instructions(void) {&ps_movc, {{{0, 1, 1, 0}, {1, 2, 3, 4}, {5, 6, 7, 8}}}, {{5, 2, 3, 8}}}, {&ps_movc, {{{1, 1, 1, 1}, {1, 2, 3, 4}, {5, 6, 7, 8}}}, {{1, 2, 3, 4}}},
+ {&ps_dmov, {.d = {{2.5 + 1.0e-9, -3.5 - 1.0e-9}}}, {.d = {3.5 + 1.0e-9, -2.5 - 1.0e-9}}, true}, + {&ps_dadd, {.d = {{2.5, 0.0}}}, {.d = {2.5 + 1.0000002433080226, 2.5 + 2.000000481493771}}, true}, + {&ps_dmin_dmax, {.d = {{-1.0, 1.0}}}, {.d = {-1.0, 1.0}}, true}, + {&ps_dmovc, {.d = {{0.5, 0.0}}}, {.d = {4.5}}, true}, + {&ps_dmovc, {.d = {{1.5, 0.0}}}, {.d = {1.5}}, true}, + {&ps_dmodifier, {.d = {{1.5, 0.0}}}, {.d = {1.5f, 2.5f}}, true}, + {&ps_dmodifier, {.d = {{-1.5, 0.0}}}, {.d = {1.5f, 1.5f}}, true}, + {&ps_deq, {.d = {{0.0, 0.0}}}, {{0xffffffff}}, true}, + {&ps_deq, {.d = {{1.0, 0.0}}}, {{0x00000000}}, true}, + {&ps_dne, {.d = {{0.0, 0.0}}}, {{0x00000000}}, true}, + {&ps_dne, {.d = {{1.0, 0.0}}}, {{0xffffffff}}, true}, + {&ps_dtou, {.d = {{ -NAN}}}, {{ 0, 0 }}, true}, + {&ps_dtou, {.d = {{ NAN}}}, {{ 0, 0 }}, true}, + {&ps_dtou, {.d = {{-INFINITY}}}, {{ 0, ~0u}}, true}, + {&ps_dtou, {.d = {{ INFINITY}}}, {{~0u, 0 }}, true}, + {&ps_dtou, {.d = {{ -1.0}}}, {{ 0, 1 }}, true}, + {&ps_dtou, {.d = {{ 1.0}}}, {{ 1, 0 }}, true}, + {&ps_dtoi, {.d = {{ 1.0}}}, {.i = {1, -1}}, true}, + {&ps_ftod, {.f = {{-2.5f, 2.5f}}}, {.d = {-2.5, 2.5}}, true}, + {&ps_ddiv, {.d = {{ 2.0, 4.0}}}, {.d = {0.5}}, true}, + {&ps_ddiv, {.d = {{ 2.0, -4.0}}}, {.d = {-0.5}}, true}, + {&ps_drcp, {.d = {{ 2.0, -0.5}}}, {.d = {0.5, -2.0}}, true}, + { &ps_swapc0, {{{0, 0, 0, 0}, {0xdead, 0xc0de, 0xffff, 0xeeee}, {0xaaaa, 0xbbbb, 0xcccc, 0xdddd}}}, @@ -9818,6 +10142,8 @@ static void test_shader_instructions(void) return; command_list = context.list; queue = context.queue; + /* Float64 instructions are not supported and pipeline state creation will fail. */ + test_shader_float64 = is_shader_float64_supported(context.device) && vkd3d_test_platform_is_windows();
context.root_signature = create_cb_root_signature(context.device, 0, D3D12_SHADER_VISIBILITY_PIXEL, D3D12_ROOT_SIGNATURE_FLAG_NONE); @@ -9888,6 +10214,12 @@ static void test_shader_instructions(void) continue; }
+ if (uint_tests[i].is_float64 && !test_shader_float64) + { + skip("Skipping shader '%s' float64 test.\n", uint_tests[i].ps->name); + continue; + } + if (current_ps != uint_tests[i].ps) { if (context.pipeline_state)