From 948c4145f56e2adf2d9793e842ac42ea4a083096 Mon Sep 17 00:00:00 2001 From: Francisco Casas Date: Tue, 25 Jul 2023 04:46:54 -0400 Subject: [PATCH] tests: Test texture allocation ordering in complex scenarios. --- Makefile.am | 1 + tests/hlsl/texture-ordering.shader_test | 303 ++++++++++++++++++++++++ tests/shader_runner_d3d12.c | 4 +- 3 files changed, 306 insertions(+), 2 deletions(-) create mode 100644 tests/hlsl/texture-ordering.shader_test diff --git a/Makefile.am b/Makefile.am index 27738f3b..27087c8e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -168,6 +168,7 @@ vkd3d_shader_tests = \ tests/hlsl/texture-load-offset.shader_test \ tests/hlsl/texture-load-typed.shader_test \ tests/hlsl/texture-load.shader_test \ + tests/hlsl/texture-ordering.shader_test \ tests/hlsl/transpose.shader_test \ tests/hlsl/trigonometry.shader_test \ tests/hlsl/trunc.shader_test \ diff --git a/tests/hlsl/texture-ordering.shader_test b/tests/hlsl/texture-ordering.shader_test new file mode 100644 index 00000000..b28fea5d --- /dev/null +++ b/tests/hlsl/texture-ordering.shader_test @@ -0,0 +1,303 @@ +[require] +shader model >= 4.0 + +[sampler 0] +filter linear linear linear +address clamp clamp clamp + +[sampler 1] +filter linear linear linear +address clamp clamp clamp + +[sampler 2] +filter linear linear linear +address clamp clamp clamp + +[sampler 3] +filter linear linear linear +address clamp clamp clamp + +[sampler 4] +filter linear linear linear +address clamp clamp clamp + +[sampler 5] +filter linear linear linear +address clamp clamp clamp + +[sampler 6] +filter linear linear linear +address clamp clamp clamp + +[texture 0] +size (1, 1) +0.0 0.0 0.0 1.0 + +[texture 1] +size (1, 1) +1.0 1.0 1.0 1.0 + +[texture 2] +size (1, 1) +2.0 2.0 2.0 1.0 + +[texture 3] +size (1, 1) +3.0 3.0 3.0 1.0 + +[texture 4] +size (1, 1) +4.0 4.0 4.0 1.0 + +[texture 5] +size (1, 1) +5.0 5.0 5.0 1.0 + +[texture 6] +size (1, 1) +6.0 6.0 6.0 1.0 + +[texture 7] +size (1, 1) +7.0 7.0 7.0 1.0 + +[texture 8] +size (1, 1) +8.0 8.0 8.0 1.0 + +[texture 9] +size (1, 1) +9.0 9.0 9.0 1.0 + + +% Regarding resource allocation ordering in SM4, textures go in this order: +% 1. Textures created from SM1-style samples, in decreasing "bind count". +% In case there is a tie in the "bind count", the order is given by the order of appearance of +% the tex1D/tex2D/tex3D/texCube calls that create them. +% 2. Regular textures in order of declaration. +% +% Note that the "bind count" should not be confused with the "allocation size". +% +% The "bind count" appears in the RDEF table ("Count" row), and is determined by the last field +% actually used. +% The "allocation size" for textures affects the starting register id for the next resource in the +% table, and may be larger than the "bind count". + +[pixel shader] +// Name Type Format Dim HLSL Bind Count +// ------------------------------ ---------- ------- ----------- -------------- ------ +// sam_arr_10 sampler NA NA s0 1 +// sam_arr_01 sampler NA NA s1 2 +// sam_arr_11 sampler NA NA s3 2 +// samA sampler NA NA s5 1 +// samB sampler NA NA s6 1 +// sam_arr_11 texture float4 2d t0 2 +// sam_arr_01 texture float4 2d t2 2 +// samB texture float4 2d t4 1 +// sam_arr_10 texture float4 2d t5 1 +// samA texture float4 2d t6 1 +// tex texture float4 2d t7 1 +// texs texture float4 2d t8 2 + +Texture2D tex; +Texture2D texs[2]; +sampler samA; +sampler samB; +sampler sam_arr_10[2]; +sampler sam_arr_01[2]; +sampler sam_arr_11[2]; + +float4 main() : sv_target +{ + float4 f = 0, g = 0, h = 0, res; + + f += 100 * tex2D(samB, float2(0, 0)); + f += 10 * tex2D(sam_arr_10[0], float2(0, 0)); + f += 1 * tex2D(sam_arr_11[0], float2(0, 0)); + g += 100 * tex2D(sam_arr_11[1], float2(0, 0)); + g += 10 * tex2D(sam_arr_01[1], float2(0, 0)); + g += 1 * texs[1].Load(int3(0, 0, 0)); + h += 100 * texs[0].Load(int3(0, 0, 0)); + h += 10 * tex.Load(int3(0, 0, 0)); + h += 1 * tex2D(samA, float2(0, 0)); + + res.x = f.x; + res.y = g.x; + res.z = h.x; + res.w = f.w + g.w + h.w; + + return res; +} + +[test] +draw quad +todo probe all rgba (450, 139, 876, 333) + + +% Same as the first test, but inverting the declaration order. +% Regarding textures, only the allocation of those that are not created from samplers is affected. +[pixel shader] +// Name Type Format Dim HLSL Bind Count +// ------------------------------ ---------- ------- ----------- -------------- ------ +// sam_arr_11 sampler NA NA s0 2 +// sam_arr_01 sampler NA NA s2 2 +// sam_arr_10 sampler NA NA s4 1 +// samB sampler NA NA s5 1 +// samA sampler NA NA s6 1 +// sam_arr_11 texture float4 2d t0 2 +// sam_arr_01 texture float4 2d t2 2 +// samB texture float4 2d t4 1 +// sam_arr_10 texture float4 2d t5 1 +// samA texture float4 2d t6 1 +// texs texture float4 2d t7 2 +// tex texture float4 2d t9 1 + +sampler sam_arr_11[2]; +sampler sam_arr_01[2]; +sampler sam_arr_10[2]; +sampler samB; +sampler samA; +Texture2D texs[2]; +Texture2D tex; + +float4 main() : sv_target +{ + float4 f = 0, g = 0, h = 0, res; + + f += 100 * tex2D(samB, float2(0, 0)); + f += 10 * tex2D(sam_arr_10[0], float2(0, 0)); + f += 1 * tex2D(sam_arr_11[0], float2(0, 0)); + g += 100 * tex2D(sam_arr_11[1], float2(0, 0)); + g += 10 * tex2D(sam_arr_01[1], float2(0, 0)); + g += 1 * texs[1].Load(int3(0, 0, 0)); + h += 100 * texs[0].Load(int3(0, 0, 0)); + h += 10 * tex.Load(int3(0, 0, 0)); + h += 1 * tex2D(samA, float2(0, 0)); + + res.x = f.x; + res.y = g.x; + res.z = h.x; + res.w = f.w + g.w + h.w; + + return res; +} + +[test] +draw quad +todo probe all rgba (450, 138, 796, 333) + + +% Same as the first test, but inverting the resource loads order. +% Regarding textures, only the allocation of those that are created from samplers is affected. +[pixel shader] +// Name Type Format Dim HLSL Bind Count +// ------------------------------ ---------- ------- ----------- -------------- ------ +// sam_arr_10 sampler NA NA s0 1 +// sam_arr_01 sampler NA NA s1 2 +// sam_arr_11 sampler NA NA s3 2 +// samA sampler NA NA s5 1 +// samB sampler NA NA s6 1 +// sam_arr_01 texture float4 2d t0 2 +// sam_arr_11 texture float4 2d t2 2 +// samA texture float4 2d t4 1 +// sam_arr_10 texture float4 2d t5 1 +// samB texture float4 2d t6 1 +// tex texture float4 2d t7 1 +// texs texture float4 2d t8 2 + +Texture2D tex; +Texture2D texs[2]; +sampler samA; +sampler samB; +sampler sam_arr_10[2]; +sampler sam_arr_01[2]; +sampler sam_arr_11[2]; + +float4 main() : sv_target +{ + float4 f = 0, g = 0, h = 0, res; + + f += 100 * tex2D(samA, float2(0, 0)); + f += 10 * tex.Load(int3(0, 0, 0)); + f += 1 * texs[0].Load(int3(0, 0, 0)); + g += 100 * texs[1].Load(int3(0, 0, 0)); + g += 10 * tex2D(sam_arr_01[1], float2(0, 0)); + g += 1 * tex2D(sam_arr_11[1], float2(0, 0)); + h += 100 * tex2D(sam_arr_11[0], float2(0, 0)); + h += 10 * tex2D(sam_arr_10[0], float2(0, 0)); + h += 1 * tex2D(samB, float2(0, 0)); + + res.x = f.x; + res.y = g.x; + res.z = h.x; + res.w = f.w + g.w + h.w; + + return res; +} + +[test] +draw quad +todo probe all rgba (478, 913, 256, 333) + + +% We can conclude that for declared texture arrays, if they are used, the "allocation size" is the +% whole array. +% On the other hand, for textures generated from samplers. the "allocation size" is the "bind count". +[pixel shader] +// Name Type Format Dim HLSL Bind Count +// ------------------------------ ---------- ------- ----------- -------------- ------ +// sam_arr sampler NA NA s0 2 +// sam sampler NA NA s2 1 +// sam_arr texture float4 2d t0 2 +// texs texture float4 2d t2 1 +// tex texture float4 2d t5 1 + +sampler sam; + +Texture2D texs[3]; +sampler sam_arr[3]; +Texture2D tex; + +float4 main() : sv_target +{ + float4 res = 0; + + res += 100 * texs[0].Sample(sam, float2(0, 0)); + res += 10 * tex2D(sam_arr[1], float2(0, 0)); + res += 1 * tex.Sample(sam, float2(0, 0)); + return res; +} + +[test] +draw quad +todo probe all rgba (215, 215, 215, 111) + + +% Test that textures created from SM1-style samples allocation order is in decreasing "bind count". +[pixel shader] +// Name Type Format Dim HLSL Bind Count +// ------------------------------ ---------- ------- ----------- -------------- ------ +// tex_100 sampler NA NA s0 1 +// tex_010 sampler NA NA s1 2 +// tex_001 sampler NA NA s3 3 +// tex_001 texture float4 2d t0 3 +// tex_010 texture float4 2d t3 2 +// tex_100 texture float4 2d t5 1 +sampler tex_100[3]; +sampler tex_010[3]; +sampler tex_001[3]; + +float4 main() : sv_target +{ + float4 res; + + res.x = tex2D(tex_100[0], float2(0, 0)).x; + res.y = tex2D(tex_010[1], float2(0, 0)).x; + res.z = tex2D(tex_001[2], float2(0, 0)).x; + res.w = 0; + return res; +} + +[test] +draw quad +todo probe all rgba (5, 4, 2, 0) diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index daeb11e8..bdd47087 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -206,8 +206,8 @@ static ID3D12RootSignature *d3d12_runner_create_root_signature(struct d3d12_shad ID3D12GraphicsCommandList *command_list, unsigned int *uniform_index) { D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {0}; - D3D12_ROOT_PARAMETER root_params[8], *root_param; - D3D12_STATIC_SAMPLER_DESC static_samplers[5]; + D3D12_ROOT_PARAMETER root_params[17], *root_param; + D3D12_STATIC_SAMPLER_DESC static_samplers[7]; ID3D12RootSignature *root_signature; HRESULT hr; size_t i;