mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/d3dbc: Lower TEX instructions.
This commit is contained in:
committed by
Henri Verbeet
parent
b09a17ddde
commit
5706834b37
Notes:
Henri Verbeet
2025-09-17 12:56:28 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1688
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user