mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Fix] (MG_Backend/DirectGLES): avoid ANGLE llvmpipe mipmap hangs
This commit is contained in:
@@ -30,6 +30,29 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
constexpr Bool PREFER_MAP_BUFFER_RANGE_FOR_BUFFER_SYNC = false;
|
constexpr Bool PREFER_MAP_BUFFER_RANGE_FOR_BUFFER_SYNC = false;
|
||||||
constexpr const char* BASE_INSTANCE_UNIFORM_NAME = "mg_BaseInstance";
|
constexpr const char* BASE_INSTANCE_UNIFORM_NAME = "mg_BaseInstance";
|
||||||
|
|
||||||
|
static Bool ShouldAvoidMipmapMinFilterOnAngleLlvmpipe() {
|
||||||
|
return g_GLESCapabilities.GLESRendererString.find("ANGLE") != String::npos &&
|
||||||
|
g_GLESCapabilities.GLESRendererString.find("llvmpipe") != String::npos;
|
||||||
|
}
|
||||||
|
|
||||||
|
static GLenum ResolveBackendMinFilter(const SamplerParameters& samplerParams) {
|
||||||
|
GLenum filter = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter,
|
||||||
|
samplerParams.mipmapMode);
|
||||||
|
if (!ShouldAvoidMipmapMinFilterOnAngleLlvmpipe()) {
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
switch (filter) {
|
||||||
|
case GL_NEAREST_MIPMAP_NEAREST:
|
||||||
|
case GL_NEAREST_MIPMAP_LINEAR:
|
||||||
|
return GL_NEAREST;
|
||||||
|
case GL_LINEAR_MIPMAP_NEAREST:
|
||||||
|
case GL_LINEAR_MIPMAP_LINEAR:
|
||||||
|
return GL_LINEAR;
|
||||||
|
default:
|
||||||
|
return filter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static Uint ResolveBackendEsslVersion() {
|
static Uint ResolveBackendEsslVersion() {
|
||||||
const auto& version = g_GLESCapabilities.GLESVersion;
|
const auto& version = g_GLESCapabilities.GLESVersion;
|
||||||
if (version.Major > 3 || (version.Major == 3 && version.Minor >= 2)) {
|
if (version.Major > 3 || (version.Major == 3 && version.Minor >= 2)) {
|
||||||
@@ -1191,8 +1214,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
||||||
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
||||||
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER,
|
g_GLESFuncs.glTexParameteri(target, GL_TEXTURE_MIN_FILTER,
|
||||||
(GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter,
|
(GLint)ResolveBackendMinFilter(samplerParams));
|
||||||
samplerParams.mipmapMode));
|
|
||||||
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
||||||
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
||||||
}
|
}
|
||||||
@@ -1940,8 +1962,7 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter ||
|
||||||
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
m_cacheSamplerParameters.mipmapMode != samplerParams.mipmapMode) {
|
||||||
g_GLESFuncs.glSamplerParameteri(m_backendSamplerId, GL_TEXTURE_MIN_FILTER,
|
g_GLESFuncs.glSamplerParameteri(m_backendSamplerId, GL_TEXTURE_MIN_FILTER,
|
||||||
(GLint)MG_Util::ConvertSamplerFilterModeToGLEnum(
|
(GLint)ResolveBackendMinFilter(samplerParams));
|
||||||
samplerParams.minFilter, samplerParams.mipmapMode));
|
|
||||||
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
m_cacheSamplerParameters.minFilter = samplerParams.minFilter;
|
||||||
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user