/** * Preprocess a shader. * @param OutPreprocessedShader - Upon return contains the preprocessed source code. * @param ShaderOutput - ShaderOutput to which errors can be added. * @param ShaderInput - The shader compiler input. * @param AdditionalDefines - Additional defines with which to preprocess the shader. * @returns true if the shader is preprocessed without error. */ bool PreprocessShaderFile(FString& OutPreprocessedShader, TArray<FShaderCompilerError>& OutShaderErrors, const FString& InShaderFile) { FString McppOptions; FString McppOutput, McppErrors; ANSICHAR* McppOutAnsi = nullptr; ANSICHAR* McppErrAnsi = nullptr; bool bSuccess = false; // MCPP is not threadsafe. static FCriticalSection McppCriticalSection; FScopeLock McppLock(&McppCriticalSection); FSimpleMcppFileLoader FileLoader(InShaderFile); int32 Result = mcpp_run( TCHAR_TO_ANSI(*McppOptions), TCHAR_TO_ANSI(*FileLoader.GetInputShaderFilename()), &McppOutAnsi, &McppErrAnsi, FileLoader.GetMcppInterface() ); McppOutput = McppOutAnsi; McppErrors = McppErrAnsi; if (ParseMcppErrors(OutShaderErrors, McppErrors, false)) { // exchange strings FMemory::Memswap( &OutPreprocessedShader, &McppOutput, sizeof(FString) ); bSuccess = true; } return bSuccess; }
/** * Preprocess a shader. * @param OutPreprocessedShader - Upon return contains the preprocessed source code. * @param ShaderOutput - ShaderOutput to which errors can be added. * @param ShaderInput - The shader compiler input. * @param AdditionalDefines - Additional defines with which to preprocess the shader. * @returns true if the shader is preprocessed without error. */ bool PreprocessShader( FString& OutPreprocessedShader, FShaderCompilerOutput& ShaderOutput, const FShaderCompilerInput& ShaderInput, const FShaderCompilerDefinitions& AdditionalDefines ) { FString McppOptions; FString McppOutput, McppErrors; ANSICHAR* McppOutAnsi = NULL; ANSICHAR* McppErrAnsi = NULL; bool bSuccess = false; // MCPP is not threadsafe. static FCriticalSection McppCriticalSection; FScopeLock McppLock(&McppCriticalSection); FMcppFileLoader FileLoader(ShaderInput); AddMcppDefines(McppOptions, ShaderInput.Environment.GetDefinitions()); AddMcppDefines(McppOptions, AdditionalDefines.GetDefinitionMap()); int32 Result = mcpp_run( TCHAR_TO_ANSI(*McppOptions), TCHAR_TO_ANSI(*FileLoader.GetInputShaderFilename()), &McppOutAnsi, &McppErrAnsi, FileLoader.GetMcppInterface() ); McppOutput = McppOutAnsi; McppErrors = McppErrAnsi; if (ParseMcppErrors(ShaderOutput, McppErrors)) { // exchange strings FMemory::Memswap( &OutPreprocessedShader, &McppOutput, sizeof(FString) ); bSuccess = true; } return bSuccess; }