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