33
44using System . Runtime . InteropServices ;
55using System . Runtime . Intrinsics ;
6- using System . Runtime . Intrinsics . X86 ;
6+ using SixLabors . ImageSharp . Common . Helpers ;
77using SixLabors . ImageSharp . PixelFormats ;
88
99namespace SixLabors . ImageSharp . Formats . Webp ;
@@ -20,7 +20,7 @@ internal static class WebpCommonUtils
2020 /// <returns>Returns true if alpha has non-0xff values.</returns>
2121 public static unsafe bool CheckNonOpaque ( ReadOnlySpan < Bgra32 > row )
2222 {
23- if ( Avx2 . IsSupported )
23+ if ( Vector256 . IsHardwareAccelerated )
2424 {
2525 ReadOnlySpan < byte > rowBytes = MemoryMarshal . AsBytes ( row ) ;
2626 int i = 0 ;
@@ -32,19 +32,19 @@ public static unsafe bool CheckNonOpaque(ReadOnlySpan<Bgra32> row)
3232
3333 for ( ; i + 128 <= length ; i += 128 )
3434 {
35- Vector256 < byte > a0 = Avx . LoadVector256 ( src + i ) . AsByte ( ) ;
36- Vector256 < byte > a1 = Avx . LoadVector256 ( src + i + 32 ) . AsByte ( ) ;
37- Vector256 < byte > a2 = Avx . LoadVector256 ( src + i + 64 ) . AsByte ( ) ;
38- Vector256 < byte > a3 = Avx . LoadVector256 ( src + i + 96 ) . AsByte ( ) ;
39- Vector256 < int > b0 = Avx2 . And ( a0 , alphaMaskVector256 ) . AsInt32 ( ) ;
40- Vector256 < int > b1 = Avx2 . And ( a1 , alphaMaskVector256 ) . AsInt32 ( ) ;
41- Vector256 < int > b2 = Avx2 . And ( a2 , alphaMaskVector256 ) . AsInt32 ( ) ;
42- Vector256 < int > b3 = Avx2 . And ( a3 , alphaMaskVector256 ) . AsInt32 ( ) ;
43- Vector256 < short > c0 = Avx2 . PackSignedSaturate ( b0 , b1 ) . AsInt16 ( ) ;
44- Vector256 < short > c1 = Avx2 . PackSignedSaturate ( b2 , b3 ) . AsInt16 ( ) ;
45- Vector256 < byte > d = Avx2 . PackSignedSaturate ( c0 , c1 ) . AsByte ( ) ;
46- Vector256 < byte > bits = Avx2 . CompareEqual ( d , all0x80Vector256 ) ;
47- int mask = Avx2 . MoveMask ( bits ) ;
35+ Vector256 < byte > a0 = Vector256 . Load ( src + i ) . AsByte ( ) ;
36+ Vector256 < byte > a1 = Vector256 . Load ( src + i + 32 ) . AsByte ( ) ;
37+ Vector256 < byte > a2 = Vector256 . Load ( src + i + 64 ) . AsByte ( ) ;
38+ Vector256 < byte > a3 = Vector256 . Load ( src + i + 96 ) . AsByte ( ) ;
39+ Vector256 < int > b0 = ( a0 & alphaMaskVector256 ) . AsInt32 ( ) ;
40+ Vector256 < int > b1 = ( a1 & alphaMaskVector256 ) . AsInt32 ( ) ;
41+ Vector256 < int > b2 = ( a2 & alphaMaskVector256 ) . AsInt32 ( ) ;
42+ Vector256 < int > b3 = ( a3 & alphaMaskVector256 ) . AsInt32 ( ) ;
43+ Vector256 < short > c0 = Vector256_ . PackSignedSaturate ( b0 , b1 ) . AsInt16 ( ) ;
44+ Vector256 < short > c1 = Vector256_ . PackSignedSaturate ( b2 , b3 ) . AsInt16 ( ) ;
45+ Vector256 < byte > d = Vector256_ . PackSignedSaturate ( c0 , c1 ) . AsByte ( ) ;
46+ Vector256 < byte > bits = Vector256 . Equals ( d , all0x80Vector256 ) ;
47+ int mask = Vector256_ . MoveMask ( bits ) ;
4848 if ( mask != - 1 )
4949 {
5050 return true ;
@@ -53,15 +53,15 @@ public static unsafe bool CheckNonOpaque(ReadOnlySpan<Bgra32> row)
5353
5454 for ( ; i + 64 <= length ; i += 64 )
5555 {
56- if ( IsNoneOpaque64Bytes ( src , i ) )
56+ if ( IsNoneOpaque64BytesVector128 ( src , i ) )
5757 {
5858 return true ;
5959 }
6060 }
6161
6262 for ( ; i + 32 <= length ; i += 32 )
6363 {
64- if ( IsNoneOpaque32Bytes ( src , i ) )
64+ if ( IsNonOpaque32BytesVector128 ( src , i ) )
6565 {
6666 return true ;
6767 }
@@ -76,7 +76,7 @@ public static unsafe bool CheckNonOpaque(ReadOnlySpan<Bgra32> row)
7676 }
7777 }
7878 }
79- else if ( Sse2 . IsSupported )
79+ else if ( Vector128 . IsHardwareAccelerated )
8080 {
8181 ReadOnlySpan < byte > rowBytes = MemoryMarshal . AsBytes ( row ) ;
8282 int i = 0 ;
@@ -85,15 +85,15 @@ public static unsafe bool CheckNonOpaque(ReadOnlySpan<Bgra32> row)
8585 {
8686 for ( ; i + 64 <= length ; i += 64 )
8787 {
88- if ( IsNoneOpaque64Bytes ( src , i ) )
88+ if ( IsNoneOpaque64BytesVector128 ( src , i ) )
8989 {
9090 return true ;
9191 }
9292 }
9393
9494 for ( ; i + 32 <= length ; i += 32 )
9595 {
96- if ( IsNoneOpaque32Bytes ( src , i ) )
96+ if ( IsNonOpaque32BytesVector128 ( src , i ) )
9797 {
9898 return true ;
9999 }
@@ -122,38 +122,38 @@ public static unsafe bool CheckNonOpaque(ReadOnlySpan<Bgra32> row)
122122 return false ;
123123 }
124124
125- private static unsafe bool IsNoneOpaque64Bytes ( byte * src , int i )
125+ private static unsafe bool IsNoneOpaque64BytesVector128 ( byte * src , int i )
126126 {
127127 Vector128 < byte > alphaMask = Vector128 . Create ( 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 ) ;
128128
129- Vector128 < byte > a0 = Sse2 . LoadVector128 ( src + i ) . AsByte ( ) ;
130- Vector128 < byte > a1 = Sse2 . LoadVector128 ( src + i + 16 ) . AsByte ( ) ;
131- Vector128 < byte > a2 = Sse2 . LoadVector128 ( src + i + 32 ) . AsByte ( ) ;
132- Vector128 < byte > a3 = Sse2 . LoadVector128 ( src + i + 48 ) . AsByte ( ) ;
133- Vector128 < int > b0 = Sse2 . And ( a0 , alphaMask ) . AsInt32 ( ) ;
134- Vector128 < int > b1 = Sse2 . And ( a1 , alphaMask ) . AsInt32 ( ) ;
135- Vector128 < int > b2 = Sse2 . And ( a2 , alphaMask ) . AsInt32 ( ) ;
136- Vector128 < int > b3 = Sse2 . And ( a3 , alphaMask ) . AsInt32 ( ) ;
137- Vector128 < short > c0 = Sse2 . PackSignedSaturate ( b0 , b1 ) . AsInt16 ( ) ;
138- Vector128 < short > c1 = Sse2 . PackSignedSaturate ( b2 , b3 ) . AsInt16 ( ) ;
139- Vector128 < byte > d = Sse2 . PackSignedSaturate ( c0 , c1 ) . AsByte ( ) ;
140- Vector128 < byte > bits = Sse2 . CompareEqual ( d , Vector128 . Create ( ( byte ) 0x80 ) . AsByte ( ) ) ;
141- int mask = Sse2 . MoveMask ( bits ) ;
129+ Vector128 < byte > a0 = Vector128 . Load ( src + i ) . AsByte ( ) ;
130+ Vector128 < byte > a1 = Vector128 . Load ( src + i + 16 ) . AsByte ( ) ;
131+ Vector128 < byte > a2 = Vector128 . Load ( src + i + 32 ) . AsByte ( ) ;
132+ Vector128 < byte > a3 = Vector128 . Load ( src + i + 48 ) . AsByte ( ) ;
133+ Vector128 < int > b0 = ( a0 & alphaMask ) . AsInt32 ( ) ;
134+ Vector128 < int > b1 = ( a1 & alphaMask ) . AsInt32 ( ) ;
135+ Vector128 < int > b2 = ( a2 & alphaMask ) . AsInt32 ( ) ;
136+ Vector128 < int > b3 = ( a3 & alphaMask ) . AsInt32 ( ) ;
137+ Vector128 < short > c0 = Vector128_ . PackSignedSaturate ( b0 , b1 ) . AsInt16 ( ) ;
138+ Vector128 < short > c1 = Vector128_ . PackSignedSaturate ( b2 , b3 ) . AsInt16 ( ) ;
139+ Vector128 < byte > d = Vector128_ . PackSignedSaturate ( c0 , c1 ) . AsByte ( ) ;
140+ Vector128 < byte > bits = Vector128 . Equals ( d , Vector128 . Create ( ( byte ) 0x80 ) . AsByte ( ) ) ;
141+ int mask = Vector128_ . MoveMask ( bits ) ;
142142 return mask != 0xFFFF ;
143143 }
144144
145- private static unsafe bool IsNoneOpaque32Bytes ( byte * src , int i )
145+ private static unsafe bool IsNonOpaque32BytesVector128 ( byte * src , int i )
146146 {
147147 Vector128 < byte > alphaMask = Vector128 . Create ( 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 ) ;
148148
149- Vector128 < byte > a0 = Sse2 . LoadVector128 ( src + i ) . AsByte ( ) ;
150- Vector128 < byte > a1 = Sse2 . LoadVector128 ( src + i + 16 ) . AsByte ( ) ;
151- Vector128 < int > b0 = Sse2 . And ( a0 , alphaMask ) . AsInt32 ( ) ;
152- Vector128 < int > b1 = Sse2 . And ( a1 , alphaMask ) . AsInt32 ( ) ;
153- Vector128 < short > c = Sse2 . PackSignedSaturate ( b0 , b1 ) . AsInt16 ( ) ;
154- Vector128 < byte > d = Sse2 . PackSignedSaturate ( c , c ) . AsByte ( ) ;
155- Vector128 < byte > bits = Sse2 . CompareEqual ( d , Vector128 . Create ( ( byte ) 0x80 ) . AsByte ( ) ) ;
156- int mask = Sse2 . MoveMask ( bits ) ;
149+ Vector128 < byte > a0 = Vector128 . Load ( src + i ) . AsByte ( ) ;
150+ Vector128 < byte > a1 = Vector128 . Load ( src + i + 16 ) . AsByte ( ) ;
151+ Vector128 < int > b0 = ( a0 & alphaMask ) . AsInt32 ( ) ;
152+ Vector128 < int > b1 = ( a1 & alphaMask ) . AsInt32 ( ) ;
153+ Vector128 < short > c = Vector128_ . PackSignedSaturate ( b0 , b1 ) . AsInt16 ( ) ;
154+ Vector128 < byte > d = Vector128_ . PackSignedSaturate ( c , c ) . AsByte ( ) ;
155+ Vector128 < byte > bits = Vector128 . Equals ( d , Vector128 . Create ( ( byte ) 0x80 ) . AsByte ( ) ) ;
156+ int mask = Vector128_ . MoveMask ( bits ) ;
157157 return mask != 0xFFFF ;
158158 }
159159}
0 commit comments