diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 0300fadceb4..3806f557332 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -865,7 +865,7 @@ static void radv_device_init_cache_key(struct radv_device *device) { STATIC_ASSERT(sizeof(device->compiler_info.hw) == 12); - STATIC_ASSERT(sizeof(device->compiler_info.key) == 12); + STATIC_ASSERT(sizeof(device->compiler_info.key) == 16); uint32_t ptr_size = sizeof(void *); @@ -1149,6 +1149,7 @@ radv_device_init_compiler_info(struct radv_device *device) { .family = pdev->info.family, .address32_hi = pdev->info.address32_hi, + .address_prt_wa_control_bit = pdev->info.address_prt_wa_control_bit, .rbplus_allowed = pdev->info.rbplus_allowed, }, /* Misc values included as part of the cache key */ @@ -1170,6 +1171,8 @@ radv_device_init_compiler_info(struct radv_device *device) device->vk.enabled_features.robustBufferAccess), .mitigate_smem_oob = pdev->info.compiler_info.has_smem_oob_access_bug && !(instance->debug_flags & RADV_DEBUG_NO_SMEM_MITIGATION), + .mitigate_smem_with_null_prt = + pdev->info.compiler_info.has_smem_with_null_prt_bug && radv_sparse_enabled(pdev), .bvh8 = radv_use_bvh8(pdev), .no_rt = !!(instance->debug_flags & RADV_DEBUG_NO_RT), .rt_cps = !!(instance->perftest_flags & RADV_PERFTEST_RT_CPS), diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index d0f447429f3..35200b10514 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -526,6 +526,9 @@ radv_postprocess_nir(const struct radv_compiler_info *compiler_info, const struc NIR_PASS(_, stage->nir, ac_nir_lower_global_access); NIR_PASS(_, stage->nir, nir_lower_int64); + if (compiler_info->key.mitigate_smem_with_null_prt) + NIR_PASS(_, stage->nir, ac_nir_fixup_smem_loads_null_prt, compiler_info->hw.address_prt_wa_control_bit); + if (compiler_info->key.mitigate_smem_oob) NIR_PASS(_, stage->nir, ac_nir_fixup_mem_access_gfx6, &stage->args.ac, 4096, true, true); diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 34b54dc2b6b..a7fb4ae8a7e 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -518,7 +518,8 @@ struct radv_compiler_info { uint32_t family; uint32_t address32_hi; uint32_t rbplus_allowed : 1; - uint32_t padding : 31; + uint32_t address_prt_wa_control_bit : 8; + uint32_t padding : 23; } hw; /* Misc values included as part of the cache key */ @@ -537,6 +538,7 @@ struct radv_compiler_info { uint32_t use_fmask : 1; uint32_t robust_buffer_access : 1; /* Only used by LLVM. */ uint32_t mitigate_smem_oob : 1; + uint32_t mitigate_smem_with_null_prt : 1; uint32_t bvh8 : 1; uint32_t no_rt : 1; uint32_t rt_cps : 1; @@ -553,6 +555,7 @@ struct radv_compiler_info { uint32_t tex_non_uniform : 1; uint32_t lower_terminate_to_discard : 1; uint32_t no_implicit_varying_subgroup_size : 1; + uint32_t padding : 31; int32_t force_aniso;