From: Eric Anholt Date: Thu, 23 Jan 2020 18:42:15 +0000 (-0800) Subject: nir: Rename gl_nir_lower_bindless_images.c in preparation for extending it. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cad2d6583c9475bde584e5062a8de73fe7cbf353;p=mesa.git nir: Rename gl_nir_lower_bindless_images.c in preparation for extending it. The bulk of it can be reused to implement iris's internal non-bindless image lowering, which I would like to reuse in freedreno, v3d, and nir-to-tgsi. Reviewed-by: Kenneth Graunke Part-of: --- diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index 6f9ae8f24b0..2482de2a799 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -24,7 +24,7 @@ LIBGLSL_FILES = \ glsl/builtin_variables.cpp \ glsl/generate_ir.cpp \ glsl/gl_nir_lower_atomics.c \ - glsl/gl_nir_lower_bindless_images.c \ + glsl/gl_nir_lower_images.c \ glsl/gl_nir_lower_buffers.c \ glsl/gl_nir_lower_samplers.c \ glsl/gl_nir_lower_samplers_as_deref.c \ diff --git a/src/compiler/glsl/gl_nir_lower_bindless_images.c b/src/compiler/glsl/gl_nir_lower_bindless_images.c deleted file mode 100644 index 345d8f60670..00000000000 --- a/src/compiler/glsl/gl_nir_lower_bindless_images.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright © 2019 Red Hat Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/** - * \file - * - * Lower bindless image operations by turning the image_deref_* into a - * bindless_image_* intrinsic and adding a load_deref on the previous deref - * source. All applicable indicies are also set so that fetching the variable - * in the backend wouldn't be needed anymore. - */ - -#include "compiler/nir/nir.h" -#include "compiler/nir/nir_builder.h" -#include "compiler/nir/nir_deref.h" - -#include "compiler/glsl/gl_nir.h" - -static bool -lower_impl(nir_builder *b, nir_instr *instr) { - if (instr->type != nir_instr_type_intrinsic) - return false; - - nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr); - - nir_deref_instr *deref; - nir_variable *var; - - switch (intrinsic->intrinsic) { - case nir_intrinsic_image_deref_atomic_add: - case nir_intrinsic_image_deref_atomic_imin: - case nir_intrinsic_image_deref_atomic_umin: - case nir_intrinsic_image_deref_atomic_imax: - case nir_intrinsic_image_deref_atomic_umax: - case nir_intrinsic_image_deref_atomic_and: - case nir_intrinsic_image_deref_atomic_or: - case nir_intrinsic_image_deref_atomic_xor: - case nir_intrinsic_image_deref_atomic_exchange: - case nir_intrinsic_image_deref_atomic_comp_swap: - case nir_intrinsic_image_deref_atomic_fadd: - case nir_intrinsic_image_deref_load: - case nir_intrinsic_image_deref_samples: - case nir_intrinsic_image_deref_size: - case nir_intrinsic_image_deref_store: { - deref = nir_src_as_deref(intrinsic->src[0]); - var = nir_deref_instr_get_variable(deref); - break; - } - default: - return false; - } - - if (deref->mode == nir_var_uniform && !var->data.bindless) - return false; - - b->cursor = nir_before_instr(instr); - nir_ssa_def *handle = nir_load_deref(b, deref); - nir_rewrite_image_intrinsic(intrinsic, handle, true); - return true; -} - -bool -gl_nir_lower_bindless_images(nir_shader *shader) -{ - bool progress = false; - - nir_foreach_function(function, shader) { - if (function->impl) { - nir_builder b; - nir_builder_init(&b, function->impl); - - nir_foreach_block(block, function->impl) - nir_foreach_instr(instr, block) - progress |= lower_impl(&b, instr); - } - } - - return progress; -} diff --git a/src/compiler/glsl/gl_nir_lower_images.c b/src/compiler/glsl/gl_nir_lower_images.c new file mode 100644 index 00000000000..345d8f60670 --- /dev/null +++ b/src/compiler/glsl/gl_nir_lower_images.c @@ -0,0 +1,99 @@ +/* + * Copyright © 2019 Red Hat Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/** + * \file + * + * Lower bindless image operations by turning the image_deref_* into a + * bindless_image_* intrinsic and adding a load_deref on the previous deref + * source. All applicable indicies are also set so that fetching the variable + * in the backend wouldn't be needed anymore. + */ + +#include "compiler/nir/nir.h" +#include "compiler/nir/nir_builder.h" +#include "compiler/nir/nir_deref.h" + +#include "compiler/glsl/gl_nir.h" + +static bool +lower_impl(nir_builder *b, nir_instr *instr) { + if (instr->type != nir_instr_type_intrinsic) + return false; + + nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr); + + nir_deref_instr *deref; + nir_variable *var; + + switch (intrinsic->intrinsic) { + case nir_intrinsic_image_deref_atomic_add: + case nir_intrinsic_image_deref_atomic_imin: + case nir_intrinsic_image_deref_atomic_umin: + case nir_intrinsic_image_deref_atomic_imax: + case nir_intrinsic_image_deref_atomic_umax: + case nir_intrinsic_image_deref_atomic_and: + case nir_intrinsic_image_deref_atomic_or: + case nir_intrinsic_image_deref_atomic_xor: + case nir_intrinsic_image_deref_atomic_exchange: + case nir_intrinsic_image_deref_atomic_comp_swap: + case nir_intrinsic_image_deref_atomic_fadd: + case nir_intrinsic_image_deref_load: + case nir_intrinsic_image_deref_samples: + case nir_intrinsic_image_deref_size: + case nir_intrinsic_image_deref_store: { + deref = nir_src_as_deref(intrinsic->src[0]); + var = nir_deref_instr_get_variable(deref); + break; + } + default: + return false; + } + + if (deref->mode == nir_var_uniform && !var->data.bindless) + return false; + + b->cursor = nir_before_instr(instr); + nir_ssa_def *handle = nir_load_deref(b, deref); + nir_rewrite_image_intrinsic(intrinsic, handle, true); + return true; +} + +bool +gl_nir_lower_bindless_images(nir_shader *shader) +{ + bool progress = false; + + nir_foreach_function(function, shader) { + if (function->impl) { + nir_builder b; + nir_builder_init(&b, function->impl); + + nir_foreach_block(block, function->impl) + nir_foreach_instr(instr, block) + progress |= lower_impl(&b, instr); + } + } + + return progress; +} diff --git a/src/compiler/glsl/meson.build b/src/compiler/glsl/meson.build index 74cb8973077..1e2b3da1b4b 100644 --- a/src/compiler/glsl/meson.build +++ b/src/compiler/glsl/meson.build @@ -74,7 +74,7 @@ files_libglsl = files( 'builtin_variables.cpp', 'generate_ir.cpp', 'gl_nir_lower_atomics.c', - 'gl_nir_lower_bindless_images.c', + 'gl_nir_lower_images.c', 'gl_nir_lower_buffers.c', 'gl_nir_lower_samplers.c', 'gl_nir_lower_samplers_as_deref.c',