From e6571e61e4f3c69ed785e4f574a6b3cdc2b1047f Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 19 Sep 2026 22:53:35 -0400 Subject: [PATCH 1/2] [MG_Backend] (Disaggregated): P5f fm - keep wire endpoint and transform checks role local --- MobileGL/MG_Backend/BackendObject.h | 7 ++++++- .../MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp | 9 ++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/MobileGL/MG_Backend/BackendObject.h b/MobileGL/MG_Backend/BackendObject.h index 13a6d626..c759e038 100644 --- a/MobileGL/MG_Backend/BackendObject.h +++ b/MobileGL/MG_Backend/BackendObject.h @@ -41,7 +41,12 @@ namespace MobileGL { #endif Bool IsRenderbuffer() const { return Renderbuffer != nullptr; } - Bool Exists() const { return Texture != nullptr || Renderbuffer != nullptr; } + Bool Exists() const { +#if MOBILEGL_BUILD_DISAGGREGATED + if (!MG_Pipe::MGPipeHandleIsNull(TextureHandle)) return true; +#endif + return Texture != nullptr || Renderbuffer != nullptr; + } }; enum class FormatCapability : Uint64 { diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index c05b46b1..2890a878 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -3155,9 +3155,12 @@ void main() { inline ProgramFactory::CompileOptionFlags GetShaderTransformFlags(VkSurfaceTransformFlagBitsKHR preTransform) { ProgramFactory::CompileOptionFlags flags = ProgramFactory::CompileOptionBit::PositionZRemap; #if MOBILEGL_BUILD_DISAGGREGATED - const auto* wireFbo = MG_Config::Transport != MG_Config::TransportMode::Monolith ? MG_Pipe::MGPipeApplier().DrawFramebuffer() : nullptr; - const Bool isDefault = wireFbo ? wireFbo->IsDefault : - MGB_CTX->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject()->IsDefaultFramebuffer(); + const Bool wire = MG_Config::Transport != MG_Config::TransportMode::Monolith; + const auto* wireFbo = wire ? MG_Pipe::MGPipeApplier().DrawFramebuffer() : nullptr; + const auto currentDrawFBO = wire ? SharedPtr{} : + MGB_CTX->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject(); + const Bool isDefault = wire ? (wireFbo && wireFbo->IsDefault) : + (currentDrawFBO && currentDrawFBO->IsDefaultFramebuffer()); #else const auto& currentDrawFBO = MGB_CTX->GetFramebufferBindingSlot(FramebufferTarget::Draw).GetBoundObject(); const Bool isDefault = currentDrawFBO != nullptr && currentDrawFBO->IsDefaultFramebuffer(); From 7b2253c8b79a19be172bb090e28f34ff6a7ad172 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 19 Sep 2026 22:54:51 -0400 Subject: [PATCH 2/2] [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};