From 10e4ea0f28803dbea4b74319f7bb917d1acf560c Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 24 Jul 2018 16:30:25 -0700 Subject: [core] Compress all shader source as a single corpus --- scripts/generate-shaders.js | 82 +++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 22 deletions(-) (limited to 'scripts/generate-shaders.js') diff --git a/scripts/generate-shaders.js b/scripts/generate-shaders.js index 39307f358a..5532bd33cd 100755 --- a/scripts/generate-shaders.js +++ b/scripts/generate-shaders.js @@ -12,24 +12,66 @@ delete shaders.lineGradient; require('./style-code'); -function compressedData(src) { - return zlib.deflateSync(src, {level: zlib.Z_BEST_COMPRESSION}) - .toString('hex') - .match(/.{1,16}/g) - .map(line => line.match(/.{1,2}/g).map(n => `0x${n}`).join(', ')) - .join(',\n ') - .trim(); +let concatenated = ''; +let offsets = {}; + +for (const key in shaders) { + const vertex = concatenated.length; + concatenated += shaders[key].vertexSource; + concatenated += '\0'; + + const fragment = concatenated.length; + concatenated += shaders[key].fragmentSource; + concatenated += '\0'; + + offsets[key] = {vertex, fragment}; +} + +const compressed = zlib.deflateSync(concatenated, {level: zlib.Z_BEST_COMPRESSION}) + .toString('hex') + .match(/.{1,16}/g) + .map(line => line.match(/.{1,2}/g).map(n => `0x${n}`).join(', ')) + .join(',\n ') + .trim(); + +function sourceOffset(key, type) { + return `source() + ${offsets[key][type]}` } -function compressedConstant(data) { - return `[] () { +writeIfModified(path.join(outputPath, 'source.hpp'), `// NOTE: DO NOT CHANGE THIS FILE. IT IS AUTOMATICALLY GENERATED. + +#pragma once + +namespace mbgl { +namespace shaders { + +const char* source(); + +} // namespace shaders +} // namespace mbgl +`); + +writeIfModified(path.join(outputPath, 'source.cpp'), `// NOTE: DO NOT CHANGE THIS FILE. IT IS AUTOMATICALLY GENERATED. + +#include +#include + +#include + +namespace mbgl { +namespace shaders { + +const char* source() { static const uint8_t compressed[] = { - ${compressedData(data)} + ${compressed} }; static std::string decompressed = util::decompress(std::string(reinterpret_cast(compressed), sizeof(compressed))); return decompressed.c_str(); -}()` -} +}; + +} // namespace shaders +} // namespace mbgl +`); writeIfModified(path.join(outputPath, 'preludes.hpp'), `// NOTE: DO NOT CHANGE THIS FILE. IT IS AUTOMATICALLY GENERATED. @@ -48,15 +90,13 @@ extern const char* fragmentPrelude; writeIfModified(path.join(outputPath, 'preludes.cpp'), `// NOTE: DO NOT CHANGE THIS FILE. IT IS AUTOMATICALLY GENERATED. #include -#include - -#include +#include namespace mbgl { namespace shaders { -const char* vertexPrelude = ${compressedConstant(shaders.prelude.vertexSource)}; -const char* fragmentPrelude = ${compressedConstant(shaders.prelude.fragmentSource)}; +const char* vertexPrelude = ${sourceOffset('prelude', 'vertex')}; +const char* fragmentPrelude = ${sourceOffset('prelude', 'fragment')}; } // namespace shaders } // namespace mbgl @@ -89,16 +129,14 @@ public: writeIfModified(path.join(outputPath, `${shaderName}.cpp`), `// NOTE: DO NOT CHANGE THIS FILE. IT IS AUTOMATICALLY GENERATED. #include -#include - -#include +#include namespace mbgl { namespace shaders { const char* ${shaderName}::name = "${shaderName}"; -const char* ${shaderName}::vertexSource = ${compressedConstant(shaders[key].vertexSource)}; -const char* ${shaderName}::fragmentSource = ${compressedConstant(shaders[key].fragmentSource)}; +const char* ${shaderName}::vertexSource = ${sourceOffset(key, 'vertex')}; +const char* ${shaderName}::fragmentSource = ${sourceOffset(key, 'fragment')}; } // namespace shaders } // namespace mbgl -- cgit v1.2.1