diff --git a/src/amd/vulkan/bvh/build_helpers.h b/src/amd/vulkan/bvh/build_helpers.h
index adbf621a308..59584f1caf8 100644
--- a/src/amd/vulkan/bvh/build_helpers.h
+++ b/src/amd/vulkan/bvh/build_helpers.h
@@ -156,6 +156,7 @@
#define VK_GEOMETRY_TYPE_TRIANGLES_KHR 0
#define VK_GEOMETRY_TYPE_AABBS_KHR 1
+#define VK_GEOMETRY_TYPE_INSTANCES_KHR 2
#define VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR 1
#define VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR 2
diff --git a/src/amd/vulkan/bvh/leaf.comp b/src/amd/vulkan/bvh/leaf.comp
index ba706fbb91c..259532d9ae9 100644
--- a/src/amd/vulkan/bvh/leaf.comp
+++ b/src/amd/vulkan/bvh/leaf.comp
@@ -87,6 +87,14 @@ main(void)
is_active = build_instance(bounds, src_ptr, dst_ptr, global_id);
}
+#if ALWAYS_ACTIVE
+ if (!is_active && args.geom_data.geometry_type != VK_GEOMETRY_TYPE_INSTANCES_KHR) {
+ bounds.min = vec3(0.0);
+ bounds.max = vec3(0.0);
+ is_active = true;
+ }
+#endif
+
if (is_active) {
REF(radv_ir_node) ir_node = INDEX(radv_ir_node, args.ir, primitive_id);
DEREF(ir_node).aabb = bounds;
diff --git a/src/amd/vulkan/bvh/meson.build b/src/amd/vulkan/bvh/meson.build
index 017a0bfc28e..5f654a9f438 100644
--- a/src/amd/vulkan/bvh/meson.build
+++ b/src/amd/vulkan/bvh/meson.build
@@ -53,7 +53,12 @@ bvh_shaders = [
[
'leaf.comp',
'leaf',
- [],
+ ['ALWAYS_ACTIVE=0'],
+ ],
+ [
+ 'leaf.comp',
+ 'leaf_always_active',
+ ['ALWAYS_ACTIVE=1'],
],
[
'morton.comp',
diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c
index 0b2b82a660b..8f4872ad611 100644
--- a/src/amd/vulkan/radv_acceleration_structure.c
+++ b/src/amd/vulkan/radv_acceleration_structure.c
@@ -41,6 +41,10 @@ static const uint32_t leaf_spv[] = {
#include "bvh/leaf.spv.h"
};
+static const uint32_t leaf_always_active_spv[] = {
+#include "bvh/leaf_always_active.spv.h"
+};
+
static const uint32_t morton_spv[] = {
#include "bvh/morton.spv.h"
};
@@ -538,9 +542,14 @@ radv_device_init_accel_struct_build_state(struct radv_device *device)
if (device->meta_state.accel_struct_build.radix_sort)
goto exit;
- result = create_build_pipeline_spv(device, leaf_spv, sizeof(leaf_spv), sizeof(struct leaf_args),
- &device->meta_state.accel_struct_build.leaf_pipeline,
- &device->meta_state.accel_struct_build.leaf_p_layout);
+ if (device->instance->drirc.force_active_accel_struct_leaves)
+ result = create_build_pipeline_spv(device, leaf_always_active_spv, sizeof(leaf_always_active_spv),
+ sizeof(struct leaf_args), &device->meta_state.accel_struct_build.leaf_pipeline,
+ &device->meta_state.accel_struct_build.leaf_p_layout);
+ else
+ result = create_build_pipeline_spv(device, leaf_spv, sizeof(leaf_spv), sizeof(struct leaf_args),
+ &device->meta_state.accel_struct_build.leaf_pipeline,
+ &device->meta_state.accel_struct_build.leaf_p_layout);
if (result != VK_SUCCESS)
goto exit;
diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c
index 6f47daba764..4279bc4af3d 100644
--- a/src/amd/vulkan/radv_instance.c
+++ b/src/amd/vulkan/radv_instance.c
@@ -160,6 +160,7 @@ static const driOptionDescription radv_dri_options[] = {
DRI_CONF_RADV_OVERRIDE_COMPUTE_SHADER_VERSION(0)
DRI_CONF_RADV_OVERRIDE_RAY_TRACING_SHADER_VERSION(0)
DRI_CONF_RADV_SSBO_NON_UNIFORM(false)
+ DRI_CONF_RADV_FORCE_ACTIVE_ACCEL_STRUCT_LEAVES(false)
DRI_CONF_RADV_APP_LAYER()
DRI_CONF_SECTION_END
};
@@ -251,6 +252,9 @@ radv_init_dri_options(struct radv_instance *instance)
instance->drirc.vk_require_etc2 = driQueryOptionb(&instance->drirc.options, "vk_require_etc2");
instance->drirc.vk_require_astc = driQueryOptionb(&instance->drirc.options, "vk_require_astc");
+
+ instance->drirc.force_active_accel_struct_leaves =
+ driQueryOptionb(&instance->drirc.options, "radv_force_active_accel_struct_leaves");
}
static const struct vk_instance_extension_table radv_instance_extensions_supported = {
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index ac2f5a170f8..1baea731ccf 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -386,6 +386,7 @@ struct radv_instance {
bool report_llvm9_version_string;
bool vk_require_etc2;
bool vk_require_astc;
+ bool force_active_accel_struct_leaves;
char *app_layer;
uint8_t override_graphics_shader_version;
uint8_t override_compute_shader_version;
diff --git a/src/util/00-radv-defaults.conf b/src/util/00-radv-defaults.conf
index d58c86c1909..d7e6115c866 100644
--- a/src/util/00-radv-defaults.conf
+++ b/src/util/00-radv-defaults.conf
@@ -106,6 +106,7 @@ Application bugs worked around in this file:
+
diff --git a/src/util/driconf.h b/src/util/driconf.h
index e91bf81a381..32ccf87a5e1 100644
--- a/src/util/driconf.h
+++ b/src/util/driconf.h
@@ -716,6 +716,10 @@
#define DRI_CONF_RADV_CLEAR_LDS(def) \
DRI_CONF_OPT_B(radv_clear_lds, def, "Clear LDS at the end of shaders. Might decrease performance.")
+#define DRI_CONF_RADV_FORCE_ACTIVE_ACCEL_STRUCT_LEAVES(def) \
+ DRI_CONF_OPT_B(radv_force_active_accel_struct_leaves, def, \
+ "Force leaf nodes of acceleration structures to be marked active.")
+
/**
* \brief ANV specific configuration options
*/