mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-30 20:10:24 +01:00
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 <sviatoslav.peleshko@globallogic.com>
Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29581>
(cherry picked from commit 5ca51156e2)
This commit is contained in:
parent
2ac76f13f9
commit
c22b115caa
2 changed files with 25 additions and 19 deletions
|
|
@ -3074,7 +3074,7 @@
|
|||
"description": "intel/elk: Actually retype integer sources of sampler message payload",
|
||||
"nominated": true,
|
||||
"nomination_type": 0,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": null,
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue