From 7fce39484e68c0022b64357f844c9cc7e5853ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Briano?= Date: Tue, 23 Jul 2024 10:30:06 -0700 Subject: [PATCH] nir: add pass to convert ViewIndex to DeviceIndex Used to implement VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR. Reviewed-by: Lionel Landwerlin Part-of: --- src/compiler/nir/meson.build | 1 + src/compiler/nir/nir.h | 2 ++ .../nir_lower_view_index_to_device_index.c | 24 +++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 src/compiler/nir/nir_lower_view_index_to_device_index.c diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build index edb831fc528..000bdaf026a 100644 --- a/src/compiler/nir/meson.build +++ b/src/compiler/nir/meson.build @@ -203,6 +203,7 @@ files_libnir = files( 'nir_lower_var_copies.c', 'nir_lower_vec_to_regs.c', 'nir_lower_vec3_to_vec4.c', + 'nir_lower_view_index_to_device_index.c', 'nir_lower_viewport_transform.c', 'nir_lower_wpos_center.c', 'nir_lower_wpos_ytransform.c', diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index c423398c167..65b9b9acb29 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -6512,6 +6512,8 @@ bool nir_shader_uses_view_index(nir_shader *shader); bool nir_can_lower_multiview(nir_shader *shader); bool nir_lower_multiview(nir_shader *shader, uint32_t view_mask); +bool nir_lower_view_index_to_device_index(nir_shader *shader); + typedef enum { nir_lower_fp16_rtz = (1 << 0), nir_lower_fp16_rtne = (1 << 1), diff --git a/src/compiler/nir/nir_lower_view_index_to_device_index.c b/src/compiler/nir/nir_lower_view_index_to_device_index.c new file mode 100644 index 00000000000..7010bd27cea --- /dev/null +++ b/src/compiler/nir/nir_lower_view_index_to_device_index.c @@ -0,0 +1,24 @@ +/* + * Copyright 2024 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#include "nir.h" + +bool +nir_lower_view_index_to_device_index(nir_shader *shader) +{ + bool progress = false; + + nir_foreach_variable_with_modes(var, shader, nir_var_system_value) { + if (var->data.location == SYSTEM_VALUE_VIEW_INDEX) { + var->data.location = SYSTEM_VALUE_DEVICE_INDEX; + progress = true; + /* Can there be more than one of these or should we break here? */ + } + } + + nir_shader_preserve_all_metadata(shader); + + return progress; +}