mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 21:58:31 +09:00
[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:
@@ -83,6 +83,7 @@ namespace MobileGL::MG_Util::BackendLoader {
|
||||
caps.DeviceName = p.deviceName;
|
||||
caps.DriverVersionString = DecodeDriverVersion(p.driverVersion);
|
||||
caps.UniformBufferOffsetAlignment = static_cast<int>(p.limits.minUniformBufferOffsetAlignment);
|
||||
caps.MaxShaderStorageBlockSize = static_cast<SizeT>(p.limits.maxStorageBufferRange);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -93,5 +94,6 @@ namespace MobileGL::MG_Util::BackendLoader {
|
||||
caps.DeviceName = properties.deviceName;
|
||||
caps.DriverVersionString = DecodeDriverVersion(properties.driverVersion);
|
||||
caps.UniformBufferOffsetAlignment = static_cast<int>(properties.limits.minUniformBufferOffsetAlignment);
|
||||
caps.MaxShaderStorageBlockSize = static_cast<SizeT>(properties.limits.maxStorageBufferRange);
|
||||
}
|
||||
} // namespace MobileGL::MG_Util::BackendLoader
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace MobileGL {
|
||||
String DeviceName;
|
||||
String DriverVersionString;
|
||||
Int UniformBufferOffsetAlignment = 256;
|
||||
SizeT MaxShaderStorageBlockSize = 128 * 1024 * 1024;
|
||||
};
|
||||
} // namespace MG_External
|
||||
namespace MG_Util::BackendLoader {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -190,6 +190,18 @@ namespace {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void InjectDepthRangeBuiltinShim(MobileGL::ShaderStage stage, MobileGL::String& source) {
|
||||
if (stage != MobileGL::ShaderStage::Fragment) return;
|
||||
if (source.find("gl_DepthRange") == MobileGL::String::npos) return;
|
||||
if (source.find("mg_DepthRangeParameters") != MobileGL::String::npos) return;
|
||||
|
||||
constexpr const char* shim =
|
||||
"struct mg_DepthRangeParameters { float near; float far; float diff; };\n"
|
||||
"const mg_DepthRangeParameters mg_DepthRange = mg_DepthRangeParameters(0.0, 1.0, 1.0);\n"
|
||||
"#define gl_DepthRange mg_DepthRange\n";
|
||||
source.insert(FindAfterVersionDirective(source), shim);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace MobileGL {
|
||||
@@ -272,6 +284,7 @@ namespace MobileGL {
|
||||
RenameBuiltinShadowingFunction(source, "tanh", "mg_tanh");
|
||||
RenameBuiltinShadowingFunction(source, "fma", "mg_fma");
|
||||
ModernizeLegacyGLSL(stage, source);
|
||||
InjectDepthRangeBuiltinShim(stage, source);
|
||||
}
|
||||
|
||||
} // namespace ShaderTranspiler
|
||||
|
||||
@@ -178,6 +178,7 @@ namespace MobileGL::MG_Util::TextureFormatProcessor {
|
||||
break;
|
||||
|
||||
// Depth Stencil
|
||||
case GL_DEPTH24_STENCIL8:
|
||||
case GL_DEPTH32F_STENCIL8:
|
||||
case GL_DEPTH_STENCIL:
|
||||
*outFormat = GL_DEPTH_STENCIL;
|
||||
@@ -332,9 +333,12 @@ namespace MobileGL::MG_Util::TextureFormatProcessor {
|
||||
|
||||
// Depth Stencil
|
||||
case GL_DEPTH32F_STENCIL8:
|
||||
case GL_DEPTH_STENCIL:
|
||||
*outType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
|
||||
break;
|
||||
case GL_DEPTH24_STENCIL8:
|
||||
case GL_DEPTH_STENCIL:
|
||||
*outType = GL_UNSIGNED_INT_24_8;
|
||||
break;
|
||||
|
||||
default:
|
||||
MGLOG_E("NormalizePixelFormat: outType: unhandled internalFormat: %s",
|
||||
@@ -345,4 +349,4 @@ namespace MobileGL::MG_Util::TextureFormatProcessor {
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace MobileGL::MG_Util::TextureFormatProcessor
|
||||
} // namespace MobileGL::MG_Util::TextureFormatProcessor
|
||||
|
||||
Reference in New Issue
Block a user