[Feat|Fix] (...): Add/Fix lots of stuff, being able not to crash in MC.

This commit is contained in:
BZLZHH
2025-10-06 16:08:35 +08:00
parent e37dedb72d
commit bd1056f9c9
36 changed files with 1164 additions and 201 deletions
@@ -863,21 +863,45 @@ namespace MobileGL {
if (libEGL != NULL) { \
MG_External::EGL::name = (MG_External::EGL::name##_PTR)ProcAddress(libEGL, #name); \
}
void InitEGL() {
INIT_EGL_FUNC(eglGetProcAddress)
INIT_EGL_FUNC(eglBindAPI)
INIT_EGL_FUNC(eglInitialize)
INIT_EGL_FUNC(eglGetDisplay)
INIT_EGL_FUNC(eglCreatePbufferSurface)
INIT_EGL_FUNC(eglDestroySurface)
INIT_EGL_FUNC(eglDestroyContext)
INIT_EGL_FUNC(eglMakeCurrent)
INIT_EGL_FUNC(eglBindTexImage)
INIT_EGL_FUNC(eglChooseConfig)
INIT_EGL_FUNC(eglCopyBuffers)
INIT_EGL_FUNC(eglCreateContext)
INIT_EGL_FUNC(eglQueryString)
INIT_EGL_FUNC(eglTerminate)
INIT_EGL_FUNC(eglCreatePbufferFromClientBuffer)
INIT_EGL_FUNC(eglCreatePbufferSurface)
INIT_EGL_FUNC(eglCreatePixmapSurface)
INIT_EGL_FUNC(eglCreatePlatformWindowSurface)
INIT_EGL_FUNC(eglCreateWindowSurface)
INIT_EGL_FUNC(eglDestroyContext)
INIT_EGL_FUNC(eglDestroySurface)
INIT_EGL_FUNC(eglGetConfigAttrib)
INIT_EGL_FUNC(eglGetConfigs)
INIT_EGL_FUNC(eglGetCurrentContext)
INIT_EGL_FUNC(eglGetCurrentDisplay)
INIT_EGL_FUNC(eglGetCurrentSurface)
INIT_EGL_FUNC(eglGetDisplay)
INIT_EGL_FUNC(eglGetPlatformDisplay)
INIT_EGL_FUNC(eglGetError)
INIT_EGL_FUNC(eglGetProcAddress)
INIT_EGL_FUNC(eglInitialize)
INIT_EGL_FUNC(eglMakeCurrent)
INIT_EGL_FUNC(eglQueryAPI)
INIT_EGL_FUNC(eglQueryContext)
INIT_EGL_FUNC(eglQueryString)
INIT_EGL_FUNC(eglQuerySurface)
INIT_EGL_FUNC(eglReleaseTexImage)
INIT_EGL_FUNC(eglReleaseThread)
INIT_EGL_FUNC(eglSurfaceAttrib)
INIT_EGL_FUNC(eglSwapBuffers)
INIT_EGL_FUNC(eglSwapBuffersWithDamageEXT)
INIT_EGL_FUNC(eglSwapInterval)
INIT_EGL_FUNC(eglTerminate)
INIT_EGL_FUNC(eglUnlockSurfaceKHR)
INIT_EGL_FUNC(eglWaitClient)
INIT_EGL_FUNC(eglWaitGL)
INIT_EGL_FUNC(eglWaitNative)
EGLint configAttribs[] = {EGL_RED_SIZE,
8,
@@ -26,8 +26,6 @@ namespace MobileGL {
return FramebufferAttachmentType::Depth;
case GL_STENCIL_ATTACHMENT:
return FramebufferAttachmentType::Stencil;
case GL_DEPTH_STENCIL_ATTACHMENT:
return FramebufferAttachmentType::DepthStencil;
case GL_UNKNOWN_MGL:
default:
return FramebufferAttachmentType::Unknown;
@@ -305,5 +305,76 @@ namespace MobileGL {
}
}
SamplerFilterMode ConvertGLEnumToSamplerFilterMode(GLenum v) {
switch (v) {
case GL_NEAREST:
return SamplerFilterMode::Nearest;
case GL_LINEAR:
return SamplerFilterMode::Linear;
default:
return SamplerFilterMode::Unknown;
}
}
SamplerMipmapMode ConvertGLEnumToSamplerMipmapMode(GLenum v) {
switch (v) {
case 0:
return SamplerMipmapMode::None; // 无 mipmap 时
case GL_NEAREST_MIPMAP_NEAREST:
return SamplerMipmapMode::Nearest;
default:
return SamplerMipmapMode::Unknown;
}
}
SamplerWrapMode ConvertGLEnumToSamplerWrapMode(GLenum v) {
switch (v) {
case GL_CLAMP_TO_EDGE:
return SamplerWrapMode::ClampToEdge;
case GL_MIRRORED_REPEAT:
return SamplerWrapMode::MirroredRepeat;
case GL_REPEAT:
return SamplerWrapMode::Repeat;
case GL_CLAMP_TO_BORDER:
return SamplerWrapMode::ClampToBorder;
default:
return SamplerWrapMode::Unknown;
}
}
SamplerCompareMode ConvertGLEnumToSamplerCompareMode(GLenum v) {
switch (v) {
case 0:
return SamplerCompareMode::None; // 无 compare
case GL_COMPARE_REF_TO_TEXTURE:
return SamplerCompareMode::CompareToTexture;
default:
return SamplerCompareMode::Unknown;
}
}
SamplerCompareFunc ConvertGLEnumToSamplerCompareFunc(GLenum v) {
switch (v) {
case GL_NEVER:
return SamplerCompareFunc::Never;
case GL_LESS:
return SamplerCompareFunc::Less;
case GL_EQUAL:
return SamplerCompareFunc::Equal;
case GL_LEQUAL:
return SamplerCompareFunc::LessEqual;
case GL_GREATER:
return SamplerCompareFunc::Greater;
case GL_NOTEQUAL:
return SamplerCompareFunc::NotEqual;
case GL_GEQUAL:
return SamplerCompareFunc::GreaterEqual;
case GL_ALWAYS:
return SamplerCompareFunc::Always;
default:
return SamplerCompareFunc::Unknown;
}
}
} // namespace MG_Util
} // namespace MobileGL
@@ -9,5 +9,10 @@ namespace MobileGL {
TextureInternalFormat ConvertGLEnumToTextureInternalFormat(GLenum internalformat);
TexturePixelDataType ConvertGLEnumToTexturePixelDataType(GLenum type);
TextureUploadTarget ConvertGLEnumToTextureUploadTarget(GLenum target);
SamplerFilterMode ConvertGLEnumToSamplerFilterMode(GLenum value);
SamplerMipmapMode ConvertGLEnumToSamplerMipmapMode(GLenum value);
SamplerWrapMode ConvertGLEnumToSamplerWrapMode(GLenum value);
SamplerCompareMode ConvertGLEnumToSamplerCompareMode(GLenum value);
SamplerCompareFunc ConvertGLEnumToSamplerCompareFunc(GLenum value);
} // namespace MG_Util
} // namespace MobileGL
@@ -25,8 +25,6 @@ namespace MobileGL {
return GL_DEPTH_ATTACHMENT;
case FramebufferAttachmentType::Stencil:
return GL_STENCIL_ATTACHMENT;
case FramebufferAttachmentType::DepthStencil:
return GL_DEPTH_STENCIL_ATTACHMENT;
default:
return GL_COLOR_ATTACHMENT0;
}
@@ -305,5 +305,76 @@ namespace MobileGL {
}
}
GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode v) {
switch (v) {
case SamplerFilterMode::Nearest:
return GL_NEAREST;
case SamplerFilterMode::Linear:
return GL_LINEAR;
default:
return 0;
}
}
GLenum ConvertSamplerMipmapModeToGLEnum(SamplerMipmapMode v) {
switch (v) {
case SamplerMipmapMode::None:
return 0;
case SamplerMipmapMode::Nearest:
return GL_NEAREST_MIPMAP_NEAREST;
default:
return 0;
}
}
GLenum ConvertSamplerWrapModeToGLEnum(SamplerWrapMode v) {
switch (v) {
case SamplerWrapMode::ClampToEdge:
return GL_CLAMP_TO_EDGE;
case SamplerWrapMode::MirroredRepeat:
return GL_MIRRORED_REPEAT;
case SamplerWrapMode::Repeat:
return GL_REPEAT;
case SamplerWrapMode::ClampToBorder:
return GL_CLAMP_TO_BORDER;
default:
return 0;
}
}
GLenum ConvertSamplerCompareModeToGLEnum(SamplerCompareMode v) {
switch (v) {
case SamplerCompareMode::None:
return 0;
case SamplerCompareMode::CompareToTexture:
return GL_COMPARE_REF_TO_TEXTURE;
default:
return 0;
}
}
GLenum ConvertSamplerCompareFuncToGLEnum(SamplerCompareFunc v) {
switch (v) {
case SamplerCompareFunc::Never:
return GL_NEVER;
case SamplerCompareFunc::Less:
return GL_LESS;
case SamplerCompareFunc::Equal:
return GL_EQUAL;
case SamplerCompareFunc::LessEqual:
return GL_LEQUAL;
case SamplerCompareFunc::Greater:
return GL_GREATER;
case SamplerCompareFunc::NotEqual:
return GL_NOTEQUAL;
case SamplerCompareFunc::GreaterEqual:
return GL_GEQUAL;
case SamplerCompareFunc::Always:
return GL_ALWAYS;
default:
return 0;
}
}
} // namespace MG_Util
} // namespace MobileGL
@@ -9,5 +9,10 @@ namespace MobileGL {
GLenum ConvertTextureInternalFormatToGLEnum(TextureInternalFormat internalformat);
GLenum ConvertTexturePixelDataTypeToGLEnum(TexturePixelDataType type);
GLenum ConvertTextureUploadTargetToGLEnum(TextureUploadTarget target);
GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode value);
GLenum ConvertSamplerMipmapModeToGLEnum(SamplerMipmapMode value);
GLenum ConvertSamplerWrapModeToGLEnum(SamplerWrapMode value);
GLenum ConvertSamplerCompareModeToGLEnum(SamplerCompareMode value);
GLenum ConvertSamplerCompareFuncToGLEnum(SamplerCompareFunc value);
} // namespace MG_Util
} // namespace MobileGL
@@ -25,8 +25,6 @@ namespace MobileGL {
return "Depth";
case FramebufferAttachmentType::Stencil:
return "Stencil";
case FramebufferAttachmentType::DepthStencil:
return "DepthStencil";
case FramebufferAttachmentType::Unknown:
default:
return "Unknown";
@@ -300,5 +300,76 @@ namespace MobileGL {
return "Unknown";
}
}
String ConvertSamplerFilterModeToString(SamplerFilterMode v) {
switch (v) {
case SamplerFilterMode::Nearest:
return "Nearest";
case SamplerFilterMode::Linear:
return "Linear";
default:
return "Unknown";
}
}
String ConvertSamplerMipmapModeToString(SamplerMipmapMode v) {
switch (v) {
case SamplerMipmapMode::None:
return "None";
case SamplerMipmapMode::Nearest:
return "Nearest";
default:
return "Unknown";
}
}
String ConvertSamplerWrapModeToString(SamplerWrapMode v) {
switch (v) {
case SamplerWrapMode::ClampToEdge:
return "ClampToEdge";
case SamplerWrapMode::MirroredRepeat:
return "MirroredRepeat";
case SamplerWrapMode::Repeat:
return "Repeat";
case SamplerWrapMode::ClampToBorder:
return "ClampToBorder";
default:
return "Unknown";
}
}
String ConvertSamplerCompareModeToString(SamplerCompareMode v) {
switch (v) {
case SamplerCompareMode::None:
return "None";
case SamplerCompareMode::CompareToTexture:
return "CompareToTexture";
default:
return "Unknown";
}
}
String ConvertSamplerCompareFuncToString(SamplerCompareFunc v) {
switch (v) {
case SamplerCompareFunc::Never:
return "Never";
case SamplerCompareFunc::Less:
return "Less";
case SamplerCompareFunc::Equal:
return "Equal";
case SamplerCompareFunc::LessEqual:
return "LessEqual";
case SamplerCompareFunc::Greater:
return "Greater";
case SamplerCompareFunc::NotEqual:
return "NotEqual";
case SamplerCompareFunc::GreaterEqual:
return "GreaterEqual";
case SamplerCompareFunc::Always:
return "Always";
default:
return "Unknown";
}
}
} // namespace MG_Util
} // namespace MobileGL
@@ -9,5 +9,10 @@ namespace MobileGL {
String ConvertTextureInternalFormatToString(TextureInternalFormat internalformat);
String ConvertTexturePixelDataTypeToString(TexturePixelDataType type);
String ConvertTextureUploadTargetToString(TextureUploadTarget target);
String ConvertSamplerFilterModeToString(SamplerFilterMode value);
String ConvertSamplerMipmapModeToString(SamplerMipmapMode value);
String ConvertSamplerWrapModeToString(SamplerWrapMode value);
String ConvertSamplerCompareModeToString(SamplerCompareMode value);
String ConvertSamplerCompareFuncToString(SamplerCompareFunc value);
} // namespace MG_Util
} // namespace MobileGL
+22 -1
View File
@@ -61,6 +61,28 @@ namespace MobileGL {
m_active_count--;
}
bool Insert(IndexType index) noexcept {
if (IsValid(index)) return false;
if (index >= m_valid_bits.size()) {
m_valid_bits.resize(index + 1, false);
}
auto it = std::find(m_free_list.begin(), m_free_list.end(), index);
if (it != m_free_list.end()) {
m_free_list.erase(it);
}
m_valid_bits[index] = true;
m_active_count++;
if (index >= m_next_index) {
m_next_index = index + 1;
}
return true;
}
bool IsValid(IndexType index) const noexcept { return index < m_valid_bits.size() && m_valid_bits[index]; }
SizeT FreeListSize() const noexcept { return m_free_list.size(); }
@@ -74,5 +96,4 @@ namespace MobileGL {
std::vector<IndexType> m_free_list;
std::vector<bool> m_valid_bits;
};
} // namespace MobileGL
@@ -132,7 +132,7 @@ namespace MobileGL {
tshader->setStrings(src, 1);
tshader->setInvertY(true);
if (attrib.flags & ShaderCompileBits::CompileForOpenGL) {
tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientOpenGL, 450);
tshader->setEnvInput(glslang::EShSourceGlsl, lang, glslang::EShClientVulkan, 450);
tshader->setEnvClient(glslang::EShClientOpenGL, glslang::EShTargetOpenGL_450);
tshader->setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5);
} else {