/src/vvenc/source/Lib/CommonLib/x86/InitX86.cpp
Line | Count | Source |
1 | | /* ----------------------------------------------------------------------------- |
2 | | The copyright in this software is being made available under the Clear BSD |
3 | | License, included below. No patent rights, trademark rights and/or |
4 | | other Intellectual Property Rights other than the copyrights concerning |
5 | | the Software are granted under this license. |
6 | | |
7 | | The Clear BSD License |
8 | | |
9 | | Copyright (c) 2019-2026, Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. & The VVenC Authors. |
10 | | All rights reserved. |
11 | | |
12 | | Redistribution and use in source and binary forms, with or without modification, |
13 | | are permitted (subject to the limitations in the disclaimer below) provided that |
14 | | the following conditions are met: |
15 | | |
16 | | * Redistributions of source code must retain the above copyright notice, |
17 | | this list of conditions and the following disclaimer. |
18 | | |
19 | | * Redistributions in binary form must reproduce the above copyright |
20 | | notice, this list of conditions and the following disclaimer in the |
21 | | documentation and/or other materials provided with the distribution. |
22 | | |
23 | | * Neither the name of the copyright holder nor the names of its |
24 | | contributors may be used to endorse or promote products derived from this |
25 | | software without specific prior written permission. |
26 | | |
27 | | NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY |
28 | | THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND |
29 | | CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
30 | | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
31 | | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
32 | | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
33 | | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
34 | | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
35 | | BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER |
36 | | IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
37 | | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
38 | | POSSIBILITY OF SUCH DAMAGE. |
39 | | |
40 | | |
41 | | ------------------------------------------------------------------------------------------- */ |
42 | | |
43 | | |
44 | | /* |
45 | | * \ingroup CommonLib |
46 | | * \file InitX86.cpp |
47 | | * \brief Initialize encoder SIMD functions. |
48 | | */ |
49 | | |
50 | | #include "CommonDefX86.h" |
51 | | #include "InterpolationFilter.h" |
52 | | #include "TrQuant.h" |
53 | | #include "RdCost.h" |
54 | | #include "Unit.h" |
55 | | #include "LoopFilter.h" |
56 | | #include "AdaptiveLoopFilter.h" |
57 | | #include "SampleAdaptiveOffset.h" |
58 | | #include "InterPrediction.h" |
59 | | #include "IntraPrediction.h" |
60 | | #include "AffineGradientSearch.h" |
61 | | #include "MCTF.h" |
62 | | #include "TrQuant_EMT.h" |
63 | | #include "QuantRDOQ2.h" |
64 | | #include "SEIFilmGrainAnalyzer.h" |
65 | | #include "EncoderLib/EncAdaptiveLoopFilter.h" |
66 | | |
67 | | #ifdef TARGET_SIMD_X86 |
68 | | |
69 | | //! \ingroup CommonLib |
70 | | //! \{ |
71 | | |
72 | | # if defined( REAL_TARGET_X86 ) \ |
73 | | || ( defined( SIMD_EVERYWHERE_EXTENSION_LEVEL_ID ) && SIMD_EVERYWHERE_EXTENSION_LEVEL_ID >= X86_SIMD_AVX2 ) |
74 | | # define ENABLE_AVX2_IMPLEMENTATIONS 1 |
75 | | # else |
76 | | # define ENABLE_AVX2_IMPLEMENTATIONS 0 |
77 | | # endif |
78 | | |
79 | | namespace vvenc { |
80 | | |
81 | | #if ENABLE_SIMD_OPT_MCIF |
82 | | void InterpolationFilter::initInterpolationFilterX86( /*int iBitDepthY, int iBitDepthC*/ ) |
83 | 0 | { |
84 | 0 | auto vext = read_x86_extension_flags(); |
85 | 0 | switch (vext){ |
86 | 0 | case AVX512: |
87 | 0 | case AVX2: |
88 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
89 | 0 | _initInterpolationFilterX86<AVX2>(/*iBitDepthY, iBitDepthC*/); |
90 | 0 | break; |
91 | 0 | #endif |
92 | 0 | case AVX: |
93 | | //_initInterpolationFilterX86<AVX>(/*iBitDepthY, iBitDepthC*/); |
94 | | //break; |
95 | 0 | case SSE42: |
96 | 0 | case SSE41: |
97 | 0 | _initInterpolationFilterX86<SSE41>(/*iBitDepthY, iBitDepthC*/); |
98 | 0 | break; |
99 | 0 | default: |
100 | 0 | break; |
101 | 0 | } |
102 | 0 | } |
103 | | #endif |
104 | | |
105 | | #if ENABLE_SIMD_OPT_BUFFER |
106 | | void PelBufferOps::initPelBufOpsX86() |
107 | 0 | { |
108 | 0 | auto vext = read_x86_extension_flags(); |
109 | 0 | switch (vext){ |
110 | 0 | case AVX512: |
111 | 0 | case AVX2: |
112 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
113 | 0 | _initPelBufOpsX86<AVX2>(); |
114 | 0 | break; |
115 | 0 | #endif |
116 | 0 | case AVX: |
117 | | //_initPelBufOpsX86<AVX>(); |
118 | | //break; |
119 | 0 | case SSE42: |
120 | 0 | case SSE41: |
121 | 0 | _initPelBufOpsX86<SSE41>(); |
122 | 0 | break; |
123 | 0 | default: |
124 | 0 | break; |
125 | 0 | } |
126 | 0 | } |
127 | | #endif |
128 | | |
129 | | |
130 | | #if ENABLE_SIMD_DBLF |
131 | | void LoopFilter::initLoopFilterX86() |
132 | 0 | { |
133 | 0 | auto vext = read_x86_extension_flags(); |
134 | 0 | switch (vext) |
135 | 0 | { |
136 | 0 | case AVX512: |
137 | 0 | case AVX2: |
138 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
139 | 0 | _initLoopFilterX86<AVX2>(); |
140 | 0 | break; |
141 | 0 | #endif |
142 | 0 | case AVX: |
143 | | //_initLoopFilterX86<AVX>(); |
144 | | //break; |
145 | 0 | case SSE42: |
146 | 0 | case SSE41: |
147 | 0 | _initLoopFilterX86<SSE41>(); |
148 | 0 | break; |
149 | 0 | default: |
150 | 0 | break; |
151 | 0 | } |
152 | 0 | } |
153 | | #endif |
154 | | |
155 | | |
156 | | #if ENABLE_SIMD_OPT_DIST |
157 | | void RdCost::initRdCostX86() |
158 | 0 | { |
159 | 0 | auto vext = read_x86_extension_flags(); |
160 | 0 | switch (vext){ |
161 | 0 | case AVX512: |
162 | 0 | case AVX2: |
163 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
164 | | #if defined( _MSC_VER ) && _MSC_VER >= 1938 && _MSC_VER < 1939 |
165 | | #else |
166 | 0 | _initRdCostX86<AVX2>(); |
167 | 0 | break; |
168 | 0 | #endif |
169 | 0 | #endif |
170 | 0 | case AVX: |
171 | | //_initRdCostX86<AVX>(); |
172 | | //break; |
173 | 0 | case SSE42: |
174 | 0 | case SSE41: |
175 | 0 | _initRdCostX86<SSE41>(); |
176 | 0 | break; |
177 | 0 | default: |
178 | 0 | break; |
179 | 0 | } |
180 | 0 | } |
181 | | #endif |
182 | | |
183 | | #if ENABLE_SIMD_OPT_ALF |
184 | | void AdaptiveLoopFilter::initAdaptiveLoopFilterX86() |
185 | 0 | { |
186 | 0 | auto vext = read_x86_extension_flags(); |
187 | 0 | switch( vext ) |
188 | 0 | { |
189 | 0 | case AVX512: |
190 | 0 | case AVX2: |
191 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
192 | 0 | _initAdaptiveLoopFilterX86<AVX2>(); |
193 | 0 | break; |
194 | 0 | #endif |
195 | 0 | case AVX: |
196 | | //_initAdaptiveLoopFilterX86<AVX>(); |
197 | | //break; |
198 | 0 | case SSE42: |
199 | 0 | case SSE41: |
200 | 0 | _initAdaptiveLoopFilterX86<SSE41>(); |
201 | 0 | break; |
202 | 0 | default: |
203 | 0 | break; |
204 | 0 | } |
205 | 0 | } |
206 | | |
207 | | void EncAdaptiveLoopFilter::initEncAdaptiveLoopFilter_X86() |
208 | 0 | { |
209 | 0 | auto vext = read_x86_extension_flags(); |
210 | 0 | switch (vext){ |
211 | 0 | case AVX512: |
212 | 0 | case AVX2: |
213 | 0 | case AVX: |
214 | 0 | case SSE42: |
215 | 0 | case SSE41: |
216 | 0 | _initEncAdaptiveLoopFilter_X86<SSE41>(); |
217 | 0 | break; |
218 | 0 | default: |
219 | 0 | break; |
220 | 0 | } |
221 | 0 | } |
222 | | #endif |
223 | | |
224 | | #if ENABLE_SIMD_OPT_SAO |
225 | | void SampleAdaptiveOffset::initSampleAdaptiveOffsetX86() |
226 | 0 | { |
227 | 0 | auto vext = read_x86_extension_flags(); |
228 | 0 | switch (vext){ |
229 | 0 | case AVX512: |
230 | 0 | case AVX2: |
231 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
232 | 0 | _initSampleAdaptiveOffsetX86<AVX2>(); |
233 | 0 | break; |
234 | 0 | #endif |
235 | 0 | case AVX: |
236 | | //_initSampleAdaptiveOffsetX86<AVX>(); |
237 | | //break; |
238 | 0 | case SSE42: |
239 | 0 | case SSE41: |
240 | 0 | _initSampleAdaptiveOffsetX86<SSE41>(); |
241 | 0 | break; |
242 | 0 | default: |
243 | 0 | break; |
244 | 0 | } |
245 | 0 | } |
246 | | |
247 | | #endif |
248 | | |
249 | | #if ENABLE_SIMD_OPT_BDOF |
250 | | void InterPredInterpolation::initInterPredictionX86() |
251 | 0 | { |
252 | 0 | auto vext = read_x86_extension_flags(); |
253 | 0 | switch (vext){ |
254 | 0 | case AVX512: |
255 | 0 | case AVX2: |
256 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
257 | 0 | _initInterPredictionX86<AVX2>(); |
258 | 0 | break; |
259 | 0 | #endif |
260 | 0 | case AVX: |
261 | | //_initInterPredictionX86<AVX>(); |
262 | | //break; |
263 | 0 | case SSE42: |
264 | 0 | case SSE41: |
265 | 0 | _initInterPredictionX86<SSE41>(); |
266 | 0 | break; |
267 | 0 | default: |
268 | 0 | break; |
269 | 0 | } |
270 | 0 | } |
271 | | #endif |
272 | | |
273 | | #if ENABLE_SIMD_OPT_AFFINE_ME |
274 | | void AffineGradientSearch::initAffineGradientSearchX86() |
275 | 0 | { |
276 | 0 | auto vext = read_x86_extension_flags(); |
277 | 0 | switch (vext) { |
278 | 0 | case AVX512: |
279 | 0 | case AVX2: |
280 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
281 | 0 | _initAffineGradientSearchX86<AVX2>(); |
282 | 0 | break; |
283 | 0 | #endif |
284 | 0 | case AVX: |
285 | | //_initAffineGradientSearchX86<AVX>(); |
286 | | //break; |
287 | 0 | case SSE42: |
288 | 0 | case SSE41: |
289 | 0 | _initAffineGradientSearchX86<SSE41>(); |
290 | 0 | break; |
291 | 0 | default: |
292 | 0 | break; |
293 | 0 | } |
294 | 0 | } |
295 | | #endif |
296 | | |
297 | | #if ENABLE_SIMD_OPT_INTRAPRED |
298 | | void IntraPrediction::initIntraPredictionX86() |
299 | 0 | { |
300 | 0 | auto vext = read_x86_extension_flags(); |
301 | 0 | switch (vext){ |
302 | 0 | case AVX512: |
303 | 0 | case AVX2: |
304 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
305 | 0 | _initIntraPredictionX86<AVX2>(); |
306 | 0 | break; |
307 | 0 | #endif |
308 | 0 | case AVX: |
309 | | //_initIntraPredictionX86<AVX>(); |
310 | | //break; |
311 | 0 | case SSE42: |
312 | 0 | case SSE41: |
313 | 0 | _initIntraPredictionX86<SSE41>(); |
314 | 0 | break; |
315 | 0 | default: |
316 | 0 | break; |
317 | 0 | } |
318 | 0 | } |
319 | | |
320 | | #endif |
321 | | #if ENABLE_SIMD_OPT_MCTF |
322 | | void MCTF::initMCTF_X86() |
323 | 0 | { |
324 | 0 | auto vext = read_x86_extension_flags(); |
325 | 0 | switch (vext){ |
326 | 0 | case AVX512: |
327 | 0 | case AVX2: |
328 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
329 | 0 | _initMCTF_X86<AVX2 >(); |
330 | 0 | break; |
331 | 0 | #endif |
332 | 0 | case AVX: |
333 | | //_initMCTF_X86<AVX >(); |
334 | | //break; |
335 | 0 | case SSE42: |
336 | | //_initMCTF_X86<SSE42>(); |
337 | | //break; |
338 | 0 | case SSE41: |
339 | 0 | _initMCTF_X86<SSE41>(); |
340 | 0 | break; |
341 | 0 | default: |
342 | 0 | break; |
343 | 0 | } |
344 | 0 | } |
345 | | |
346 | | #endif |
347 | | #if ENABLE_SIMD_TRAFO |
348 | | void TCoeffOps::initTCoeffOpsX86() |
349 | 0 | { |
350 | 0 | auto vext = read_x86_extension_flags(); |
351 | 0 | switch (vext){ |
352 | 0 | case AVX512: |
353 | 0 | case AVX2: |
354 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
355 | 0 | _initTCoeffOpsX86<AVX2 >(); |
356 | 0 | break; |
357 | 0 | #endif |
358 | 0 | case AVX: |
359 | | //_initTCoeffOpsX86<AVX >(); |
360 | | //break; |
361 | 0 | case SSE42: |
362 | | //_initTCoeffOpsX86<SSE42>(); |
363 | | //break; |
364 | 0 | case SSE41: |
365 | 0 | _initTCoeffOpsX86<SSE41>(); |
366 | 0 | break; |
367 | 0 | default: |
368 | 0 | break; |
369 | 0 | } |
370 | 0 | } |
371 | | |
372 | | void TrQuant::initTrQuantX86() |
373 | 0 | { |
374 | 0 | auto vext = read_x86_extension_flags(); |
375 | 0 | switch( vext ) |
376 | 0 | { |
377 | 0 | case AVX512: |
378 | 0 | case AVX2: |
379 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
380 | 0 | _initTrQuantX86<AVX2 >(); |
381 | 0 | break; |
382 | 0 | #endif |
383 | 0 | case AVX: |
384 | | //_initTrQuantX86<AVX >(); |
385 | | //break; |
386 | 0 | case SSE42: |
387 | | //_initTrQuantX86<SSE42>(); |
388 | | //break; |
389 | 0 | case SSE41: |
390 | 0 | _initTrQuantX86<SSE41>(); |
391 | 0 | break; |
392 | 0 | default: |
393 | 0 | break; |
394 | 0 | } |
395 | 0 | } |
396 | | |
397 | | #endif |
398 | | |
399 | | #if ENABLE_SIMD_OPT_QUANT |
400 | | |
401 | | void Quant::initQuantX86() |
402 | 0 | { |
403 | 0 | auto vext = read_x86_extension_flags(); |
404 | 0 | switch (vext){ |
405 | 0 | case AVX512: |
406 | 0 | case AVX2: |
407 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
408 | 0 | _initQuantX86<AVX2>(); |
409 | 0 | break; |
410 | 0 | #endif |
411 | 0 | case AVX: |
412 | | //_initQuantX86<AVX>(); |
413 | | //break; |
414 | 0 | case SSE42: |
415 | 0 | case SSE41: |
416 | 0 | _initQuantX86<SSE41>(); |
417 | 0 | break; |
418 | 0 | default: |
419 | 0 | break; |
420 | 0 | } |
421 | 0 | } |
422 | | |
423 | | void DepQuant::initDepQuantX86() |
424 | 0 | { |
425 | 0 | auto vext = read_x86_extension_flags(); |
426 | 0 | switch (vext){ |
427 | 0 | case AVX512: |
428 | 0 | case AVX2: |
429 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
430 | 0 | _initDepQuantX86<AVX2>(); |
431 | 0 | break; |
432 | 0 | #endif |
433 | 0 | case AVX: |
434 | 0 | case SSE42: |
435 | 0 | _initDepQuantX86<SSE42>(); |
436 | 0 | break; |
437 | 0 | case SSE41: |
438 | 0 | _initDepQuantX86<SSE41>(); |
439 | 0 | break; |
440 | 0 | default: |
441 | 0 | break; |
442 | 0 | } |
443 | 0 | } |
444 | | |
445 | | #endif |
446 | | |
447 | | #if ENABLE_SIMD_OPT_FGA |
448 | | void Canny::initFGACannyX86() |
449 | 0 | { |
450 | 0 | auto vext = read_x86_extension_flags(); |
451 | 0 | switch (vext){ |
452 | 0 | case AVX512: |
453 | 0 | case AVX2: |
454 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
455 | 0 | _initFGACannyX86<AVX2>(); |
456 | 0 | break; |
457 | 0 | #endif |
458 | 0 | case SSE42: |
459 | 0 | case SSE41: |
460 | 0 | _initFGACannyX86<SSE41>(); |
461 | 0 | break; |
462 | 0 | default: |
463 | 0 | break; |
464 | 0 | } |
465 | 0 | } |
466 | | void Morph::initFGAMorphX86() |
467 | 0 | { |
468 | 0 | auto vext = read_x86_extension_flags(); |
469 | 0 | switch (vext){ |
470 | 0 | case AVX512: |
471 | 0 | case AVX2: |
472 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
473 | 0 | _initFGAMorphX86<AVX2>(); |
474 | 0 | break; |
475 | 0 | #endif |
476 | 0 | case SSE42: |
477 | 0 | case SSE41: |
478 | 0 | _initFGAMorphX86<SSE41>(); |
479 | 0 | break; |
480 | 0 | default: |
481 | 0 | break; |
482 | 0 | } |
483 | 0 | } |
484 | | |
485 | | void FGAnalyzer::initFGAnalyzerX86() |
486 | 0 | { |
487 | 0 | auto vext = read_x86_extension_flags(); |
488 | 0 | switch (vext){ |
489 | 0 | case AVX512: |
490 | 0 | case AVX2: |
491 | 0 | #if ENABLE_AVX2_IMPLEMENTATIONS |
492 | 0 | _initFGAnalyzerX86<AVX2>(); |
493 | 0 | break; |
494 | 0 | #endif |
495 | 0 | case SSE42: |
496 | 0 | case SSE41: |
497 | 0 | _initFGAnalyzerX86<SSE41>(); |
498 | 0 | break; |
499 | 0 | default: |
500 | 0 | break; |
501 | 0 | } |
502 | 0 | } |
503 | | #endif |
504 | | |
505 | | } // namespace vvenc |
506 | | |
507 | | //! \} |
508 | | |
509 | | #endif // TARGET_SIMD_X86 |
510 | | |