summaryrefslogtreecommitdiffstats
path: root/Tools/CompressShaders/DetectFp64.cs
diff options
context:
space:
mode:
authorKonstantin <const@const.me>2023-01-16 14:52:43 +0100
committerKonstantin <const@const.me>2023-01-16 14:52:43 +0100
commit8c4603c73675958efc960fbd4bb599a2909d106a (patch)
tree714dc6fc9a1672d5fd7f89676b97e10959662abc /Tools/CompressShaders/DetectFp64.cs
parent990a8d0dbaefc996244097397259e92758b15cce (diff)
Source codes
Diffstat (limited to 'Tools/CompressShaders/DetectFp64.cs')
-rw-r--r--Tools/CompressShaders/DetectFp64.cs43
1 files changed, 43 insertions, 0 deletions
diff --git a/Tools/CompressShaders/DetectFp64.cs b/Tools/CompressShaders/DetectFp64.cs
new file mode 100644
index 0000000..1d75126
--- /dev/null
+++ b/Tools/CompressShaders/DetectFp64.cs
@@ -0,0 +1,43 @@
+#pragma warning disable CS0649
+using System.Runtime.InteropServices;
+
+namespace CompressShaders
+{
+ static class DetectFp64
+ {
+ struct DXBCHeader
+ {
+ public uint FourCC; // Four character code "DXBC"
+ public uint Hash0; // 32-bit hash of the DXBC file
+ public uint Hash1; // 32-bit hash of the DXBC file
+ public uint Hash2; // 32-bit hash of the DXBC file
+ public uint Hash3; // 32-bit hash of the DXBC file
+ public uint unknownOne;
+ public uint TotalSize; // Total size of the DXBC file in bytes
+ public int NumChunks; // Number of chunks in the DXBC file
+ };
+
+ public static bool usesFp64( ReadOnlySpan<byte> dxbc )
+ {
+ ReadOnlySpan<DXBCHeader> dxbcHeaderSpan = MemoryMarshal.Cast<byte, DXBCHeader>( dxbc );
+ DXBCHeader dxbcHeader = dxbcHeaderSpan[ 0 ];
+
+ int cbHeader = Marshal.SizeOf<DXBCHeader>();
+ int nChunks = dxbcHeader.NumChunks;
+ ReadOnlySpan<int> chunkOffsets = MemoryMarshal.Cast<byte, int>( dxbc.Slice( cbHeader, nChunks * 4 ) );
+ foreach( int off in chunkOffsets )
+ {
+ uint id = MemoryMarshal.Cast<byte, uint>( dxbc.Slice( off, 4 ) )[ 0 ];
+ const uint SFI0 = 0x30494653;
+ if( id != SFI0 )
+ continue;
+ int size = MemoryMarshal.Cast<byte, int>( dxbc.Slice( off + 4, 4 ) )[ 0 ];
+ if( size < 4 )
+ throw new ApplicationException();
+ uint data = MemoryMarshal.Cast<byte, uint>( dxbc.Slice( off + 8, 4 ) )[ 0 ];
+ return 0 != ( data & 1u );
+ }
+ return false;
+ }
+ }
+} \ No newline at end of file