From 5ca51156e249688b4ddfebe4ffd1528e4e814500 Mon Sep 17 00:00:00 2001 From: Sviatoslav Peleshko Date: Tue, 4 Jun 2024 12:22:52 +0300 Subject: [PATCH] intel/elk: Actually retype integer sources of sampler message payload According to PRMs: "All parameters are of type IEEE_Float, except those in the The ld*, resinfo, and the offu, offv of the gather4_po[_c] instruction message types, which are of type signed integer." Currently, we load parameters with the correct types, but use them as send sources with the default float type, which may confuse passes downstream. Fix this by actually storing the retyped sources. Cc: mesa-stable Signed-off-by: Sviatoslav Peleshko Reviewed-by: Sagar Ghuge Part-of: --- .../compiler/elk/elk_lower_logical_sends.cpp | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/intel/compiler/elk/elk_lower_logical_sends.cpp b/src/intel/compiler/elk/elk_lower_logical_sends.cpp index 9296aaf62bc..99f26733237 100644 --- a/src/intel/compiler/elk/elk_lower_logical_sends.cpp +++ b/src/intel/compiler/elk/elk_lower_logical_sends.cpp @@ -849,27 +849,29 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, elk_fs_inst *inst, elk_op coordinate_done = true; break; case ELK_SHADER_OPCODE_TXS: - bld.MOV(retype(sources[length], payload_unsigned_type), lod); - length++; + sources[length] = retype(sources[length], payload_unsigned_type); + bld.MOV(sources[length++], lod); break; case ELK_SHADER_OPCODE_IMAGE_SIZE_LOGICAL: /* We need an LOD; just use 0 */ - bld.MOV(retype(sources[length], payload_unsigned_type), elk_imm_ud(0)); - length++; + sources[length] = retype(sources[length], payload_unsigned_type); + bld.MOV(sources[length++], elk_imm_ud(0)); break; case ELK_SHADER_OPCODE_TXF: case ELK_SHADER_OPCODE_TXF_LZ: /* Unfortunately, the parameters for LD are intermixed: u, lod, v, r. */ - bld.MOV(retype(sources[length++], payload_signed_type), coordinate); + sources[length] = retype(sources[length], payload_signed_type); + bld.MOV(sources[length++], coordinate); if (op != ELK_SHADER_OPCODE_TXF_LZ) { - bld.MOV(retype(sources[length], payload_signed_type), lod); - length++; + sources[length] = retype(sources[length], payload_signed_type); + bld.MOV(sources[length++], lod); } - for (unsigned i = 1; i < coord_components; i++) - bld.MOV(retype(sources[length++], payload_signed_type), - offset(coordinate, bld, i)); + for (unsigned i = 1; i < coord_components; i++) { + sources[length] = retype(sources[length], payload_signed_type); + bld.MOV(sources[length++], offset(coordinate, bld, i)); + } coordinate_done = true; break; @@ -881,7 +883,8 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, elk_fs_inst *inst, elk_op if (op == ELK_SHADER_OPCODE_TXF_UMS || op == ELK_SHADER_OPCODE_TXF_CMS || op == ELK_SHADER_OPCODE_TXF_CMS_W) { - bld.MOV(retype(sources[length++], payload_unsigned_type), sample_index); + sources[length] = retype(sources[length], payload_unsigned_type); + bld.MOV(sources[length++], sample_index); } /* Data from the multisample control surface. */ @@ -902,7 +905,8 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, elk_fs_inst *inst, elk_op * payload, we need to split 2-32bit register into 4-16-bit * payload. */ - bld.MOV(retype(sources[length++], payload_unsigned_type), + sources[length] = retype(sources[length], payload_unsigned_type); + bld.MOV(sources[length++], mcs.file == IMM ? mcs : offset(mcs, bld, i)); } } @@ -910,9 +914,10 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, elk_fs_inst *inst, elk_op /* There is no offsetting for this message; just copy in the integer * texture coordinates. */ - for (unsigned i = 0; i < coord_components; i++) - bld.MOV(retype(sources[length++], payload_signed_type), - offset(coordinate, bld, i)); + for (unsigned i = 0; i < coord_components; i++) { + sources[length] = retype(sources[length], payload_signed_type); + bld.MOV(sources[length++], offset(coordinate, bld, i)); + } coordinate_done = true; break; @@ -921,9 +926,10 @@ lower_sampler_logical_send_gfx7(const fs_builder &bld, elk_fs_inst *inst, elk_op for (unsigned i = 0; i < 2; i++) /* u, v */ bld.MOV(sources[length++], offset(coordinate, bld, i)); - for (unsigned i = 0; i < 2; i++) /* offu, offv */ - bld.MOV(retype(sources[length++], payload_signed_type), - offset(tg4_offset, bld, i)); + for (unsigned i = 0; i < 2; i++) { /* offu, offv */ + sources[length] = retype(sources[length], payload_signed_type); + bld.MOV(sources[length++], offset(tg4_offset, bld, i)); + } if (coord_components == 3) /* r if present */ bld.MOV(sources[length++], offset(coordinate, bld, 2));