diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 59ac84e9e..771cbb36e 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1825,6 +1825,35 @@ static enum vkd3d_result vsir_program_lower_texldl(struct vsir_program *program, return VKD3D_OK; } +static enum vkd3d_result vsir_program_lower_tex(struct vsir_program *program, struct vkd3d_shader_instruction *ins) +{ + unsigned int idx = ins->dst[0].reg.idx[0].offset; + struct vkd3d_shader_src_param *srcs; + + /* tex t# -> sample t#, t#, resource#, sampler# + * Note that the t# destination will subsequently be turned into a temp. */ + + /* We run before I/O normalization. */ + VKD3D_ASSERT(program->normalisation_level < VSIR_NORMALISED_SM6); + + if (!(srcs = shader_src_param_allocator_get(&program->instructions.src_params, 3))) + return VKD3D_ERROR_OUT_OF_MEMORY; + + vsir_src_param_init(&srcs[0], VKD3DSPR_TEXTURE, VSIR_DATA_F32, 1); + srcs[0].reg.idx[0].offset = idx; + srcs[0].reg.dimension = VSIR_DIMENSION_VEC4; + srcs[0].swizzle = VKD3D_SHADER_NO_SWIZZLE; + + vsir_src_param_init_resource(&srcs[1], idx, idx); + vsir_src_param_init_sampler(&srcs[2], idx, idx); + + ins->opcode = VSIR_OP_SAMPLE; + ins->src = srcs; + ins->src_count = 3; + + return VKD3D_OK; +} + static enum vkd3d_result vsir_program_lower_dcl_input(struct vsir_program *program, struct vkd3d_shader_instruction *ins, struct vsir_transformation_context *ctx) { @@ -1925,6 +1954,10 @@ static enum vkd3d_result vsir_program_lower_d3dbc_instructions(struct vsir_progr ret = vsir_program_lower_texkill(program, &it, &tmp_idx); break; + case VSIR_OP_TEX: + ret = vsir_program_lower_tex(program, ins); + break; + case VSIR_OP_TEXLD: if (program->shader_version.major == 1) ret = vsir_program_lower_texld_sm1(program, ins, message_context); diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index b15dcf659..9a7397f2d 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -1524,7 +1524,6 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte if (context->cf_info_count) context->cf_info[context->cf_info_count - 1].inside_block = false; break; - case VSIR_OP_TEX: case VSIR_OP_TEXBEM: case VSIR_OP_TEXBEML: case VSIR_OP_TEXDP3TEX: diff --git a/tests/hlsl/ps1-sampler.shader_test b/tests/hlsl/ps1-sampler.shader_test index 8f1208d22..850798d10 100644 --- a/tests/hlsl/ps1-sampler.shader_test +++ b/tests/hlsl/ps1-sampler.shader_test @@ -16,6 +16,20 @@ void main(inout float4 pos : position, out float4 tex : texcoord) tex = pos + 0.75; } +[pixel shader d3dbc-hex] +% TODO: Convert to assembly or HLSL. +ffff0101 % ps_1_1 +00000042 b00f0000 % tex t0 +00000001 800f0000 b0e40000 % mov r0, t0 +0000ffff % end + +[test] +draw quad +probe (320, 240) f32(1, 1, 1, 0) +probe (480, 240) f32(1, 0, 1, 0) +probe (320, 360) f32(1, 1, 0, 0) +probe (480, 360) f32(1, 0, 0, 0) + [pixel shader d3dbc-hex] % TODO: Convert to assembly or HLSL. ffff0104 % ps_1_4