From 7b2253c8b79a19be172bb090e28f34ff6a7ad172 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 19 Sep 2026 22:54:51 -0400 Subject: [PATCH] [MG_Backend] (Disaggregated): P5f fm - retain framebuffer format and dimensionality rules --- MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h | 1 + MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc | 5 ++++- .../MG_Backend/DirectVulkan/Renderer/WireFramebuffer.inc | 6 +++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h index fbea6f66..3900687f 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.h @@ -437,6 +437,7 @@ namespace MobileGL::MG_Backend::DirectVulkan { struct WireImage { VkImage image = VK_NULL_HANDLE; VkFormat format = VK_FORMAT_UNDEFINED; + VkImageViewType viewType = VK_IMAGE_VIEW_TYPE_2D; VkExtent2D extent{}; VkImageLayout layout = VK_IMAGE_LAYOUT_UNDEFINED; VkImageLayout* trackedLayout = nullptr; diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc index c1c2097c..846a1b8f 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireDraw.inc @@ -69,12 +69,15 @@ WireImage image = ResolveWireImage(*fbo, surface, aspect); if (!image.image) return VK_ATTACHMENT_UNUSED; m_textureManager->FlushPendingUploads(); + if (aspect == VK_IMAGE_ASPECT_COLOR_BIT) + image.format = ResolveSrgbAttachmentWriteFormat(image.format, + MGB_CTX->IsCapabilityEnabled(CapabilityInput::FramebufferSrgb)); const VkImageLayout layout = aspect == VK_IMAGE_ASPECT_COLOR_BIT ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_GENERAL; TransitionWireImage(image, layout); VkImageViewCreateInfo info{VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO}; info.image = image.image; - info.viewType = image.layers > 1 ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D; + info.viewType = image.viewType; info.format = image.format; info.subresourceRange = {aspect, image.level, 1, image.layer, image.layers}; if (image.format == VK_FORMAT_D24_UNORM_S8_UINT || image.format == VK_FORMAT_D32_SFLOAT_S8_UINT) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.inc b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.inc index 91893634..32f46bd4 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.inc +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/WireFramebuffer.inc @@ -46,6 +46,10 @@ out.layer = layer; out.is3D = resource->depth > 1; out.layers = surface.Layered ? (out.is3D ? std::max(resource->depth >> level, 1u) : availableLayers) : 1; + const Bool oneDimensional = resource->viewType == VK_IMAGE_VIEW_TYPE_1D || + resource->viewType == VK_IMAGE_VIEW_TYPE_1D_ARRAY; + out.viewType = oneDimensional ? (out.layers > 1 ? VK_IMAGE_VIEW_TYPE_1D_ARRAY : VK_IMAGE_VIEW_TYPE_1D) : + (out.layers > 1 ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D); if (out.level >= resource->mipLevels || out.layer + out.layers > (out.is3D ? std::max(resource->depth >> level, 1u) : resource->arrayLayers)) MagmaWireFatal("framebuffer-subresource"); @@ -123,7 +127,7 @@ TransitionWireImage(image, layout); VkImageViewCreateInfo viewInfo{VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO}; viewInfo.image = image.image; - viewInfo.viewType = image.layers > 1 ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : VK_IMAGE_VIEW_TYPE_2D; + viewInfo.viewType = image.viewType; viewInfo.format = image.format; viewInfo.subresourceRange = {color ? VK_IMAGE_ASPECT_COLOR_BIT : (image.format == VK_FORMAT_D24_UNORM_S8_UINT || image.format == VK_FORMAT_D32_SFLOAT_S8_UINT ? VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT : image.aspect), image.level, 1, image.layer, image.layers};