intel/fs: keep track of new resource_intel information

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21645>
This commit is contained in:
Lionel Landwerlin
2023-01-13 12:26:01 +02:00
committed by Marge Bot
parent 86e9943b00
commit 3d0cc3f63b
4 changed files with 73 additions and 4 deletions

View File

@@ -175,6 +175,16 @@ struct bs_thread_payload : public thread_payload {
void load_shader_type(const brw::fs_builder &bld, fs_reg &dest) const;
};
struct brw_fs_bind_info {
bool valid;
bool bindless;
unsigned block;
unsigned set;
unsigned binding;
bblock_t *fs_block;
fs_inst *fs_inst_anchor;
};
/**
* The fragment shader front-end.
*
@@ -371,6 +381,8 @@ public:
nir_tex_instr *instr);
void nir_emit_jump(const brw::fs_builder &bld,
nir_jump_instr *instr);
bool get_nir_src_bindless(const nir_src &src);
unsigned get_nir_src_block(const nir_src &src);
fs_reg get_nir_src(const nir_src &src);
fs_reg get_nir_src_imm(const nir_src &src);
fs_reg get_nir_dest(const nir_dest &dest);
@@ -464,6 +476,7 @@ public:
fs_reg *nir_locals;
fs_reg *nir_ssa_values;
struct brw_fs_bind_info *nir_ssa_bind_infos;
fs_reg *nir_system_values;
bool failed;

View File

@@ -829,6 +829,12 @@ namespace brw {
return inst;
}
bblock_t *
get_block() const
{
return block;
}
backend_shader *shader;
private:

View File

@@ -319,6 +319,12 @@ fs_visitor::nir_emit_impl(nir_function_impl *impl)
nir_ssa_values = reralloc(mem_ctx, nir_ssa_values, fs_reg,
impl->ssa_alloc);
nir_ssa_bind_infos = reralloc(mem_ctx, nir_ssa_bind_infos,
struct brw_fs_bind_info,
impl->ssa_alloc);
memset(nir_ssa_bind_infos, 0,
sizeof(nir_ssa_bind_infos[0]) * impl->ssa_alloc);
nir_emit_cf_list(&impl->body);
}
@@ -1945,6 +1951,24 @@ fs_visitor::nir_emit_load_const(const fs_builder &bld,
nir_ssa_values[instr->def.index] = reg;
}
bool
fs_visitor::get_nir_src_bindless(const nir_src &src)
{
assert(src.is_ssa);
return nir_ssa_bind_infos[src.ssa->index].bindless;
}
unsigned
fs_visitor::get_nir_src_block(const nir_src &src)
{
assert(src.is_ssa);
return nir_ssa_bind_infos[src.ssa->index].valid ?
nir_ssa_bind_infos[src.ssa->index].block :
UINT32_MAX;
}
fs_reg
fs_visitor::get_nir_src(const nir_src &src)
{
@@ -3937,12 +3961,19 @@ fs_visitor::get_nir_ssbo_intrinsic_index(const brw::fs_builder &bld,
const bool is_store =
instr->intrinsic == nir_intrinsic_store_ssbo ||
instr->intrinsic == nir_intrinsic_store_ssbo_block_intel;
const unsigned src = is_store ? 1 : 0;
nir_src src = is_store ? instr->src[1] : instr->src[0];
if (nir_src_is_const(instr->src[src])) {
return brw_imm_ud(nir_src_as_uint(instr->src[src]));
if (src.is_ssa && src.ssa->parent_instr->type == nir_instr_type_intrinsic) {
nir_intrinsic_instr *intrin =
nir_instr_as_intrinsic(src.ssa->parent_instr);
if (intrin->intrinsic == nir_intrinsic_resource_intel)
src = intrin->src[1];
}
if (nir_src_is_const(src)) {
return brw_imm_ud(nir_src_as_uint(src));
} else {
return bld.emit_uniformize(get_nir_src(instr->src[src]));
return bld.emit_uniformize(get_nir_src(src));
}
}
@@ -4094,6 +4125,24 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
dest = get_nir_dest(instr->dest);
switch (instr->intrinsic) {
case nir_intrinsic_resource_intel:
nir_ssa_bind_infos[instr->dest.ssa.index].valid = true;
nir_ssa_bind_infos[instr->dest.ssa.index].bindless =
(nir_intrinsic_resource_access_intel(instr) &
nir_resource_intel_bindless) != 0;
nir_ssa_bind_infos[instr->dest.ssa.index].block =
nir_intrinsic_resource_block_intel(instr);
nir_ssa_bind_infos[instr->dest.ssa.index].set =
nir_intrinsic_desc_set(instr);
nir_ssa_bind_infos[instr->dest.ssa.index].binding =
nir_intrinsic_binding(instr);
nir_ssa_bind_infos[instr->dest.ssa.index].fs_block =
bld.get_block();
nir_ssa_bind_infos[instr->dest.ssa.index].fs_inst_anchor =
bld.MOV(retype(dest, BRW_REGISTER_TYPE_UD),
retype(get_nir_src(instr->src[1]), BRW_REGISTER_TYPE_UD));
break;
case nir_intrinsic_image_load:
case nir_intrinsic_image_store:
case nir_intrinsic_image_atomic:

View File

@@ -1414,6 +1414,7 @@ fs_visitor::init()
this->nir_locals = NULL;
this->nir_ssa_values = NULL;
this->nir_ssa_bind_infos = NULL;
this->nir_system_values = NULL;
this->payload_ = NULL;