Browse Source

Minor fixes

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
80d50dd085

+ 10 - 10
AnKi/ShaderCompiler/Glslang.cpp

@@ -214,7 +214,7 @@ static Error parseErrorLine(CString error, GenericMemoryPoolAllocator<U8> alloc,
 			if(tokens.getSize() < 3 || (tokens.getBegin() + 2)->toNumber(lineNumber) != Error::NONE)
 			{
 
-				ANKI_SHADER_COMPILER_LOGE("Failed to parse the error message: %s", error.cstr());
+				ANKI_SHADER_COMPILER_LOGE("Failed to parse the GLSlang error message: %s", error.cstr());
 				return Error::FUNCTION_FAILED;
 			}
 			else
@@ -227,11 +227,13 @@ static Error parseErrorLine(CString error, GenericMemoryPoolAllocator<U8> alloc,
 	return Error::NONE;
 }
 
-static Error logShaderErrorCode(CString error, CString source, GenericMemoryPoolAllocator<U8> alloc)
+static void createErrorLog(CString glslangError, CString source, GenericMemoryPoolAllocator<U8> alloc,
+						   StringAuto& outError)
 {
 	U32 errorLineNumberu = 0;
-	ANKI_CHECK(parseErrorLine(error, alloc, errorLineNumberu));
-	const I32 errorLineNumber = I32(errorLineNumberu);
+	const Error err = parseErrorLine(glslangError, alloc, errorLineNumberu);
+
+	const I32 errorLineNumber = (!err) ? I32(errorLineNumberu) : -1;
 
 	constexpr I32 lineCountAroundError = 4;
 
@@ -252,9 +254,7 @@ static Error logShaderErrorCode(CString error, CString source, GenericMemoryPool
 		}
 	}
 
-	ANKI_SHADER_COMPILER_LOGE("Shader compilation failed:\n%sIn:\n%s\n", error.cstr(), prettySrc.cstr());
-
-	return Error::NONE;
+	outError.sprintf("%sIn:\n%s\n", glslangError.cstr(), prettySrc.cstr());
 }
 
 Error preprocessGlsl(CString in, StringAuto& out)
@@ -278,7 +278,7 @@ Error preprocessGlsl(CString in, StringAuto& out)
 }
 
 Error compilerGlslToSpirv(CString src, ShaderType shaderType, GenericMemoryPoolAllocator<U8> tmpAlloc,
-						  DynamicArrayAuto<U8>& spirv)
+						  DynamicArrayAuto<U8>& spirv, StringAuto& errorMessage)
 {
 #if ANKI_GLSLANG_DUMP
 	// Dump it
@@ -307,7 +307,7 @@ Error compilerGlslToSpirv(CString src, ShaderType shaderType, GenericMemoryPoolA
 	shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_4);
 	if(!shader.parse(&GLSLANG_LIMITS, 100, false, messages))
 	{
-		ANKI_CHECK(logShaderErrorCode(shader.getInfoLog(), src, tmpAlloc));
+		createErrorLog(shader.getInfoLog(), src, tmpAlloc, errorMessage);
 		return Error::USER_DATA;
 	}
 
@@ -317,7 +317,7 @@ Error compilerGlslToSpirv(CString src, ShaderType shaderType, GenericMemoryPoolA
 
 	if(!program.link(messages))
 	{
-		ANKI_SHADER_COMPILER_LOGE("glslang failed to link a shader");
+		errorMessage.create("glslang failed to link a shader");
 		return Error::USER_DATA;
 	}
 

+ 1 - 1
AnKi/ShaderCompiler/Glslang.h

@@ -19,7 +19,7 @@ Error preprocessGlsl(CString in, StringAuto& out);
 
 /// Compile glsl to SPIR-V.
 Error compilerGlslToSpirv(CString src, ShaderType shaderType, GenericMemoryPoolAllocator<U8> tmpAlloc,
-						  DynamicArrayAuto<U8>& spirv);
+						  DynamicArrayAuto<U8>& spirv, StringAuto& errorMessage);
 /// @}
 
 } // end namespace anki

+ 11 - 4
AnKi/ShaderCompiler/ShaderProgramCompiler.cpp

@@ -168,7 +168,7 @@ static Bool spinDials(DynamicArrayAuto<U32>& dials, ConstWeakArray<ShaderProgram
 
 static Error compileSpirv(ConstWeakArray<MutatorValue> mutation, const ShaderProgramParser& parser,
 						  GenericMemoryPoolAllocator<U8>& tmpAlloc,
-						  Array<DynamicArrayAuto<U8>, U32(ShaderType::COUNT)>& spirv)
+						  Array<DynamicArrayAuto<U8>, U32(ShaderType::COUNT)>& spirv, StringAuto& errorLog)
 {
 	// Generate the source and the rest for the variant
 	ShaderProgramParserVariant parserVariant;
@@ -183,7 +183,8 @@ static Error compileSpirv(ConstWeakArray<MutatorValue> mutation, const ShaderPro
 		}
 
 		// Compile
-		ANKI_CHECK(compilerGlslToSpirv(parserVariant.getSource(shaderType), shaderType, tmpAlloc, spirv[shaderType]));
+		ANKI_CHECK(compilerGlslToSpirv(parserVariant.getSource(shaderType), shaderType, tmpAlloc, spirv[shaderType],
+									   errorLog));
 		ANKI_ASSERT(spirv[shaderType].getSize() > 0);
 	}
 
@@ -253,7 +254,8 @@ static void compileVariantAsync(ConstWeakArray<MutatorValue> mutation, const Sha
 																	   {tmpAlloc},
 																	   {tmpAlloc},
 																	   {tmpAlloc}}};
-		const Error err = compileSpirv(ctx.m_mutation, *ctx.m_parser, tmpAlloc, spirvs);
+		StringAuto errorLog(tmpAlloc);
+		const Error err = compileSpirv(ctx.m_mutation, *ctx.m_parser, tmpAlloc, spirvs, errorLog);
 
 		if(!err)
 		{
@@ -304,7 +306,12 @@ static void compileVariantAsync(ConstWeakArray<MutatorValue> mutation, const Sha
 		}
 		else
 		{
-			ctx.m_err->store(err._getCode());
+			// Inform about the error and print only one error message. Ignore other messages
+			const Error prevErr = ctx.m_err->exchange(err._getCode());
+			if(!prevErr)
+			{
+				ANKI_SHADER_COMPILER_LOGE("GLSL compilation failed:\n%s", errorLog.cstr());
+			}
 		}
 
 		// Cleanup

+ 0 - 1
AnKi/Util/SparseArray.inl.h

@@ -111,7 +111,6 @@ start:
 	grow(alloc);
 	goto start;
 
-	ANKI_ASSERT(0);
 	return 0;
 }
 

+ 2 - 1
Tests/Gr/GrCommon.h

@@ -20,7 +20,8 @@ inline ShaderPtr createShader(CString src, ShaderType type, GrManager& gr,
 	ShaderProgramParser::generateAnkiShaderHeader(type, compilerOptions, header);
 	header.append(src);
 	DynamicArrayAuto<U8> spirv(alloc);
-	ANKI_TEST_EXPECT_NO_ERR(compilerGlslToSpirv(header, type, alloc, spirv));
+	StringAuto errorLog(alloc);
+	ANKI_TEST_EXPECT_NO_ERR(compilerGlslToSpirv(header, type, alloc, spirv, errorLog));
 
 	ShaderInitInfo initInf(type, spirv);
 	initInf.m_constValues = specVals;

+ 12 - 12
ThirdParty/FidelityFX/ffx_fsr1.h

@@ -849,12 +849,12 @@ AF1 sharpness){
   // Immediate constants for peak range.
   AF2 peakC=AF2(1.0,-1.0*4.0);
   // Limiters, these need to be high precision RCPs.
-  AF1 hitMinR=mn4R*ARcpF1(AF1_(4.0)*mx4R);
-  AF1 hitMinG=mn4G*ARcpF1(AF1_(4.0)*mx4G);
-  AF1 hitMinB=mn4B*ARcpF1(AF1_(4.0)*mx4B);
-  AF1 hitMaxR=(peakC.x-mx4R)*ARcpF1(AF1_(4.0)*mn4R+peakC.y);
-  AF1 hitMaxG=(peakC.x-mx4G)*ARcpF1(AF1_(4.0)*mn4G+peakC.y);
-  AF1 hitMaxB=(peakC.x-mx4B)*ARcpF1(AF1_(4.0)*mn4B+peakC.y);
+  AF1 hitMinR=min(mn4R,eR)*ARcpF1(AF1_(4.0)*mx4R);
+  AF1 hitMinG=min(mn4G,eG)*ARcpF1(AF1_(4.0)*mx4G);
+  AF1 hitMinB=min(mn4B,eB)*ARcpF1(AF1_(4.0)*mx4B);
+  AF1 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpF1(AF1_(4.0)*mn4R+peakC.y);
+  AF1 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpF1(AF1_(4.0)*mn4G+peakC.y);
+  AF1 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpF1(AF1_(4.0)*mn4B+peakC.y);
   AF1 lobeR=max(-hitMinR,hitMaxR);
   AF1 lobeG=max(-hitMinG,hitMaxG);
   AF1 lobeB=max(-hitMinB,hitMaxB);
@@ -1065,12 +1065,12 @@ AF1 sharpness){
   // Immediate constants for peak range.
   AH2 peakC=AH2(1.0,-1.0*4.0);
   // Limiters, these need to be high precision RCPs.
-  AH2 hitMinR=mn4R*ARcpH2(AH2_(4.0)*mx4R);
-  AH2 hitMinG=mn4G*ARcpH2(AH2_(4.0)*mx4G);
-  AH2 hitMinB=mn4B*ARcpH2(AH2_(4.0)*mx4B);
-  AH2 hitMaxR=(peakC.x-mx4R)*ARcpH2(AH2_(4.0)*mn4R+peakC.y);
-  AH2 hitMaxG=(peakC.x-mx4G)*ARcpH2(AH2_(4.0)*mn4G+peakC.y);
-  AH2 hitMaxB=(peakC.x-mx4B)*ARcpH2(AH2_(4.0)*mn4B+peakC.y);
+  AH2 hitMinR=min(mn4R,eR)*ARcpH2(AH2_(4.0)*mx4R);
+  AH2 hitMinG=min(mn4G,eG)*ARcpH2(AH2_(4.0)*mx4G);
+  AH2 hitMinB=min(mn4B,eB)*ARcpH2(AH2_(4.0)*mx4B);
+  AH2 hitMaxR=(peakC.x-max(mx4R,eR))*ARcpH2(AH2_(4.0)*mn4R+peakC.y);
+  AH2 hitMaxG=(peakC.x-max(mx4G,eG))*ARcpH2(AH2_(4.0)*mn4G+peakC.y);
+  AH2 hitMaxB=(peakC.x-max(mx4B,eB))*ARcpH2(AH2_(4.0)*mn4B+peakC.y);
   AH2 lobeR=max(-hitMinR,hitMaxR);
   AH2 lobeG=max(-hitMinG,hitMaxG);
   AH2 lobeB=max(-hitMinB,hitMaxB);