From d69177fcba7b1deb57dd31b797695e0e0bcb74d0 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sat, 31 Jan 2026 00:39:47 -0400 Subject: [PATCH] [vulkan] Initial VK_KHR_dynamic_rendering implementation --- src/video_core/vulkan_common/vulkan.h | 7 ++++++- src/video_core/vulkan_common/vulkan_device.h | 6 ++++++ src/video_core/vulkan_common/vulkan_wrapper.cpp | 12 +++++++++++- src/video_core/vulkan_common/vulkan_wrapper.h | 15 ++++++++++++++- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/video_core/vulkan_common/vulkan.h b/src/video_core/vulkan_common/vulkan.h index 8d2e8e2a37..c77ba4de1a 100644 --- a/src/video_core/vulkan_common/vulkan.h +++ b/src/video_core/vulkan_common/vulkan.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project @@ -33,6 +33,11 @@ #define VK_KHR_MAINTENANCE_9_EXTENSION_NAME "VK_KHR_maintenance9" #endif +// Define dynamic rendering extension name if not present +#ifndef VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME +#define VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME "VK_KHR_dynamic_rendering" +#endif + // Sanitize macros #undef CreateEvent #undef CreateSemaphore diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index f18b8278ad..f08c8125bf 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h @@ -109,6 +109,7 @@ VK_DEFINE_HANDLE(VmaAllocator) EXTENSION(EXT, FILTER_CUBIC, filter_cubic) \ EXTENSION(QCOM, FILTER_CUBIC_WEIGHTS, filter_cubic_weights) \ EXTENSION(EXT, GRAPHICS_PIPELINE_LIBRARY, graphics_pipeline_library) \ + EXTENSION(KHR, DYNAMIC_RENDERING, dynamic_rendering) \ // Define extensions which must be supported. #define FOR_EACH_VK_MANDATORY_EXTENSION(EXTENSION_NAME) \ @@ -353,6 +354,11 @@ public: return properties.float_controls; } + /// Returns true if the device supports VK_KHR_dynamic_rendering. + bool IsDynamicRenderingSupported() const { + return extensions.dynamic_rendering; + } + /// Returns true if ASTC is natively supported. bool IsOptimalAstcSupported() const { return features.features.textureCompressionASTC_LDR; diff --git a/src/video_core/vulkan_common/vulkan_wrapper.cpp b/src/video_core/vulkan_common/vulkan_wrapper.cpp index 534a11edd4..1b089947ba 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.cpp +++ b/src/video_core/vulkan_common/vulkan_wrapper.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -92,6 +92,11 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkCmdBeginConditionalRenderingEXT); X(vkCmdBeginQuery); X(vkCmdBeginRenderPass); + Proc(dld.vkCmdBeginRendering, dld, "vkCmdBeginRendering", device); + if (!dld.vkCmdBeginRendering) { + Proc(dld.vkCmdBeginRendering, dld, "vkCmdBeginRenderingKHR", device); + if (!dld.vkCmdBeginRendering) Proc(dld.vkCmdBeginRendering, dld, "vkCmdBeginRenderingEXT", device); + } X(vkCmdBeginTransformFeedbackEXT); X(vkCmdBeginDebugUtilsLabelEXT); X(vkCmdBindDescriptorSets); @@ -121,6 +126,11 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept { X(vkCmdEndConditionalRenderingEXT); X(vkCmdEndQuery); X(vkCmdEndRenderPass); + Proc(dld.vkCmdEndRendering, dld, "vkCmdEndRendering", device); + if (!dld.vkCmdEndRendering) { + Proc(dld.vkCmdEndRendering, dld, "vkCmdEndRenderingKHR", device); + if (!dld.vkCmdEndRendering) Proc(dld.vkCmdEndRendering, dld, "vkCmdEndRenderingEXT", device); + } X(vkCmdEndTransformFeedbackEXT); X(vkCmdEndDebugUtilsLabelEXT); X(vkCmdFillBuffer); diff --git a/src/video_core/vulkan_common/vulkan_wrapper.h b/src/video_core/vulkan_common/vulkan_wrapper.h index 04b9420d98..cb986136bb 100644 --- a/src/video_core/vulkan_common/vulkan_wrapper.h +++ b/src/video_core/vulkan_common/vulkan_wrapper.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project @@ -192,6 +192,7 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabelEXT{}; PFN_vkCmdBeginQuery vkCmdBeginQuery{}; PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass{}; + PFN_vkCmdBeginRendering vkCmdBeginRendering{}; PFN_vkCmdBeginTransformFeedbackEXT vkCmdBeginTransformFeedbackEXT{}; PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets{}; PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer{}; @@ -222,6 +223,7 @@ struct DeviceDispatch : InstanceDispatch { PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabelEXT{}; PFN_vkCmdEndQuery vkCmdEndQuery{}; PFN_vkCmdEndRenderPass vkCmdEndRenderPass{}; + PFN_vkCmdEndRendering vkCmdEndRendering{}; PFN_vkCmdEndTransformFeedbackEXT vkCmdEndTransformFeedbackEXT{}; PFN_vkCmdFillBuffer vkCmdFillBuffer{}; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier{}; @@ -1143,6 +1145,17 @@ public: VkCommandBuffer operator*() const noexcept { return handle; } + + void BeginRendering(const VkRenderingInfo* rendering_info) const noexcept { + if (dld->vkCmdBeginRendering) { + dld->vkCmdBeginRendering(handle, rendering_info); + } + } + void EndRendering() const noexcept { + if (dld->vkCmdEndRendering) { + dld->vkCmdEndRendering(handle); + } + } void Begin(const VkCommandBufferBeginInfo& begin_info) const { Check(dld->vkBeginCommandBuffer(handle, &begin_info)); }