diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2022-05-16 18:50:05 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2022-05-16 19:50:16 -0700 |
commit | 99674f6d3214a7e81cf434b171919d973c2faf7c (patch) | |
tree | ffb8ae5f6ba9886b7ef81def4a35b2ac50b928ea | |
parent | a46a74dffd42684c35e5daf2e59812f0e98b49a7 (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.cpp | 14 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_to_nir.cpp | 15 | ||||
-rw-r--r-- | src/compiler/glsl/ir.h | 1 |
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, }; /*@{*/ |