From fbea486854786ad8082f39ce122f53f983e65948 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 3 Jul 2025 11:09:02 +0200 Subject: [PATCH] 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 Part-of: --- docs/envvars.rst | 2 + docs/features.txt | 2 +- docs/relnotes/new_features.txt | 1 + src/amd/vulkan/radv_debug.h | 1 + src/amd/vulkan/radv_instance.c | 1 + src/amd/vulkan/radv_physical_device.c | 55 +++++++++++++++++++++++---- 6 files changed, 54 insertions(+), 8 deletions(-) diff --git a/docs/envvars.rst b/docs/envvars.rst index bb078f52647..1a6c38e23c6 100644 --- a/docs/envvars.rst +++ b/docs/envvars.rst @@ -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`` diff --git a/docs/features.txt b/docs/features.txt index 8c0f6c97a89..85ab589dff1 100644 --- a/docs/features.txt +++ b/docs/features.txt @@ -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) diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt index 11a77d1f2dd..65a96d78730 100644 --- a/docs/relnotes/new_features.txt +++ b/docs/relnotes/new_features.txt @@ -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+) diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h index 7f9af7789c1..078cb6725d2 100644 --- a/src/amd/vulkan/radv_debug.h +++ b/src/amd/vulkan/radv_debug.h @@ -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 { diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 44ee0a9939a..050ed53afc6 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -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[] = { diff --git a/src/amd/vulkan/radv_physical_device.c b/src/amd/vulkan/radv_physical_device.c index 0d2294e1573..b65af19d136 100644 --- a/src/amd/vulkan/radv_physical_device.c +++ b/src/amd/vulkan/radv_physical_device.c @@ -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