mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-10 13:18:31 +09:00
82 lines
3.5 KiB
C++
82 lines
3.5 KiB
C++
// MobileGL - MobileGL/MG_Util/ShaderTranspiler/ShaderSourceProcessor.cpp
|
|
// Copyright (c) 2025-2026 MobileGL-Dev
|
|
// Licensed under the GNU Lesser General Public License v2.1:
|
|
// http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
|
|
// SPDX-License-Identifier: LGPL-2.1-only
|
|
// End of Source File Header
|
|
|
|
#include "ShaderSourceProcessor.h"
|
|
|
|
namespace MobileGL {
|
|
namespace MG_Util {
|
|
namespace ShaderTranspiler {
|
|
void PreprocessShaderSource(ShaderStage stage, String& source) {
|
|
// remove multi-line comment
|
|
size_t commentStartPos = source.find("/*");
|
|
while (commentStartPos != String::npos) {
|
|
size_t commentEndPos = source.find("*/", commentStartPos);
|
|
// + length of "*/"
|
|
source = source.replace(commentStartPos, commentEndPos - commentStartPos + 2, "");
|
|
commentStartPos = source.find("/*", commentStartPos);
|
|
}
|
|
|
|
// remove #line directives
|
|
SizeT linedirPos = source.find("#line");
|
|
while (linedirPos != String::npos) {
|
|
SizeT newlinePos = source.find('\n', linedirPos);
|
|
// + length of "\n"
|
|
source = source.replace(linedirPos, newlinePos - linedirPos + 1, "");
|
|
linedirPos = source.find("#line", linedirPos);
|
|
}
|
|
|
|
// remove "noperspective"
|
|
const char* str_np = "noperspective";
|
|
const SizeT len_np = strlen(str_np);
|
|
SizeT noperspectivePos = source.find(str_np);
|
|
while (noperspectivePos != String::npos) {
|
|
// + length of "\n"
|
|
source = source.replace(noperspectivePos, len_np, "");
|
|
noperspectivePos = source.find(str_np);
|
|
}
|
|
|
|
// force #version
|
|
ShaderProfile profile = ShaderProfile::Core;
|
|
SizeT versionPos = source.find("#version");
|
|
SizeT lineEnd = source.find('\n', versionPos);
|
|
|
|
if (versionPos != String::npos) {
|
|
String versionLine = source.substr(versionPos, lineEnd - versionPos);
|
|
|
|
if (versionLine.find("ES") != String::npos)
|
|
profile = ShaderProfile::ES;
|
|
else if (versionLine.find("compatibility") != String::npos)
|
|
profile = ShaderProfile::Compatibility;
|
|
else
|
|
profile = ShaderProfile::Core;
|
|
} else {
|
|
profile = ShaderProfile::Core;
|
|
source.insert(0, "#version 460 core\n");
|
|
return;
|
|
}
|
|
|
|
SizeT firstLineEnd = lineEnd;
|
|
|
|
if (profile != ShaderProfile::ES) {
|
|
constexpr const char* versionDirectiveCore = "#version 460 core\n";
|
|
constexpr const char* versionDirectiveCompat = "#version 460 compatibility\n";
|
|
|
|
const char* replacement =
|
|
(profile == ShaderProfile::Compatibility) ? versionDirectiveCompat : versionDirectiveCore;
|
|
|
|
if (firstLineEnd != String::npos) {
|
|
source.replace(versionPos, firstLineEnd - versionPos + 1, replacement);
|
|
} else {
|
|
source = replacement;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace ShaderTranspiler
|
|
} // namespace MG_Util
|
|
} // namespace MobileGL
|