From what I can tell, the recent work on SampleBias/SampleLevel did all of the work for us, we just need to take the same framework and include the case for the `sample_l` instruction.
Tested with some shaders from the native Linux version of Little Racers STREET.
-- v3: vkd3d-shader/tpf: Add support for emitting sample_l instructions tests: Add a test for SampleLevel() function.
From: Ethan Lee flibitijibibo@gmail.com
Currently marked TODO, since the SM4 emitter does not support sample_l yet.
Signed-off-by: Ethan Lee flibitijibibo@gmail.com --- tests/sampler.shader_test | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/tests/sampler.shader_test b/tests/sampler.shader_test index 2cb70a0b..89883029 100644 --- a/tests/sampler.shader_test +++ b/tests/sampler.shader_test @@ -33,6 +33,19 @@ float4 main() : sv_target draw quad probe all rgba (0.25, 0, 0.25, 0)
+[pixel shader todo] +SamplerState s; +Texture2D t; + +float4 main() : sv_target +{ + return t.SampleLevel(s, float2(0.5, 0.5), 0.0); +} + +[test todo] +draw quad +probe all rgba (0.25, 0, 0.25, 0) + [pixel shader] SamplerState s; Texture2D t;
From: Ethan Lee flibitijibibo@gmail.com
This gets the SampleLevel() HLSL test to pass.
Signed-off-by: Ethan Lee flibitijibibo@gmail.com --- libs/vkd3d-shader/tpf.c | 12 +++++++----- tests/sampler.shader_test | 4 ++-- 2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 3debe952..5d194709 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -3717,6 +3717,10 @@ static void write_sm4_sample(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer instr.opcode = VKD3D_SM4_OP_SAMPLE; break;
+ case HLSL_RESOURCE_SAMPLE_LOD: + instr.opcode = VKD3D_SM4_OP_SAMPLE_LOD; + break; + case HLSL_RESOURCE_SAMPLE_LOD_BIAS: instr.opcode = VKD3D_SM4_OP_SAMPLE_B; break; @@ -3743,7 +3747,8 @@ static void write_sm4_sample(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer sm4_src_from_deref(ctx, &instr.srcs[2], sampler, sampler->var->data_type, VKD3DSP_WRITEMASK_ALL); instr.src_count = 3;
- if (load->load_type == HLSL_RESOURCE_SAMPLE_LOD_BIAS) + if (load->load_type == HLSL_RESOURCE_SAMPLE_LOD + || load->load_type == HLSL_RESOURCE_SAMPLE_LOD_BIAS) { sm4_src_from_node(&instr.srcs[3], load->lod.node, VKD3DSP_WRITEMASK_ALL); ++instr.src_count; @@ -4515,6 +4520,7 @@ static void write_sm4_resource_load(struct hlsl_ctx *ctx, break;
case HLSL_RESOURCE_SAMPLE: + case HLSL_RESOURCE_SAMPLE_LOD: case HLSL_RESOURCE_SAMPLE_LOD_BIAS: if (!load->sampler.var) { @@ -4543,10 +4549,6 @@ static void write_sm4_resource_load(struct hlsl_ctx *ctx, write_sm4_gather(ctx, buffer, resource_type, &load->node, &load->resource, &load->sampler, coords, HLSL_SWIZZLE(W, W, W, W), texel_offset); break; - - case HLSL_RESOURCE_SAMPLE_LOD: - hlsl_fixme(ctx, &load->node.loc, "SM4 sample-LOD expression."); - break; } }
diff --git a/tests/sampler.shader_test b/tests/sampler.shader_test index 89883029..62c71b39 100644 --- a/tests/sampler.shader_test +++ b/tests/sampler.shader_test @@ -33,7 +33,7 @@ float4 main() : sv_target draw quad probe all rgba (0.25, 0, 0.25, 0)
-[pixel shader todo] +[pixel shader] SamplerState s; Texture2D t;
@@ -42,7 +42,7 @@ float4 main() : sv_target return t.SampleLevel(s, float2(0.5, 0.5), 0.0); }
-[test todo] +[test] draw quad probe all rgba (0.25, 0, 0.25, 0)
One last update before the weekend: While SampleLevel was supported by hlsl.y, the test did not exist yet, so that's been added as part of this fix.
Francisco Casas (@fcasas) commented about tests/sampler.shader_test:
draw quad probe all rgba (0.25, 0, 0.25, 0)
+[pixel shader todo] +SamplerState s; +Texture2D t;
+float4 main() : sv_target +{
- return t.SampleLevel(s, float2(0.5, 0.5), 0.0);
+}
+[test todo]
Currently, there doesn't exist a `[test todo]` Section for the shader_runner. This only seems to work (in this incomplete stage) because the shader_runner is handling the section the same as the previous one, `[pixel shader todo]`.
The proper way to write this part is: ``` [test] todo draw quad todo probe all rgba (0.25, 0, 0.25, 0) ```
and remove the `todo`s in the next commit.