From 5b38f619614545712b11b4806adfc9106b9589b5 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 16 Jul 2026 03:06:03 -0400 Subject: [PATCH] [Fix] (MG_Backend): GetTexImage level-range check was off-by-one (max level is inclusive; single-level textures asserted on level 0), demoted to logged skip; advertise GL_ARB_texture_storage_multisample (entry points already implemented - unadvertised extension left null glw pointers and CTS framebuffer_blit jumped to address 0) --- .../DirectGLES/BackendObject_DirectGLES.cpp | 3 ++- MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp | 13 ++++++------- .../DirectVulkan/BackendObject_DirectVulkan.cpp | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp index de7dd358..0c5b62be 100644 --- a/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/BackendObject_DirectGLES.cpp @@ -824,7 +824,8 @@ namespace MobileGL::MG_Backend::DirectGLES { E_GL_ARB_shader_storage_buffer_object, E_GL_ARB_shader_image_load_store, E_GL_ARB_program_interface_query, E_GL_ARB_framebuffer_object, E_GL_EXT_framebuffer_object, E_GL_ARB_depth_texture, E_GL_ARB_buffer_storage, - E_GL_ARB_texture_storage, E_GL_ARB_direct_state_access, + E_GL_ARB_texture_storage, E_GL_ARB_texture_storage_multisample, + E_GL_ARB_direct_state_access, E_GL_ARB_multi_draw_indirect, E_GL_ARB_indirect_parameters, E_GL_ARB_shader_draw_parameters, E_GL_ARB_gpu_shader5, E_GL_ARB_multi_bind, E_GL_ARB_shading_language_420pack, E_GL_ARB_vertex_attrib_binding, diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index 7b926059..4246f071 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -3450,14 +3450,13 @@ namespace MobileGL::MG_Backend::DirectGLES { auto* textureMipmapObject = static_cast(textureObject.get()); auto& levelRange = textureMipmapObject->GetLevelRange(); - MGLOG_D("GetTexImage: mipmap level range = [%d, %d)", levelRange.x(), levelRange.y()); + MGLOG_D("GetTexImage: mipmap level range = [%d, %d]", levelRange.x(), levelRange.y()); - if (level < levelRange.x() || level >= levelRange.y()) { - MGLOG_E("GetTexImage: Requested level %d out of range", level); - MOBILEGL_ASSERT(false, - "GetTexImage: Requested level %d is out of range " - "(base level %d, max level %d).", - level, levelRange.x(), levelRange.y()); + // levelRange.y() is GL_TEXTURE_MAX_LEVEL, an inclusive level index — a single-level + // texture has range [0, 0] and level 0 must be readable. + if (static_cast(level) < levelRange.x() || static_cast(level) > levelRange.y()) { + MGLOG_E("GetTexImage: Requested level %d is out of range (base level %u, max level %u), skipping readback", + level, levelRange.x(), levelRange.y()); return; } diff --git a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp index 44502133..4f9f4788 100644 --- a/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp +++ b/MobileGL/MG_Backend/DirectVulkan/BackendObject_DirectVulkan.cpp @@ -502,7 +502,8 @@ namespace MobileGL::MG_Backend::DirectVulkan { E_GL_ARB_program_interface_query, E_GL_ARB_framebuffer_object, E_GL_ARB_multi_draw_indirect, E_GL_ARB_indirect_parameters, E_GL_EXT_framebuffer_object, E_GL_ARB_depth_texture, E_GL_ARB_buffer_storage, - E_GL_ARB_texture_storage, E_GL_ARB_direct_state_access, + E_GL_ARB_texture_storage, E_GL_ARB_texture_storage_multisample, + E_GL_ARB_direct_state_access, E_GL_ARB_shader_draw_parameters, E_GL_ARB_gpu_shader_int64, E_GL_KHR_debug, E_GL_ARB_gpu_shader5, E_GL_ARB_multi_bind, E_GL_ARB_shading_language_420pack, E_GL_ARB_vertex_attrib_binding, E_GL_ARB_shader_image_size};