From afdbf0a1940182fdb3651fdffb93c8313c5d25ac Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 3 Jul 2026 12:05:20 +0800 Subject: [PATCH] [Fix] (MG_Backend/DirectVulkan): support layered texture framebuffers --- .../Renderer/VkRenderPassManager.cpp | 6 ++++- .../Renderer/VkTextureManager.cpp | 16 +++++++++++++ .../DirectVulkan/Renderer/VulkanRenderer.cpp | 23 ++++--------------- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp index 63568666..816ecd74 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkRenderPassManager.cpp @@ -661,8 +661,12 @@ namespace MobileGL::MG_Backend::DirectVulkan { // Color attachment description VkAttachmentDescription& desc = attachmentDescriptions.back(); switch (textureTarget) { + case TextureTarget::Texture1D: + case TextureTarget::Texture1DArray: case TextureTarget::Texture2D: - case TextureTarget::Texture2DMultisample: { + case TextureTarget::Texture2DArray: + case TextureTarget::Texture2DMultisample: + case TextureTarget::TextureRectangle: { desc.flags = 0; desc.format = isDefaultFbo ? m_swapchainObject.GetSurfaceFormat().format : diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp index a7fff018..903225b0 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VkTextureManager.cpp @@ -512,6 +512,22 @@ namespace MobileGL::MG_Backend::DirectVulkan { TextureUploadTarget uploadTarget, const IntVec3& texelSize, TextureShapeInfo& outShape) { switch (uploadTarget) { + case TextureUploadTarget::Texture1D: + case TextureUploadTarget::ProxyTexture1D: + outShape = {}; + outShape.imageType = VK_IMAGE_TYPE_1D; + outShape.viewType = VK_IMAGE_VIEW_TYPE_1D; + return true; + case TextureUploadTarget::Texture1DArray: + case TextureUploadTarget::ProxyTexture1DArray: + MOBILEGL_ASSERT(texelSize.z() > 0, + "TryResolveTextureShapeInfo: invalid 1D array depth=%d for textureId=%d", + texelSize.z(), texture.GetExternalIndex()); + outShape.imageType = VK_IMAGE_TYPE_1D; + outShape.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY; + outShape.depth = 1; + outShape.arrayLayers = static_cast(texelSize.z()); + return true; case TextureUploadTarget::Texture2D: case TextureUploadTarget::ProxyTexture2D: case TextureUploadTarget::TextureRectangle: diff --git a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp index 15c6e102..f4ce460f 100644 --- a/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/Renderer/VulkanRenderer.cpp @@ -923,26 +923,11 @@ namespace MobileGL::MG_Backend::DirectVulkan { return false; } - static Bool HasLayeredTextureAttachment(const MG_State::GLState::FramebufferObject& framebufferObject) { - if (framebufferObject.GetExternalIndex() == 0) { - return false; - } - - for (const auto& attachment : framebufferObject.GetAllAttachmentObjects()) { - if (attachment.IsTexture() && attachment.IsLayered()) { - return true; - } - } - return false; - } - static Bool IsUnsupportedFramebufferForDirectVulkan( const MG_State::GLState::FramebufferObject& framebufferObject) { // TODO: Revisit this gate when DirectVulkan has full color renderbuffer render/blit/readback support. - // TODO: Implement DirectVulkan layered framebuffer rendering instead of rejecting layered draw targets. return HasDistinctCompleteDepthStencilTextureAttachments(framebufferObject) || - HasUnsupportedCompleteRenderbufferAttachment(framebufferObject) || - HasLayeredTextureAttachment(framebufferObject); + HasUnsupportedCompleteRenderbufferAttachment(framebufferObject); } static void RecordUnsupportedFramebufferError(const char* func) { @@ -4929,9 +4914,9 @@ void main() { void VulkanRenderer::GenerateMipmap(GLenum target) { const auto textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); - MOBILEGL_ASSERT(textureTarget == TextureTarget::Texture2D || textureTarget == TextureTarget::Texture3D || - textureTarget == TextureTarget::TextureCubeMap, - "GenerateMipmap currently only supports GL_TEXTURE_2D, GL_TEXTURE_3D, and GL_TEXTURE_CUBE_MAP."); + MOBILEGL_ASSERT(textureTarget == TextureTarget::Texture2D || textureTarget == TextureTarget::Texture2DArray || + textureTarget == TextureTarget::Texture3D || textureTarget == TextureTarget::TextureCubeMap, + "GenerateMipmap currently only supports GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_3D, and GL_TEXTURE_CUBE_MAP."); auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); auto texture = textureUnit.GetBindingSlot(textureTarget).GetBoundObject();