diff --git a/src/compiler/glsl/gl_nir_lower_images.c b/src/compiler/glsl/gl_nir_lower_images.c index 20d80301068..9bf2129f4b7 100644 --- a/src/compiler/glsl/gl_nir_lower_images.c +++ b/src/compiler/glsl/gl_nir_lower_images.c @@ -98,14 +98,20 @@ lower_instr(nir_builder *b, nir_instr *instr, void *cb_data) b->cursor = nir_before_instr(instr); nir_ssa_def *src; + int range_base = 0; if (bindless) { src = nir_load_deref(b, deref); + } else if (b->shader->options->lower_image_offset_to_range_base) { + src = nir_build_deref_offset(b, deref, type_size_align_1); + range_base = var->data.driver_location; } else { src = nir_iadd_imm(b, nir_build_deref_offset(b, deref, type_size_align_1), var->data.driver_location); } nir_rewrite_image_intrinsic(intrinsic, src, bindless); + if (!bindless) + nir_intrinsic_set_range_base(intrinsic, range_base); return true; } diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 8ad4b11768c..cb0d31c2d4f 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3760,6 +3760,11 @@ typedef struct nir_shader_compiler_options { * fragment task is far more than vertex one, so better left it disabled. */ bool lower_varying_from_uniform; + + /** store the variable offset into the instrinsic range_base instead + * of adding it to the image index. + */ + bool lower_image_offset_to_range_base; } nir_shader_compiler_options; typedef struct nir_shader { diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index e0e9c3cd29c..456daed5160 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -633,7 +633,7 @@ def image(name, src_comp=[], extra_indices=[], **kwargs): intrinsic("image_deref_" + name, src_comp=[-1] + src_comp, indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS] + extra_indices, **kwargs) intrinsic("image_" + name, src_comp=[1] + src_comp, - indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS] + extra_indices, **kwargs) + indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS, RANGE_BASE] + extra_indices, **kwargs) intrinsic("bindless_image_" + name, src_comp=[-1] + src_comp, indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS] + extra_indices, **kwargs)