summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2022-05-16 18:50:05 -0700
committerIan Romanick <ian.d.romanick@intel.com>2022-05-16 19:50:16 -0700
commit99674f6d3214a7e81cf434b171919d973c2faf7c (patch)
treeffb8ae5f6ba9886b7ef81def4a35b2ac50b928ea
parenta46a74dffd42684c35e5daf2e59812f0e98b49a7 (diff)
glsl: Add ir_intrinsic_sparse_residency_code_and
This is necessary to fix lower_offset_arrays for sparse textures. Fixes: 640f9098621 ("glsl: add _texture related sparse texture builtin functions")
-rw-r--r--src/compiler/glsl/builtin_functions.cpp14
-rw-r--r--src/compiler/glsl/glsl_to_nir.cpp15
-rw-r--r--src/compiler/glsl/ir.h1
3 files changed, 30 insertions, 0 deletions
diff --git a/src/compiler/glsl/builtin_functions.cpp b/src/compiler/glsl/builtin_functions.cpp
index 0f9db2ab5fb..98d452581de 100644
--- a/src/compiler/glsl/builtin_functions.cpp
+++ b/src/compiler/glsl/builtin_functions.cpp
@@ -1206,6 +1206,7 @@ private:
B0(is_sparse_texels_resident);
B0(is_sparse_texels_resident_intrinsic);
+ B0(sparse_residency_code_and_intrinsic);
/** Flags to _texture() */
#define TEX_PROJECT 1
@@ -1726,6 +1727,9 @@ builtin_builder::create_intrinsics()
add_function("__intrinsic_is_sparse_texels_resident",
_is_sparse_texels_resident_intrinsic(), NULL);
+
+ add_function("__intrinsic_sparse_residency_code_and",
+ _sparse_residency_code_and_intrinsic(), NULL);
}
/**
@@ -7299,6 +7303,16 @@ builtin_builder::_is_sparse_texels_resident_intrinsic(void)
}
ir_function_signature *
+builtin_builder::_sparse_residency_code_and_intrinsic(void)
+{
+ ir_variable *code1 = in_var(glsl_type::int_type, "code1");
+ ir_variable *code2 = in_var(glsl_type::int_type, "code2");
+ MAKE_INTRINSIC(glsl_type::bool_type, ir_intrinsic_sparse_residency_code_and,
+ sparse_enabled, 2, code1, code2);
+ return sig;
+}
+
+ir_function_signature *
builtin_builder::_texture(ir_texture_opcode opcode,
builtin_available_predicate avail,
const glsl_type *return_type,
diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp
index 536bedd316b..e1ad17549bb 100644
--- a/src/compiler/glsl/glsl_to_nir.cpp
+++ b/src/compiler/glsl/glsl_to_nir.cpp
@@ -1203,6 +1203,9 @@ nir_visitor::visit(ir_call *ir)
case ir_intrinsic_is_sparse_texels_resident:
op = nir_intrinsic_is_sparse_texels_resident;
break;
+ case ir_intrinsic_sparse_residency_code_and:
+ op = nir_intrinsic_sparse_residency_code_and;
+ break;
default:
unreachable("not reached");
}
@@ -1642,6 +1645,18 @@ nir_visitor::visit(ir_call *ir)
nir_builder_instr_insert(&b, &instr->instr);
break;
}
+ case nir_intrinsic_sparse_residency_code_and: {
+ nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 1, NULL);
+
+ ir_rvalue *code1 = (ir_rvalue *) ir->actual_parameters.get_head();
+ instr->src[0] = nir_src_for_ssa(evaluate_rvalue(code1));
+
+ ir_rvalue *code2 = (ir_rvalue *) ir->actual_parameters.get_head()->next;
+ instr->src[1] = nir_src_for_ssa(evaluate_rvalue(code2));
+
+ nir_builder_instr_insert(&b, &instr->instr);
+ break;
+ }
default:
unreachable("not reached");
}
diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
index 3c5f7bc009d..84274e6ce2e 100644
--- a/src/compiler/glsl/ir.h
+++ b/src/compiler/glsl/ir.h
@@ -1167,6 +1167,7 @@ enum ir_intrinsic_id {
ir_intrinsic_shared_atomic_comp_swap = MAKE_INTRINSIC_FOR_TYPE(atomic_comp_swap, shared),
ir_intrinsic_is_sparse_texels_resident,
+ ir_intrinsic_sparse_residency_code_and,
};
/*@{*/