Module: vkd3d Branch: master Commit: 177ea3bcbde9bbe6456c8fd2a872fc5ee6884b1b URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/177ea3bcbde9bbe6456c8fd2a872fc...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Sep 11 12:23:04 2023 +0200
vkd3d-shader/hlsl: Produce 2D resource declarations and loads for tex1D().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
libs/vkd3d-shader/hlsl.y | 37 +++++++++++++++++++++++++++++++- tests/hlsl/combined-samplers.shader_test | 6 +++--- 2 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 67fd9f6f..fb6d485e 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -3457,7 +3457,42 @@ static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer *
if (!(coords = add_implicit_conversion(ctx, params->instrs, params->args[1], hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, hlsl_sampler_dim_count(dim)), loc))) - coords = params->args[1]; + { + return false; + } + + /* tex1D() functions never produce 1D resource declarations. For newer profiles half offset + is used for the second coordinate, while older ones appear to replicate first coordinate.*/ + if (dim == HLSL_SAMPLER_DIM_1D) + { + struct hlsl_ir_load *load; + struct hlsl_ir_node *half; + struct hlsl_ir_var *var; + unsigned int idx = 0; + + if (!(var = hlsl_new_synthetic_var(ctx, "coords", hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, 2), loc))) + return false; + + initialize_var_components(ctx, params->instrs, var, &idx, coords); + if (shader_profile_version_ge(ctx, 4, 0)) + { + if (!(half = hlsl_new_float_constant(ctx, 0.5f, loc))) + return false; + hlsl_block_add_instr(params->instrs, half); + + initialize_var_components(ctx, params->instrs, var, &idx, half); + } + else + initialize_var_components(ctx, params->instrs, var, &idx, coords); + + if (!(load = hlsl_new_var_load(ctx, var, loc))) + return false; + hlsl_block_add_instr(params->instrs, &load->node); + + coords = &load->node; + + dim = HLSL_SAMPLER_DIM_2D; + }
load_params.coords = coords; load_params.resource = params->args[0]; diff --git a/tests/hlsl/combined-samplers.shader_test b/tests/hlsl/combined-samplers.shader_test index 57644c26..465c11cb 100644 --- a/tests/hlsl/combined-samplers.shader_test +++ b/tests/hlsl/combined-samplers.shader_test @@ -121,7 +121,7 @@ float4 main() : sv_target }
-[pixel shader todo] +[pixel shader] sampler sam[2];
float4 main() : sv_target @@ -130,8 +130,8 @@ float4 main() : sv_target }
[test] -todo draw quad -todo probe all rgba (1, 1, 1, 11) +draw quad +probe all rgba (1, 1, 1, 11)
[require]