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