[Fix] (MG_State/Program): properly invoke SPIR-V sanitize routine

This commit is contained in:
2026-01-24 19:22:13 +08:00
parent eac7a9e474
commit e9ef6db44b
3 changed files with 33 additions and 30 deletions
+27 -27
View File
@@ -899,41 +899,41 @@ namespace MobileGL::MG_Backend::DirectGLES {
source = ForceSupporterOutput(source); source = ForceSupporterOutput(source);
// TODO: probably a patch system? // TODO: probably a patch system?
String findStr = "if (distance_weight_sum == 0.0)"; // String findStr = "if (distance_weight_sum == 0.0)";
String replaceStr = "if (distance_weight_sum <= 0.0001)"; // String replaceStr = "if (distance_weight_sum <= 0.0001)";
auto pos = source.find(findStr); // auto pos = source.find(findStr);
while (pos != String::npos) { // while (pos != String::npos) {
MGLOG_D("Applying patch #1 to Photon..."); // MGLOG_D("Applying patch #1 to Photon...");
source.replace(pos, findStr.length(), replaceStr); // source.replace(pos, findStr.length(), replaceStr);
pos = source.find(findStr, pos); // pos = source.find(findStr, pos);
} // }
findStr = "1000000.0"; String findStr = "1000000.0";
replaceStr = "65500.0"; String replaceStr = "65500.0";
pos = source.find(findStr); auto pos = source.find(findStr);
while (pos != String::npos) { while (pos != String::npos) {
MGLOG_D("Applying patch #2 to Photon..."); MGLOG_D("Applying patch #2 to Photon...");
source.replace(pos, findStr.length(), replaceStr); source.replace(pos, findStr.length(), replaceStr);
pos = source.find(findStr, pos); pos = source.find(findStr, pos);
} }
findStr = "if (gtao.w == 0.0)"; // findStr = "if (gtao.w == 0.0)";
replaceStr = "if (abs(gtao.w) <= 0.00001)"; // replaceStr = "if (abs(gtao.w) <= 0.00001)";
pos = source.find(findStr); // pos = source.find(findStr);
while (pos != String::npos) { // while (pos != String::npos) {
MGLOG_D("Applying patch #3 to Photon..."); // MGLOG_D("Applying patch #3 to Photon...");
source.replace(pos, findStr.length(), replaceStr); // source.replace(pos, findStr.length(), replaceStr);
pos = source.find(findStr, pos); // pos = source.find(findStr, pos);
} // }
findStr = "== 0.0"; // findStr = "== 0.0";
replaceStr = "<= 0.00001"; // replaceStr = "<= 0.00001";
pos = source.find(findStr); // pos = source.find(findStr);
while (pos != String::npos) { // while (pos != String::npos) {
MGLOG_D("Applying patch #4 to Photon..."); // MGLOG_D("Applying patch #4 to Photon...");
source.replace(pos, findStr.length(), replaceStr); // source.replace(pos, findStr.length(), replaceStr);
pos = source.find(findStr, pos); // pos = source.find(findStr, pos);
} // }
const char* sourceCStr = source.c_str(); const char* sourceCStr = source.c_str();
MGLOG_D("Setting shader source for backend shader ID: %u\nsrc:\n%s", backendShaderId, sourceCStr); MGLOG_D("Setting shader source for backend shader ID: %u\nsrc:\n%s", backendShaderId, sourceCStr);
@@ -453,11 +453,13 @@ namespace MobileGL {
MGLOG_D("ProgramObject %u: GenerateBinary - generated %zu SPIR-V modules", m_externalIndex, MGLOG_D("ProgramObject %u: GenerateBinary - generated %zu SPIR-V modules", m_externalIndex,
m_generatedSpirv.size()); m_generatedSpirv.size());
for (SizeT i = 0; i < m_generatedSpirv.size(); i++) { for (auto& spv: m_generatedSpirv) {
auto& spv = m_generatedSpirv[i];
auto success = ShaderCompiler::SanitizeBinary(spv, spv); auto success = ShaderCompiler::SanitizeBinary(spv, spv);
MOBILEGL_ASSERT(success, "SanitizeBinary failed"); MOBILEGL_ASSERT(success, "SanitizeBinary failed");
}
for (SizeT i = 0; i < m_generatedSpirv.size(); i++) {
auto& spv = m_generatedSpirv[i];
auto shaderType = shaderTypes[i]; auto shaderType = shaderTypes[i];
MGLOG_D("ProgramObject %u: GenerateBinary - parsing SPIR-V meta data for module %zu " MGLOG_D("ProgramObject %u: GenerateBinary - parsing SPIR-V meta data for module %zu "
@@ -72,6 +72,7 @@ namespace MobileGL {
} }
// --- Found it, continue to patch it --- // --- Found it, continue to patch it ---
MGLOG_D("Found 1 occurrence of `FloatEqualsZero`, patching");
// 1. Get var type (Float) and result type (Bool) // 1. Get var type (Float) and result type (Bool)
uint32_t float_type_id = def_use_mgr->GetDef(var_id)->type_id(); uint32_t float_type_id = def_use_mgr->GetDef(var_id)->type_id();