[Fix] (MG_Backend/DirectVulkan): support Voxy rendering

Implemented:

- Advertise Voxy-required DirectVulkan extensions without raising the reported OpenGL version.

- Add DirectVulkan compute, indirect draw count, DSA, readback, and buffer state paths needed by Voxy.

Fixed:

- Enable Vulkan shaderInt64 and drawIndirectFirstInstance so Voxy baseInstance-driven LOD draws address the correct section data.

- Fix DirectVulkan synchronization, framebuffer, texture readback, and shader interface handling used by Voxy and Minecraft screenshots.

Tests:

- Add MG_Test coverage for DirectVulkan extension advertising, DSA buffer/texture/framebuffer/vertex-array behavior, persistent mapped readback, and shader/program paths.
This commit is contained in:
2026-06-09 00:37:37 +08:00
parent ab9db43599
commit cf165c0db5
65 changed files with 3724 additions and 239 deletions
@@ -38,6 +38,8 @@ namespace MobileGL {
return BufferTarget::DispatchIndirect;
case GL_DRAW_INDIRECT_BUFFER:
return BufferTarget::DrawIndirect;
case GL_PARAMETER_BUFFER_ARB:
return BufferTarget::Parameter;
case GL_SHADER_STORAGE_BUFFER:
return BufferTarget::ShaderStorage;
case GL_UNKNOWN_MGL:
@@ -84,4 +86,4 @@ namespace MobileGL {
return result;
}
} // namespace MG_Util
} // namespace MobileGL
} // namespace MobileGL
@@ -148,6 +148,17 @@ namespace MobileGL {
}
}
ProvokingVertexMode ConvertGLEnumToProvokingVertexMode(GLenum v) {
switch (v) {
case GL_FIRST_VERTEX_CONVENTION:
return ProvokingVertexMode::FirstVertex;
case GL_LAST_VERTEX_CONVENTION:
return ProvokingVertexMode::LastVertex;
default:
return ProvokingVertexMode::Unknown;
}
}
CapabilityInput ConvertGLEnumToCapabilityInput(GLenum v) {
switch (v) {
case GL_BLEND:
@@ -18,6 +18,7 @@ namespace MobileGL {
PixelStoreParam ConvertGLEnumToPixelStoreParam(GLenum value);
CullFaceMode ConvertGLEnumToCullFaceMode(GLenum value);
FrontFaceMode ConvertGLEnumToFrontFaceMode(GLenum value);
ProvokingVertexMode ConvertGLEnumToProvokingVertexMode(GLenum value);
CapabilityInput ConvertGLEnumToCapabilityInput(GLenum value);
} // namespace MG_Util
} // namespace MobileGL
@@ -38,6 +38,8 @@ namespace MobileGL {
return GL_DISPATCH_INDIRECT_BUFFER;
case BufferTarget::DrawIndirect:
return GL_DRAW_INDIRECT_BUFFER;
case BufferTarget::Parameter:
return GL_PARAMETER_BUFFER_ARB;
case BufferTarget::ShaderStorage:
return GL_SHADER_STORAGE_BUFFER;
case BufferTarget::Unknown:
@@ -84,4 +86,4 @@ namespace MobileGL {
return result;
}
} // namespace MG_Util
} // namespace MobileGL
} // namespace MobileGL
@@ -149,6 +149,17 @@ namespace MobileGL {
}
}
GLenum ConvertProvokingVertexModeToGLEnum(ProvokingVertexMode v) {
switch (v) {
case ProvokingVertexMode::FirstVertex:
return GL_FIRST_VERTEX_CONVENTION;
case ProvokingVertexMode::LastVertex:
return GL_LAST_VERTEX_CONVENTION;
default:
return GL_UNKNOWN_MGL;
}
}
GLenum ConvertCapabilityInputToGLEnum(CapabilityInput v) {
switch (v) {
case CapabilityInput::Blend:
@@ -18,6 +18,7 @@ namespace MobileGL {
GLenum ConvertPixelStoreParamToGLEnum(PixelStoreParam value);
GLenum ConvertCullFaceModeToGLEnum(CullFaceMode value);
GLenum ConvertFrontFaceModeToGLEnum(FrontFaceMode value);
GLenum ConvertProvokingVertexModeToGLEnum(ProvokingVertexMode value);
GLenum ConvertCapabilityInputToGLEnum(CapabilityInput value);
} // namespace MG_Util
} // namespace MobileGL
@@ -38,6 +38,8 @@ namespace MobileGL {
return "DispatchIndirect";
case BufferTarget::DrawIndirect:
return "DrawIndirect";
case BufferTarget::Parameter:
return "Parameter";
case BufferTarget::ShaderStorage:
return "ShaderStorage";
case BufferTarget::Unknown:
@@ -87,4 +89,4 @@ namespace MobileGL {
return result.empty() ? "[]" : result;
}
} // namespace MG_Util
} // namespace MobileGL
} // namespace MobileGL
@@ -131,6 +131,17 @@ namespace MobileGL {
}
}
String ConvertProvokingVertexModeToString(ProvokingVertexMode v) {
switch (v) {
case ProvokingVertexMode::FirstVertex:
return "FirstVertex";
case ProvokingVertexMode::LastVertex:
return "LastVertex";
default:
return "Unknown";
}
}
String ConvertCapabilityInputToString(CapabilityInput v) {
switch (v) {
case CapabilityInput::Blend:
@@ -17,6 +17,7 @@ namespace MobileGL {
String ConvertPixelStoreParamToString(PixelStoreParam value);
String ConvertCullFaceModeToString(CullFaceMode value);
String ConvertFrontFaceModeToString(FrontFaceMode value);
String ConvertProvokingVertexModeToString(ProvokingVertexMode value);
String ConvertCapabilityInputToString(CapabilityInput value);
} // namespace MG_Util
} // namespace MobileGL