radv: advertise VK_EXT_host_image_copy on GFX10+ behind RADV_PERFTEST=hic

This exposes an experimental implementation of HIC with
RADV_PERFTEST=hic. It's passing 100% of VKCTS but it requires some
benchmarks first to verify if performance is acceptable or not.

No addrlib support for GFX6-9.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35974>
This commit is contained in:
Samuel Pitoiset 2025-07-03 11:09:02 +02:00 committed by Marge Bot
parent ea4ad51eb1
commit fbea486854
6 changed files with 54 additions and 8 deletions

View file

@ -1512,6 +1512,8 @@ RADV driver environment variables
rt extensions with older hardware.
``gewave32``
enable wave32 for vertex/tess/geometry shaders (GFX10+)
``hic``
enable experimental implementation of VK_EXT_host_image_copy (GFX10+)
``localbos``
enable local BOs
``nggc``

View file

@ -525,7 +525,7 @@ Vulkan 1.4 -- all DONE: anv, hk, lvp, nvk, radv/gfx8+, tu/a7xx+, vn
VK_KHR_shader_float_controls2 DONE (anv, lvp, nvk, panvk/v10+, radv, tu, vn)
VK_KHR_shader_subgroup_rotate DONE (anv, lvp, nvk, panvk, radv, tu, vn)
VK_KHR_vertex_attribute_divisor DONE (anv, lvp, nvk, panvk, radv, tu, v3dv, vn)
VK_EXT_host_image_copy DONE (anv, lvp, nvk/Turing+, tu, vn)
VK_EXT_host_image_copy DONE (anv, lvp, nvk/Turing+, radv/gfx10+, tu, vn)
VK_EXT_pipeline_protected_access DONE (anv/gfx12+, vn)
VK_EXT_pipeline_robustness DONE (anv, lvp, nvk, panvk, radv, v3dv, tu, vn)

View file

@ -70,3 +70,4 @@ removed EGL_MESA_drm_image
removed pre-dmabuf wl_drm support
deprecated EGL_WL_bind_wayland_display
VK_KHR_shader_atomic_int64 on panvk/v10+
VK_EXT_host_image_copy on RADV (RDNA1+)

View file

@ -96,6 +96,7 @@ enum {
RADV_PERFTEST_RT_WAVE_32 = 1u << 15,
RADV_PERFTEST_VIDEO_ENCODE = 1u << 16,
RADV_PERFTEST_NO_GTT_SPILL = 1u << 17,
RADV_PERFTEST_HIC = 1u << 18,
};
enum {

View file

@ -118,6 +118,7 @@ static const struct debug_control radv_perftest_options[] = {{"localbos", RADV_P
{"rtwave32", RADV_PERFTEST_RT_WAVE_32},
{"video_encode", RADV_PERFTEST_VIDEO_ENCODE},
{"nogttspill", RADV_PERFTEST_NO_GTT_SPILL},
{"hic", RADV_PERFTEST_HIC},
{NULL, 0}};
static const struct debug_control radv_trap_excp_options[] = {

View file

@ -151,6 +151,13 @@ radv_cooperative_matrix2_nv_enabled(const struct radv_physical_device *pdev)
return instance->drirc.cooperative_matrix2_nv;
}
static bool
radv_host_image_copy_enabled(const struct radv_physical_device *pdev)
{
const struct radv_instance *instance = radv_physical_device_instance(pdev);
return pdev->info.gfx_level >= GFX10 && (instance->perftest_flags & RADV_PERFTEST_HIC);
}
bool
radv_enable_rt(const struct radv_physical_device *pdev)
{
@ -690,6 +697,7 @@ radv_physical_device_get_supported_extensions(const struct radv_physical_device
.EXT_global_priority_query = true,
.EXT_graphics_pipeline_library = !pdev->use_llvm && !(instance->debug_flags & RADV_DEBUG_NO_GPL),
.EXT_hdr_metadata = true,
.EXT_host_image_copy = radv_host_image_copy_enabled(pdev),
.EXT_host_query_reset = true,
.EXT_image_2d_view_of_3d = true,
.EXT_image_compression_control = true,
@ -953,7 +961,7 @@ radv_physical_device_get_features(const struct radv_physical_device *pdev, struc
.maintenance6 = true,
.pipelineProtectedAccess = false,
.pipelineRobustness = true,
.hostImageCopy = false,
.hostImageCopy = radv_host_image_copy_enabled(pdev),
.pushDescriptor = true,
/* VK_EXT_conditional_rendering */
@ -1730,11 +1738,6 @@ radv_get_physical_device_properties(struct radv_physical_device *pdev)
.defaultRobustnessUniformBuffers = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS,
.defaultRobustnessVertexInputs = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED,
.defaultRobustnessImages = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2,
.copySrcLayoutCount = 0,
.pCopySrcLayouts = NULL,
.copyDstLayoutCount = 0,
.pCopyDstLayouts = NULL,
.identicalMemoryTypeRequirements = false,
/* VK_EXT_discard_rectangles */
.maxDiscardRectangles = MAX_DISCARD_RECTANGLES,
@ -2030,7 +2033,45 @@ radv_get_physical_device_properties(struct radv_physical_device *pdev)
.patch = 0,
};
memset(p->optimalTilingLayoutUUID, 0, sizeof(p->optimalTilingLayoutUUID));
/* VK_EXT_host_image_copy */
static const VkImageLayout supported_layouts[] = {
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_GENERAL,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
VK_IMAGE_LAYOUT_PREINITIALIZED,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL,
VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR,
VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR,
VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR,
VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR,
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR,
VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR,
VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR,
VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT,
VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT,
};
p->copySrcLayoutCount = ARRAY_SIZE(supported_layouts);
p->pCopySrcLayouts = (VkImageLayout *)supported_layouts;
p->copyDstLayoutCount = ARRAY_SIZE(supported_layouts);
p->pCopyDstLayouts = (VkImageLayout *)supported_layouts;
memcpy(p->optimalTilingLayoutUUID, pdev->driver_uuid, VK_UUID_SIZE);
p->identicalMemoryTypeRequirements = false;
/* VK_EXT_physical_device_drm */
#ifndef _WIN32