2023-12-15 15:28:27 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "ShaderSource.h"
# include "Containers/StringConv.h"
2024-03-21 10:54:56 -04:00
# include "Compression/OodleDataCompression.h"
# include "HAL/IConsoleManager.h"
2023-12-15 15:28:27 -05:00
# include "HAL/UnrealMemory.h"
2024-03-21 10:54:56 -04:00
static int32 GShaderSourceCompressionMethod = 2 ;
static FAutoConsoleVariableRef CVarShaderSourceCompressionMethod (
TEXT ( " r.ShaderSource.CompressionMethod " ) ,
GShaderSourceCompressionMethod ,
TEXT ( " Compression method for shader source stored in memory. See FOodleDataCompression::ECompressor enum for supported values; defaults to Mermaid. " ) ,
ECVF_Default ) ;
static int32 GShaderSourceCompressionLevel = 1 ;
FAutoConsoleVariableRef CVarShaderSourceCompressionLevel (
TEXT ( " r.ShaderSource.CompressionLevel " ) ,
GShaderSourceCompressionLevel ,
TEXT ( " Compression level for shader source stored in memory. See FOodleDataCompression::ECompressionLevel enum for supported values; default is SuperFast. " ) ,
ECVF_Default ) ;
2023-12-15 15:28:27 -05:00
FShaderSource : : FShaderSource ( FShaderSource : : FViewType InSrc , int32 AdditionalSlack )
{
Set ( InSrc , AdditionalSlack ) ;
}
void FShaderSource : : Set ( FShaderSource : : FViewType InSrc , int32 AdditionalSlack )
{
SetLen ( InSrc . Len ( ) + AdditionalSlack ) ;
FShaderSource : : CharType * SourceData = Source . GetData ( ) ;
FMemory : : Memcpy ( SourceData , InSrc . GetData ( ) , sizeof ( FShaderSource : : CharType ) * InSrc . Len ( ) ) ;
}
2024-01-16 09:15:51 -05:00
# if !SHADER_SOURCE_ANSI
2023-12-15 15:28:27 -05:00
void FShaderSource : : Set ( FAnsiStringView InSrc )
{
TStringConvert < ANSICHAR , TCHAR > Convert ;
SetLen ( InSrc . Len ( ) ) ;
Convert . Convert ( Source . GetData ( ) , Source . Num ( ) , InSrc . GetData ( ) , InSrc . Len ( ) ) ;
}
2024-01-16 09:15:51 -05:00
# endif
2023-12-15 15:28:27 -05:00
FShaderSource & FShaderSource : : operator = ( FShaderSource : : FStringType & & InSrc )
{
2024-03-21 10:54:56 -04:00
SourceCompressed . Empty ( ) ;
2024-03-27 10:15:04 -04:00
DecompressedCharCount = 0 ;
2024-03-21 10:54:56 -04:00
2023-12-15 15:28:27 -05:00
int32 InInitialLen = InSrc . Len ( ) ;
// input char array already has a null terminator appended, so can add one less padding char
TArray < CharType > & InSrcArray = InSrc . GetCharArray ( ) ;
InSrcArray . AddZeroed ( ShaderSourceSimdPadding - 1 ) ;
Source = MoveTemp ( InSrcArray ) ;
return * this ;
}
2024-03-21 10:54:56 -04:00
void FShaderSource : : Compress ( )
{
FOodleDataCompression : : ECompressor Compressor = static_cast < FOodleDataCompression : : ECompressor > ( GShaderSourceCompressionMethod ) ;
if ( Compressor = = FOodleDataCompression : : ECompressor : : NotSet )
{
return ;
}
checkf ( ! IsCompressed ( ) , TEXT ( " FShaderSource is already compressed " ) ) ;
FOodleDataCompression : : ECompressionLevel CompressionLevel = static_cast < FOodleDataCompression : : ECompressionLevel > ( GShaderSourceCompressionLevel ) ;
2024-03-27 10:15:04 -04:00
DecompressedCharCount = Source . Num ( ) ;
int32 CompressionBufferSize = FOodleDataCompression : : CompressedBufferSizeNeeded ( GetDecompressedSize ( ) ) ;
2024-03-21 10:54:56 -04:00
SourceCompressed . SetNumUninitialized ( CompressionBufferSize ) ;
int32 CompressedSize = FOodleDataCompression : : Compress (
SourceCompressed . GetData ( ) ,
CompressionBufferSize ,
Source . GetData ( ) ,
2024-03-27 10:15:04 -04:00
GetDecompressedSize ( ) ,
2024-03-21 10:54:56 -04:00
Compressor ,
CompressionLevel ) ;
SourceCompressed . SetNum ( CompressedSize , EAllowShrinking : : Yes ) ;
Source . Empty ( ) ;
}
void FShaderSource : : Decompress ( )
{
if ( IsCompressed ( ) )
{
2024-03-27 10:15:04 -04:00
Source . SetNumUninitialized ( DecompressedCharCount ) ;
FOodleDataCompression : : Decompress ( Source . GetData ( ) , GetDecompressedSize ( ) , SourceCompressed . GetData ( ) , SourceCompressed . Num ( ) ) ;
2024-03-21 10:54:56 -04:00
SourceCompressed . Empty ( ) ;
2024-03-27 10:15:04 -04:00
DecompressedCharCount = 0 ;
2024-03-21 10:54:56 -04:00
}
}
2023-12-15 15:28:27 -05:00
FArchive & operator < < ( FArchive & Ar , FShaderSource & Src )
{
2024-03-27 10:15:04 -04:00
Ar < < Src . DecompressedCharCount ;
2024-03-21 10:54:56 -04:00
if ( Src . IsCompressed ( ) )
{
Ar < < Src . SourceCompressed ;
}
else
{
Ar < < Src . Source ;
}
2023-12-15 15:28:27 -05:00
return Ar ;
}