intel/compiler/xe2: Emit texture instructions w/ combined LOD and array index
The extra assertions are just there to help validate pack_lod_and_array_index (in nir_lower_tex.c). v2: Split got_lod_or_bias into two variables. This simplifies some changes that Sagar is working on. Suggested by Sagar. Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27305>
This commit is contained in:
@@ -8018,12 +8018,17 @@ fs_nir_emit_texture(nir_to_brw_state &ntb,
|
|||||||
if (instr->sampler_dim == GLSL_SAMPLER_DIM_BUF)
|
if (instr->sampler_dim == GLSL_SAMPLER_DIM_BUF)
|
||||||
srcs[TEX_LOGICAL_SRC_LOD] = brw_imm_d(0);
|
srcs[TEX_LOGICAL_SRC_LOD] = brw_imm_d(0);
|
||||||
|
|
||||||
|
ASSERTED bool got_lod = false;
|
||||||
|
ASSERTED bool got_bias = false;
|
||||||
uint32_t header_bits = 0;
|
uint32_t header_bits = 0;
|
||||||
for (unsigned i = 0; i < instr->num_srcs; i++) {
|
for (unsigned i = 0; i < instr->num_srcs; i++) {
|
||||||
nir_src nir_src = instr->src[i].src;
|
nir_src nir_src = instr->src[i].src;
|
||||||
fs_reg src = get_nir_src(ntb, nir_src);
|
fs_reg src = get_nir_src(ntb, nir_src);
|
||||||
switch (instr->src[i].src_type) {
|
switch (instr->src[i].src_type) {
|
||||||
case nir_tex_src_bias:
|
case nir_tex_src_bias:
|
||||||
|
assert(!got_lod);
|
||||||
|
got_bias = true;
|
||||||
|
|
||||||
srcs[TEX_LOGICAL_SRC_LOD] =
|
srcs[TEX_LOGICAL_SRC_LOD] =
|
||||||
retype(get_nir_src_imm(ntb, instr->src[i].src), BRW_REGISTER_TYPE_F);
|
retype(get_nir_src_imm(ntb, instr->src[i].src), BRW_REGISTER_TYPE_F);
|
||||||
break;
|
break;
|
||||||
@@ -8051,6 +8056,9 @@ fs_nir_emit_texture(nir_to_brw_state &ntb,
|
|||||||
srcs[TEX_LOGICAL_SRC_LOD2] = retype(src, BRW_REGISTER_TYPE_F);
|
srcs[TEX_LOGICAL_SRC_LOD2] = retype(src, BRW_REGISTER_TYPE_F);
|
||||||
break;
|
break;
|
||||||
case nir_tex_src_lod:
|
case nir_tex_src_lod:
|
||||||
|
assert(!got_bias);
|
||||||
|
got_lod = true;
|
||||||
|
|
||||||
switch (instr->op) {
|
switch (instr->op) {
|
||||||
case nir_texop_txs:
|
case nir_texop_txs:
|
||||||
srcs[TEX_LOGICAL_SRC_LOD] =
|
srcs[TEX_LOGICAL_SRC_LOD] =
|
||||||
@@ -8142,6 +8150,15 @@ fs_nir_emit_texture(nir_to_brw_state &ntb,
|
|||||||
srcs[TEX_LOGICAL_SRC_MCS] = retype(src, BRW_REGISTER_TYPE_D);
|
srcs[TEX_LOGICAL_SRC_MCS] = retype(src, BRW_REGISTER_TYPE_D);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case nir_tex_src_combined_lod_and_array_index_intel:
|
||||||
|
assert(!got_lod && !got_bias);
|
||||||
|
got_lod = true;
|
||||||
|
|
||||||
|
assert(instr->op == nir_texop_txl || instr->op == nir_texop_txb);
|
||||||
|
srcs[TEX_LOGICAL_SRC_LOD] =
|
||||||
|
retype(get_nir_src_imm(ntb, instr->src[i].src), BRW_REGISTER_TYPE_F);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
unreachable("unknown texture source");
|
unreachable("unknown texture source");
|
||||||
}
|
}
|
||||||
|
@@ -945,6 +945,7 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir,
|
|||||||
.lower_offset_filter =
|
.lower_offset_filter =
|
||||||
devinfo->verx10 >= 125 ? lower_xehp_tg4_offset_filter : NULL,
|
devinfo->verx10 >= 125 ? lower_xehp_tg4_offset_filter : NULL,
|
||||||
.lower_invalid_implicit_lod = true,
|
.lower_invalid_implicit_lod = true,
|
||||||
|
.pack_lod_and_array_index = devinfo->ver >= 20,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* In the case where TG4 coords are lowered to offsets and we have a
|
/* In the case where TG4 coords are lowered to offsets and we have a
|
||||||
|
Reference in New Issue
Block a user