diff --git a/src/amd/common/ac_gpu_info.c b/src/amd/common/ac_gpu_info.c index 05bc4620ab2..aeb6bbbe755 100644 --- a/src/amd/common/ac_gpu_info.c +++ b/src/amd/common/ac_gpu_info.c @@ -1691,6 +1691,8 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info, info->has_set_sh_pairs_packed = info->register_shadowing_required; } + info->has_image_bvh_intersect_ray = info->gfx_level >= GFX10_3; + set_custom_cu_en_mask(info); const char *ib_filename = debug_get_option("AMD_PARSE_IB", NULL); diff --git a/src/amd/common/ac_gpu_info.h b/src/amd/common/ac_gpu_info.h index 489d6043add..705c6449c11 100644 --- a/src/amd/common/ac_gpu_info.h +++ b/src/amd/common/ac_gpu_info.h @@ -315,6 +315,11 @@ struct radeon_info { uint32_t csa_alignment; } fw_based_mcbp; bool has_fw_based_shadowing; + + /* Device supports hardware-accelerated raytracing using + * image_bvh*_intersect_ray instructions + */ + bool has_image_bvh_intersect_ray; }; bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info, diff --git a/src/amd/vulkan/nir/radv_nir_rt_common.c b/src/amd/vulkan/nir/radv_nir_rt_common.c index faa6e3beb2f..5f93b9a9b4e 100644 --- a/src/amd/vulkan/nir/radv_nir_rt_common.c +++ b/src/amd/vulkan/nir/radv_nir_rt_common.c @@ -575,7 +575,7 @@ radv_build_ray_traversal(struct radv_device *device, nir_builder *b, const struc nir_def *global_bvh_node = nir_iadd(b, nir_load_deref(b, args->vars.bvh_base), nir_u2u64(b, bvh_node)); nir_def *intrinsic_result = NULL; - if (pdev->info.gfx_level >= GFX10_3 && !radv_emulate_rt(pdev)) { + if (pdev->info.has_image_bvh_intersect_ray && !radv_emulate_rt(pdev)) { intrinsic_result = nir_bvh64_intersect_ray_amd(b, 32, desc, nir_unpack_64_2x32(b, global_bvh_node), nir_load_deref(b, args->vars.tmax), nir_load_deref(b, args->vars.origin), diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index d572030eaa1..dfdb7276988 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -111,7 +111,7 @@ radv_filter_minmax_enabled(const struct radv_physical_device *pdev) bool radv_enable_rt(const struct radv_physical_device *pdev) { - if (pdev->info.gfx_level < GFX10_3 && !radv_emulate_rt(pdev)) + if (!pdev->info.has_image_bvh_intersect_ray && !radv_emulate_rt(pdev)) return false; if (pdev->use_llvm)