diff --git a/docs/envvars.rst b/docs/envvars.rst index 19267f74757..3669f907b04 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -702,6 +702,9 @@ RADV driver environment variables enable wave32 for compute shaders (GFX10+) ``dccmsaa`` enable DCC for MSAA images + ``force_emulate_rt`` + forces ray-tracing to be emulated in software, + even if there is hardware support. ``gewave32`` enable wave32 for vertex/tess/geometry shaders (GFX10+) ``localbos`` diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h index df50965ccb7..14b3a5160b1 100644 --- a/src/amd/vulkan/radv_debug.h +++ b/src/amd/vulkan/radv_debug.h @@ -76,6 +76,7 @@ enum { RADV_PERFTEST_SAM = 1u << 7, RADV_PERFTEST_RT = 1u << 8, RADV_PERFTEST_NGGC = 1u << 9, + RADV_PERFTEST_FORCE_EMULATE_RT = 1u << 10, }; bool radv_init_trace(struct radv_device *device); diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 5a719bb1005..982603172dd 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -861,6 +861,7 @@ static const struct debug_control radv_perftest_options[] = {{"localbos", RADV_P {"sam", RADV_PERFTEST_SAM}, {"rt", RADV_PERFTEST_RT}, {"nggc", RADV_PERFTEST_NGGC}, + {"force_emulate_rt", RADV_PERFTEST_FORCE_EMULATE_RT}, {NULL, 0}}; const char * diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 7b4b981155c..0f49471059b 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -219,6 +219,8 @@ radv_get_hash_flags(const struct radv_device *device, bool stats) if (device->instance->perftest_flags & RADV_PERFTEST_NGGC) hash_flags |= RADV_HASH_SHADER_FORCE_NGG_CULLING; + if (device->instance->perftest_flags & RADV_PERFTEST_FORCE_EMULATE_RT) + hash_flags |= RADV_HASH_SHADER_FORCE_EMULATE_RT; if (device->physical_device->cs_wave_size == 32) hash_flags |= RADV_HASH_SHADER_CS_WAVE32; if (device->physical_device->ps_wave_size == 32) diff --git a/src/amd/vulkan/radv_pipeline_rt.c b/src/amd/vulkan/radv_pipeline_rt.c index d46e74b8dbd..e7f558071b1 100644 --- a/src/amd/vulkan/radv_pipeline_rt.c +++ b/src/amd/vulkan/radv_pipeline_rt.c @@ -1877,7 +1877,8 @@ insert_traversal(struct radv_device *device, const VkRayTracingPipelineCreateInf bvh_node = nir_iadd(b, nir_load_var(b, trav_vars.bvh_base), nir_u2u(b, bvh_node, 64)); nir_ssa_def *intrinsic_result = NULL; - if (device->physical_device->rad_info.chip_class >= GFX10_3) { + if (device->physical_device->rad_info.chip_class >= GFX10_3 + && !(device->instance->perftest_flags & RADV_PERFTEST_FORCE_EMULATE_RT)) { intrinsic_result = nir_bvh64_intersect_ray_amd( b, 32, desc, nir_unpack_64_2x32(b, bvh_node), nir_load_var(b, vars->tmax), nir_load_var(b, trav_vars.origin), nir_load_var(b, trav_vars.dir), diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 5453ccc8fd0..d9fb16d5e31 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1662,6 +1662,7 @@ struct radv_event { #define RADV_HASH_SHADER_FORCE_NGG_CULLING (1 << 13) #define RADV_HASH_SHADER_ROBUST_BUFFER_ACCESS (1 << 14) #define RADV_HASH_SHADER_ROBUST_BUFFER_ACCESS2 (1 << 15) +#define RADV_HASH_SHADER_FORCE_EMULATE_RT (1 << 16) struct radv_pipeline_key;