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; 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. * The fragment shader front-end.
* *
@@ -371,6 +381,8 @@ public:
nir_tex_instr *instr); nir_tex_instr *instr);
void nir_emit_jump(const brw::fs_builder &bld, void nir_emit_jump(const brw::fs_builder &bld,
nir_jump_instr *instr); 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(const nir_src &src);
fs_reg get_nir_src_imm(const nir_src &src); fs_reg get_nir_src_imm(const nir_src &src);
fs_reg get_nir_dest(const nir_dest &dest); fs_reg get_nir_dest(const nir_dest &dest);
@@ -464,6 +476,7 @@ public:
fs_reg *nir_locals; fs_reg *nir_locals;
fs_reg *nir_ssa_values; fs_reg *nir_ssa_values;
struct brw_fs_bind_info *nir_ssa_bind_infos;
fs_reg *nir_system_values; fs_reg *nir_system_values;
bool failed; bool failed;

View File

@@ -829,6 +829,12 @@ namespace brw {
return inst; return inst;
} }
bblock_t *
get_block() const
{
return block;
}
backend_shader *shader; backend_shader *shader;
private: 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, nir_ssa_values = reralloc(mem_ctx, nir_ssa_values, fs_reg,
impl->ssa_alloc); 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); 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; 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_reg
fs_visitor::get_nir_src(const nir_src &src) 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 = const bool is_store =
instr->intrinsic == nir_intrinsic_store_ssbo || instr->intrinsic == nir_intrinsic_store_ssbo ||
instr->intrinsic == nir_intrinsic_store_ssbo_block_intel; 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])) { if (src.is_ssa && src.ssa->parent_instr->type == nir_instr_type_intrinsic) {
return brw_imm_ud(nir_src_as_uint(instr->src[src])); 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 { } 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); dest = get_nir_dest(instr->dest);
switch (instr->intrinsic) { 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_load:
case nir_intrinsic_image_store: case nir_intrinsic_image_store:
case nir_intrinsic_image_atomic: case nir_intrinsic_image_atomic:

View File

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