From 2b31efe03ac07212cf99718a9aceb5355b6f7b08 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Sun, 23 Nov 2025 01:12:00 +0100 Subject: [PATCH] tests/d3dbc: Add some tests for nrm instructions. These are adapted from Wine's test_nrm_instruction() d3d9 test by Paul Gofman. --- Makefile.am | 1 + tests/d3dbc/nrm.shader_test | 142 ++++++++++++++++++++++++++++++++++++ tests/shader_runner.c | 10 ++- 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 tests/d3dbc/nrm.shader_test diff --git a/Makefile.am b/Makefile.am index 32cf9b9f7..0988c5db9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -52,6 +52,7 @@ vkd3d_cross_tests = \ tests/hlsl_d3d12 vkd3d_shader_tests = \ + tests/d3dbc/nrm.shader_test \ tests/hlsl/abs.shader_test \ tests/hlsl/all.shader_test \ tests/hlsl/alpha-test.shader_test \ diff --git a/tests/d3dbc/nrm.shader_test b/tests/d3dbc/nrm.shader_test new file mode 100644 index 000000000..c0305a1f3 --- /dev/null +++ b/tests/d3dbc/nrm.shader_test @@ -0,0 +1,142 @@ +[require] +shader model = 3.0 + +[vertex shader d3dbc-hex] +fffe0300 % vs_3_0 +05000051 a00f0000 00000000 3f800000 3e99999a 3f000000 % def c0, 0.0, 1.0, 0.3, 0.5 +0200001f 80000000 900f0000 % dcl_position v0 +0200001f 80000000 e00f0000 % dcl_position o0 +0200001f 80000005 e00f0001 % dcl_texcoord0 o1 +0200001f 80010005 e00f0002 % dcl_texcoord1 o2 +0200001f 80020005 e00f0003 % dcl_texcoord2 o3 +02000001 e00f0000 90e40000 % mov o0, v0 +02000001 e00f0001 a0450000 % mov o1, c0.yyxy +02000001 e00f0002 a0e40000 % mov o2, c0 +02000024 800f0000 a0e40000 % nrm r0, c0 +02000001 e00f0003 80e40000 % mov o3, r0 +0000ffff % end + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80000005 90070001 % dcl_texcoord0 v0.xyz +02000024 800f0000 90e40001 % nrm r0, v0 +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(.707106769, .707106769, 0, .707106769) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80000005 90070000 % dcl_texcoord0 v0.xyz +02000001 800f0000 a0e40000 % mov r0, c0 +02000024 80070000 90e40000 % nrm r0.xyz, v0 +02000001 80040000 80ff0000 % mov r0.z, r0.w +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +uniform 0 float4 .1 .1 .1 .1 +todo draw quad +probe (320, 240) f32(.707106769, .707106769, .1, .1) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80010005 900f0000 % dcl_texcoord1 v0.xyzw +02000024 800f0000 90e40000 % nrm r0, v0 +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(0, .957826257, .287347883, .478913128) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80020005 900f0000 % dcl_texcoord2 v0.xyzw +02000001 800f0000 90e40000 % mov r0, v0 +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(0, .957826257, .287347883, .478913128) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80010005 900f0000 % dcl_texcoord1 v0.xyzw +02000001 800f0000 a0e40000 % mov r0, c0 +02000024 80070000 90e40000 % nrm r0.xyz, v0 +02000001 80040000 80ff0000 % mov r0.z, r0.w +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(0, .957826257, .1, .1) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80010005 900f0000 % dcl_texcoord1 v0.xyzw +02000001 800f0000 a0e40000 % mov r0, c0 +02000024 800f0000 90540000 % nrm r0, v0.xy +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(0, .707106769, .707106769, .707106769) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80010005 900f0000 % dcl_texcoord1 v0.xyzw +02000001 800f0000 a0e40000 % mov r0, c0 +02000024 80070000 90fd0000 % nrm r0.xyz, v0.yw +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(.816496611, .408248276, .408248276, .1) 1 + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +0200001f 80010005 90030000 % dcl_texcoord1 v0.xy +02000001 800f0000 a0e40000 % mov r0, c0 +02000024 800f0000 90540000 % nrm r0, v0 +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +todo draw quad +probe (320, 240) f32(0, .707106769, .707106769, .707106769) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +02000024 800f0000 a0e40000 % nrm r0, c0 +02000001 80040000 80ff0000 % mov r0.z, r0.w +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +uniform 0 float4 0 0 0 0 +todo draw quad +probe (320, 240) f32(0, 0, 0, 0) +uniform 0 float4 2.0 0.0 0.0 0.5 +todo draw quad +probe (320, 240) f32(1.0, 0.0, .25, .25) +uniform 0 float4 1.0 1.0 1.0 1.0 +todo draw quad +probe (320, 240) f32(.577350259, .577350259, .577350259, .577350259) + +[pixel shader d3dbc-hex] +ffff0300 % ps_3_0 +02000024 800f0000 a0390000 % nrm r0, c0.yzwx +02000001 800f0800 80e40000 % mov oC0, r0 +0000ffff % end + +[test] +uniform 0 float4 1.0 1.0 0.0 2.0 +todo draw quad +probe (320, 240) f32(.447213590, 0, .894427180, .447213590) diff --git a/tests/shader_runner.c b/tests/shader_runner.c index b2ef8c77b..4d31fbaea 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -429,6 +429,7 @@ format_info[] = {"r32g32b32a32-float", 16, DXGI_FORMAT_R32G32B32A32_FLOAT}, {"r32g32b32a32-sint", 16, DXGI_FORMAT_R32G32B32A32_SINT}, {"r32g32b32a32-uint", 16, DXGI_FORMAT_R32G32B32A32_UINT}, + {"r32g32b32-float", 12, DXGI_FORMAT_R32G32B32_FLOAT}, {"r32g32-float", 8, DXGI_FORMAT_R32G32_FLOAT}, {"r32g32-sint", 8, DXGI_FORMAT_R32G32_SINT}, {"r32g32-uint", 8, DXGI_FORMAT_R32G32_UINT}, @@ -510,16 +511,23 @@ static void parse_require_directive(struct shader_runner *runner, const char *li { enum shader_cap shader_cap; bool less_than = false; + bool equal = false; unsigned int i; if (match_string(line, "shader model >=", &line) + || (equal = match_string(line, "shader model =", &line)) || (less_than = match_string(line, "shader model <", &line))) { for (i = 0; i < ARRAY_SIZE(sm_strings_dot); ++i) { if (match_string(line, sm_strings_dot[i], &line)) { - if (less_than) + if (equal) + { + runner->maximum_shader_model = min(runner->maximum_shader_model, i); + runner->minimum_shader_model = max(runner->minimum_shader_model, i); + } + else if (less_than) { if (!i) fatal_error("Shader model < '%s' is invalid.\n", line);