Coverage Report

Created: 2026-07-25 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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