nir: Add some new helpers for working with const sources
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -1198,6 +1198,98 @@ nir_foreach_src(nir_instr *instr, nir_foreach_src_cb cb, void *state)
|
||||
return nir_foreach_dest(instr, visit_dest_indirect, &dest_state);
|
||||
}
|
||||
|
||||
int64_t
|
||||
nir_src_comp_as_int(nir_src src, unsigned comp)
|
||||
{
|
||||
assert(nir_src_is_const(src));
|
||||
nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr);
|
||||
|
||||
assert(comp < load->def.num_components);
|
||||
switch (load->def.bit_size) {
|
||||
case 8: return load->value.i8[comp];
|
||||
case 16: return load->value.i16[comp];
|
||||
case 32: return load->value.i32[comp];
|
||||
case 64: return load->value.i64[comp];
|
||||
default:
|
||||
unreachable("Invalid bit size");
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t
|
||||
nir_src_comp_as_uint(nir_src src, unsigned comp)
|
||||
{
|
||||
assert(nir_src_is_const(src));
|
||||
nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr);
|
||||
|
||||
assert(comp < load->def.num_components);
|
||||
switch (load->def.bit_size) {
|
||||
case 8: return load->value.u8[comp];
|
||||
case 16: return load->value.u16[comp];
|
||||
case 32: return load->value.u32[comp];
|
||||
case 64: return load->value.u64[comp];
|
||||
default:
|
||||
unreachable("Invalid bit size");
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
nir_src_comp_as_bool(nir_src src, unsigned comp)
|
||||
{
|
||||
assert(nir_src_is_const(src));
|
||||
nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr);
|
||||
|
||||
assert(comp < load->def.num_components);
|
||||
assert(load->def.bit_size == 32);
|
||||
assert(load->value.u32[comp] == NIR_TRUE ||
|
||||
load->value.u32[comp] == NIR_FALSE);
|
||||
|
||||
return load->value.u32[comp];
|
||||
}
|
||||
|
||||
double
|
||||
nir_src_comp_as_float(nir_src src, unsigned comp)
|
||||
{
|
||||
assert(nir_src_is_const(src));
|
||||
nir_load_const_instr *load = nir_instr_as_load_const(src.ssa->parent_instr);
|
||||
|
||||
assert(comp < load->def.num_components);
|
||||
switch (load->def.bit_size) {
|
||||
case 16: return _mesa_half_to_float(load->value.u16[comp]);
|
||||
case 32: return load->value.f32[comp];
|
||||
case 64: return load->value.f64[comp];
|
||||
default:
|
||||
unreachable("Invalid bit size");
|
||||
}
|
||||
}
|
||||
|
||||
int64_t
|
||||
nir_src_as_int(nir_src src)
|
||||
{
|
||||
assert(nir_src_num_components(src) == 1);
|
||||
return nir_src_comp_as_int(src, 0);
|
||||
}
|
||||
|
||||
uint64_t
|
||||
nir_src_as_uint(nir_src src)
|
||||
{
|
||||
assert(nir_src_num_components(src) == 1);
|
||||
return nir_src_comp_as_uint(src, 0);
|
||||
}
|
||||
|
||||
bool
|
||||
nir_src_as_bool(nir_src src)
|
||||
{
|
||||
assert(nir_src_num_components(src) == 1);
|
||||
return nir_src_comp_as_bool(src, 0);
|
||||
}
|
||||
|
||||
double
|
||||
nir_src_as_float(nir_src src)
|
||||
{
|
||||
assert(nir_src_num_components(src) == 1);
|
||||
return nir_src_comp_as_float(src, 0);
|
||||
}
|
||||
|
||||
nir_const_value *
|
||||
nir_src_as_const_value(nir_src src)
|
||||
{
|
||||
|
@@ -700,6 +700,22 @@ nir_src_num_components(nir_src src)
|
||||
return src.is_ssa ? src.ssa->num_components : src.reg.reg->num_components;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
nir_src_is_const(nir_src src)
|
||||
{
|
||||
return src.is_ssa &&
|
||||
src.ssa->parent_instr->type == nir_instr_type_load_const;
|
||||
}
|
||||
|
||||
int64_t nir_src_as_int(nir_src src);
|
||||
uint64_t nir_src_as_uint(nir_src src);
|
||||
bool nir_src_as_bool(nir_src src);
|
||||
double nir_src_as_float(nir_src src);
|
||||
int64_t nir_src_comp_as_int(nir_src src, unsigned component);
|
||||
uint64_t nir_src_comp_as_uint(nir_src src, unsigned component);
|
||||
bool nir_src_comp_as_bool(nir_src src, unsigned component);
|
||||
double nir_src_comp_as_float(nir_src src, unsigned component);
|
||||
|
||||
static inline unsigned
|
||||
nir_dest_bit_size(nir_dest dest)
|
||||
{
|
||||
|
Reference in New Issue
Block a user