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:

committed by
Marge Bot

parent
86e9943b00
commit
3d0cc3f63b
@@ -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;
|
||||
|
@@ -829,6 +829,12 @@ namespace brw {
|
||||
return inst;
|
||||
}
|
||||
|
||||
bblock_t *
|
||||
get_block() const
|
||||
{
|
||||
return block;
|
||||
}
|
||||
|
||||
backend_shader *shader;
|
||||
|
||||
private:
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user