From 3d0cc3f63b057f7cc92c47c54e6781c5b2de431b Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 13 Jan 2023 12:26:01 +0200 Subject: [PATCH] intel/fs: keep track of new resource_intel information Signed-off-by: Lionel Landwerlin Reviewed-by: Kenneth Graunke Part-of: --- src/intel/compiler/brw_fs.h | 13 ++++++ src/intel/compiler/brw_fs_builder.h | 6 +++ src/intel/compiler/brw_fs_nir.cpp | 57 +++++++++++++++++++++++++-- src/intel/compiler/brw_fs_visitor.cpp | 1 + 4 files changed, 73 insertions(+), 4 deletions(-) diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index 51e49e505cd..76693a91703 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -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; diff --git a/src/intel/compiler/brw_fs_builder.h b/src/intel/compiler/brw_fs_builder.h index 53265e5e60f..e879dda8029 100644 --- a/src/intel/compiler/brw_fs_builder.h +++ b/src/intel/compiler/brw_fs_builder.h @@ -829,6 +829,12 @@ namespace brw { return inst; } + bblock_t * + get_block() const + { + return block; + } + backend_shader *shader; private: diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp index df04535cef1..dbdd3938b6b 100644 --- a/src/intel/compiler/brw_fs_nir.cpp +++ b/src/intel/compiler/brw_fs_nir.cpp @@ -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: diff --git a/src/intel/compiler/brw_fs_visitor.cpp b/src/intel/compiler/brw_fs_visitor.cpp index 79865657ea2..69e15405ba0 100644 --- a/src/intel/compiler/brw_fs_visitor.cpp +++ b/src/intel/compiler/brw_fs_visitor.cpp @@ -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;