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(); 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};