diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index bc13b84b78c..e70f10f7ed8 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -898,13 +898,10 @@ radv_create_descriptor_pool(struct radv_device *device, const VkDescriptorPoolCr } if (bo_size) { - const struct radv_physical_device *pdev = radv_device_physical(device); - const struct radv_instance *instance = radv_physical_device_instance(pdev); - if (!(pCreateInfo->flags & VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT)) { enum radeon_bo_flag flags = RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_READ_ONLY | RADEON_FLAG_32BIT; - if (instance->drirc.zero_vram) + if (radv_device_should_clear_vram(device)) flags |= RADEON_FLAG_ZERO_VRAM; VkResult result = radv_bo_create(device, &pool->base, bo_size, 32, RADEON_DOMAIN_VRAM, flags, diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 4d6ba6ae3aa..72d3024ecf0 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -84,6 +84,16 @@ radv_trap_handler_enabled() return !!getenv("RADV_TRAP_HANDLER"); } +bool +radv_device_should_clear_vram(const struct radv_device *device) +{ + const struct radv_physical_device *pdev = radv_device_physical(device); + const struct radv_instance *instance = radv_physical_device_instance(pdev); + + /* Ignore drirc radv_zero_vram=true if the feature is enabled to let applications take control. */ + return instance->drirc.zero_vram && !device->vk.enabled_features.zeroInitializeDeviceMemory; +} + VKAPI_ATTR VkResult VKAPI_CALL radv_GetMemoryHostPointerPropertiesEXT(VkDevice _device, VkExternalMemoryHandleTypeFlagBits handleType, const void *pHostPointer, diff --git a/src/amd/vulkan/radv_device.h b/src/amd/vulkan/radv_device.h index 9b847dec14e..d27f20794e5 100644 --- a/src/amd/vulkan/radv_device.h +++ b/src/amd/vulkan/radv_device.h @@ -379,4 +379,6 @@ bool radv_device_acquire_performance_counters(struct radv_device *device); void radv_device_release_performance_counters(struct radv_device *device); +bool radv_device_should_clear_vram(const struct radv_device *device); + #endif /* RADV_DEVICE_H */ diff --git a/src/amd/vulkan/radv_device_memory.c b/src/amd/vulkan/radv_device_memory.c index 99b9c78b686..a3de89bd9f3 100644 --- a/src/amd/vulkan/radv_device_memory.c +++ b/src/amd/vulkan/radv_device_memory.c @@ -231,7 +231,8 @@ radv_alloc_memory(struct radv_device *device, const VkMemoryAllocateInfo *pAlloc if (flags_info && flags_info->flags & VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT) flags |= RADEON_FLAG_REPLAYABLE; - if ((flags_info && flags_info->flags & VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT) || instance->drirc.zero_vram) + if ((flags_info && flags_info->flags & VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT) || + radv_device_should_clear_vram(device)) flags |= RADEON_FLAG_ZERO_VRAM; /* On GFX12, DCC is transparent to the userspace driver and PTE.DCC is