Przeglądaj źródła

shaderc: Remove unused uniforms from SPIRV shader.

Branimir Karadžić 7 lat temu
rodzic
commit
ec3241a869
1 zmienionych plików z 48 dodań i 2 usunięć
  1. 48 2
      tools/shaderc/shaderc_spirv.cpp

+ 48 - 2
tools/shaderc/shaderc_spirv.cpp

@@ -533,7 +533,7 @@ namespace bgfx { namespace spirv
 //		fprintf(stderr, "%s\n", _message);
 //	}
 
-	static bool compile(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _writer)
+	static bool compile(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _writer, bool _firstPass)
 	{
 		BX_UNUSED(_version);
 
@@ -627,6 +627,52 @@ namespace bgfx { namespace spirv
 				uint16_t size = 0;
 
 				program->buildReflection();
+
+				if (_firstPass)
+				{
+					const size_t strLength = bx::strLen("uniform");
+
+					// first time through, we just find unused uniforms and get rid of them
+					std::string output;
+					bx::Error err;
+					LineReader reader(_code.c_str() );
+					while (err.isOk() )
+					{
+						char str[4096];
+						int32_t len = bx::read(&reader, str, BX_COUNTOF(str), &err);
+						if (err.isOk() )
+						{
+							std::string strLine(str, len);
+
+							for (int32_t ii = 0, num = program->getNumLiveUniformVariables(); ii < num; ++ii)
+							{
+								size_t index = strLine.find("uniform ");
+								if (index == std::string::npos)
+								{
+									continue;
+								}
+
+								// matching lines like:  uniform u_name;
+								// we want to replace "uniform" with "static" so that it's no longer
+								// included in the uniform blob that the application must upload
+								// we can't just remove them, because unused functions might still reference
+								// them and cause a compile error when they're gone
+								if (!!bx::findIdentifierMatch(strLine.c_str(), program->getUniformName(ii) ) )
+								{
+									break;
+								}
+
+								strLine = strLine.replace(index, strLength, "static");
+							}
+
+							output += strLine;
+						}
+					}
+
+					// recompile with the unused uniforms converted to statics
+					return compile(_options, _version, output.c_str(), _writer, false);
+				}
+
 				{
 					uint16_t count = (uint16_t)program->getNumLiveUniformVariables();
 					bx::write(_writer, count);
@@ -723,7 +769,7 @@ namespace bgfx { namespace spirv
 
 	bool compileSPIRVShader(const Options& _options, uint32_t _version, const std::string& _code, bx::WriterI* _writer)
 	{
-		return spirv::compile(_options, _version, _code, _writer);
+		return spirv::compile(_options, _version, _code, _writer, true);
 	}
 
 } // namespace bgfx