Add 25 native k-masked AVX-512 row kernels

R=rrwinterton@gmail.com

Bug: None
Change-Id: I2ee9b2c2d939f63f49d2f951f2d552ca6863d78b
This commit is contained in:
Frank Barchard 2026-10-12 16:48:00 -07:00
parent 63b56324de
commit 7cc53fb240
12 changed files with 3570 additions and 3 deletions

View File

@ -609,6 +609,15 @@ void MirrorPlane(const uint8_t* src_y,
int width,
int height);
// Mirror a plane of 16-bit data.
LIBYUV_API
void MirrorPlane_16(const uint16_t* src_y,
int src_stride_y,
uint16_t* dst_y,
int dst_stride_y,
int width,
int height);
// Mirror a plane of UV data.
LIBYUV_API
void MirrorUVPlane(const uint8_t* src_uv,

View File

@ -389,6 +389,31 @@ extern "C" {
#define HAS_ARGBCOPYYTOALPHAROW_AVX512BW
#define HAS_ARGBMIRRORROW_AVX512BW
#define HAS_RGB24MIRRORROW_AVX512VBMI
#define HAS_AYUVTOYROW_AVX512VBMI
#define HAS_AYUVTOUVROW_AVX512VBMI
#define HAS_AYUVTOVUROW_AVX512VBMI
#define HAS_AR30TOARGBROW_AVX512BW
#define HAS_AR30TOABGRROW_AVX512BW
#define HAS_AR30TOAB30ROW_AVX512BW
#define HAS_MERGEXR30ROW_10_AVX512BW
#define HAS_MIRRORROW_16_AVX512BW
#define HAS_MERGERGBROW_AVX512VBMI
#define HAS_RAWTORGBAROW_AVX512VBMI
#define HAS_NV12TOARGBROW_AVX512BW
#define HAS_NV21TOARGBROW_AVX512BW
#define HAS_NV12TORGB24ROW_AVX512VBMI
#define HAS_NV21TORGB24ROW_AVX512VBMI
#define HAS_I422ALPHATOARGBROW_AVX512BW
#define HAS_SWAPUVROW_AVX512BW
#define HAS_HALFMERGEUVROW_AVX512BW
#define HAS_INTERPOLATEROW_16_AVX512BW
#define HAS_ARGBATTENUATEROW_AVX512BW
#define HAS_ARGBMULTIPLYROW_AVX512BW
#define HAS_ARGBTOAR30ROW_AVX512BW
#define HAS_ABGRTOAR30ROW_AVX512BW
#define HAS_I400TOARGBROW_AVX512BW
#define HAS_ARGBGRAYROW_AVX512BW
#define HAS_ARGBBLENDROW_AVX512BW
#endif
#define HAS_ARGBTOYMATRIXROW_AVX2
#define HAS_RGBTOYMATRIXROW_AVX2
@ -464,6 +489,31 @@ extern "C" {
#define HAS_ARGBCOPYYTOALPHAROW_AVX512BW
#define HAS_ARGBMIRRORROW_AVX512BW
#define HAS_RGB24MIRRORROW_AVX512VBMI
#define HAS_AYUVTOYROW_AVX512VBMI
#define HAS_AYUVTOUVROW_AVX512VBMI
#define HAS_AYUVTOVUROW_AVX512VBMI
#define HAS_AR30TOARGBROW_AVX512BW
#define HAS_AR30TOABGRROW_AVX512BW
#define HAS_AR30TOAB30ROW_AVX512BW
#define HAS_MERGEXR30ROW_10_AVX512BW
#define HAS_MIRRORROW_16_AVX512BW
#define HAS_MERGERGBROW_AVX512VBMI
#define HAS_RAWTORGBAROW_AVX512VBMI
#define HAS_NV12TOARGBROW_AVX512BW
#define HAS_NV21TOARGBROW_AVX512BW
#define HAS_NV12TORGB24ROW_AVX512VBMI
#define HAS_NV21TORGB24ROW_AVX512VBMI
#define HAS_I422ALPHATOARGBROW_AVX512BW
#define HAS_SWAPUVROW_AVX512BW
#define HAS_HALFMERGEUVROW_AVX512BW
#define HAS_INTERPOLATEROW_16_AVX512BW
#define HAS_ARGBATTENUATEROW_AVX512BW
#define HAS_ARGBMULTIPLYROW_AVX512BW
#define HAS_ARGBTOAR30ROW_AVX512BW
#define HAS_ABGRTOAR30ROW_AVX512BW
#define HAS_I400TOARGBROW_AVX512BW
#define HAS_ARGBGRAYROW_AVX512BW
#define HAS_ARGBBLENDROW_AVX512BW
#endif
// The following are available on Neon platforms:
@ -2781,6 +2831,7 @@ void MirrorSplitUVRow_C(const uint8_t* src_uv,
int width);
void MirrorRow_16_C(const uint16_t* src, uint16_t* dst, int width);
void MirrorRow_16_AVX512BW(const uint16_t* src, uint16_t* dst, int width);
void ARGBMirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width);
void ARGBMirrorRow_AVX512BW(const uint8_t* src, uint8_t* dst, int width);
@ -3078,6 +3129,12 @@ void HalfMergeUVRow_AVX2(const uint8_t* src_u,
int src_stride_v,
uint8_t* dst_uv,
int width);
void HalfMergeUVRow_AVX512BW(const uint8_t* src_u,
int src_stride_u,
const uint8_t* src_v,
int src_stride_v,
uint8_t* dst_uv,
int width);
void SplitRGBRow_C(const uint8_t* src_rgb,
uint8_t* dst_r,
@ -3150,6 +3207,11 @@ void MergeRGBRow_RVV(const uint8_t* src_r,
const uint8_t* src_b,
uint8_t* dst_rgb,
int width);
void MergeRGBRow_AVX512VBMI(const uint8_t* src_r,
const uint8_t* src_g,
const uint8_t* src_b,
uint8_t* dst_rgb,
int width);
void MergeRGBRow_Any_SSSE3(const uint8_t* y_buf,
const uint8_t* u_buf,
const uint8_t* v_buf,
@ -3397,6 +3459,12 @@ void MergeXR30Row_AVX2(const uint16_t* src_r,
uint8_t* dst_ar30,
int depth,
int width);
void MergeXR30Row_10_AVX512BW(const uint16_t* src_r,
const uint16_t* src_g,
const uint16_t* src_b,
uint8_t* dst_ar30,
int depth,
int width);
void MergeAR64Row_AVX2(const uint16_t* src_r,
const uint16_t* src_g,
const uint16_t* src_b,
@ -4152,6 +4220,9 @@ void ARGB4444ToARGBRow_LASX(const uint8_t* src_argb4444,
void RGB24ToARGBRow_C(const uint8_t* src_rgb24, uint8_t* dst_argb, int width);
void RAWToARGBRow_C(const uint8_t* src_raw, uint8_t* dst_argb, int width);
void RAWToRGBARow_C(const uint8_t* src_raw, uint8_t* dst_rgba, int width);
void RAWToRGBARow_AVX512VBMI(const uint8_t* src_raw,
uint8_t* dst_rgba,
int width);
void RAWToRGB24Row_C(const uint8_t* src_raw, uint8_t* dst_rgb24, int width);
void RGB565ToARGBRow_C(const uint8_t* src_rgb565, uint8_t* dst_argb, int width);
void ARGB1555ToARGBRow_C(const uint8_t* src_argb1555,
@ -4161,9 +4232,18 @@ void ARGB4444ToARGBRow_C(const uint8_t* src_argb4444,
uint8_t* dst_argb,
int width);
void AR30ToARGBRow_C(const uint8_t* src_ar30, uint8_t* dst_argb, int width);
void AR30ToARGBRow_AVX512BW(const uint8_t* src_ar30,
uint8_t* dst_argb,
int width);
void AR30ToABGRRow_C(const uint8_t* src_ar30, uint8_t* dst_abgr, int width);
void AR30ToABGRRow_AVX512BW(const uint8_t* src_ar30,
uint8_t* dst_abgr,
int width);
void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width);
void AR30ToAB30Row_C(const uint8_t* src_ar30, uint8_t* dst_ab30, int width);
void AR30ToAB30Row_AVX512BW(const uint8_t* src_ar30,
uint8_t* dst_ab30,
int width);
void RGB24ToARGBRow_Any_SSSE3(const uint8_t* src_ptr,
uint8_t* dst_ptr,
@ -4286,7 +4366,9 @@ void ARGBToARGB4444Row_AVX2(const uint8_t* src_argb,
uint8_t* dst_rgb,
int width);
void ABGRToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width);
void ABGRToAR30Row_AVX512BW(const uint8_t* src, uint8_t* dst, int width);
void ARGBToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width);
void ARGBToAR30Row_AVX512BW(const uint8_t* src, uint8_t* dst, int width);
void ARGBToRGB24Row_NEON(const uint8_t* src_argb,
uint8_t* dst_rgb24,
@ -4864,6 +4946,13 @@ void I422AlphaToARGBRow_AVX2(const uint8_t* y_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I422AlphaToARGBRow_AVX512BW(const uint8_t* y_buf,
const uint8_t* u_buf,
const uint8_t* v_buf,
const uint8_t* a_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void NV12ToARGBRow_SSSE3(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_argb,
@ -4874,6 +4963,11 @@ void NV12ToARGBRow_AVX2(const uint8_t* y_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void NV12ToARGBRow_AVX512BW(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void NV12ToRGB24Row_SSSE3(const uint8_t* src_y,
const uint8_t* src_uv,
uint8_t* dst_rgb24,
@ -4890,11 +4984,21 @@ void NV12ToRGB24Row_AVX2(const uint8_t* src_y,
uint8_t* dst_rgb24,
const struct YuvConstants* yuvconstants,
int width);
void NV12ToRGB24Row_AVX512VBMI(const uint8_t* src_y,
const uint8_t* src_uv,
uint8_t* dst_rgb24,
const struct YuvConstants* yuvconstants,
int width);
void NV21ToRGB24Row_AVX2(const uint8_t* src_y,
const uint8_t* src_vu,
uint8_t* dst_rgb24,
const struct YuvConstants* yuvconstants,
int width);
void NV21ToRGB24Row_AVX512VBMI(const uint8_t* src_y,
const uint8_t* src_vu,
uint8_t* dst_rgb24,
const struct YuvConstants* yuvconstants,
int width);
void NV12ToRGB565Row_SSSE3(const uint8_t* src_y,
const uint8_t* src_uv,
uint8_t* dst_rgb565,
@ -4924,6 +5028,11 @@ void NV21ToARGBRow_AVX2(const uint8_t* y_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void NV21ToARGBRow_AVX512BW(const uint8_t* y_buf,
const uint8_t* vu_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void YUY2ToARGBRow_SSSE3(const uint8_t* yuy2_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
@ -5384,6 +5493,10 @@ void I400ToARGBRow_AVX2(const uint8_t* y_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I400ToARGBRow_AVX512BW(const uint8_t* y_buf,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I400ToARGBRow_NEON(const uint8_t* src_y,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
@ -5426,6 +5539,10 @@ void ARGBBlendRow_SSSE3(const uint8_t* src_argb,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBBlendRow_AVX512BW(const uint8_t* src_argb,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBBlendRow_NEON(const uint8_t* src_argb,
const uint8_t* src_argb1,
uint8_t* dst_argb,
@ -5516,6 +5633,10 @@ void ARGBMultiplyRow_Any_AVX2(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void ARGBMultiplyRow_AVX512BW(const uint8_t* src_argb,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBMultiplyRow_NEON(const uint8_t* src_argb,
const uint8_t* src_argb1,
uint8_t* dst_argb,
@ -6386,16 +6507,26 @@ void SwapUVRow_SSSE3(const uint8_t* src_uv, uint8_t* dst_vu, int width);
void SwapUVRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void SwapUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_vu, int width);
void SwapUVRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void SwapUVRow_AVX512BW(const uint8_t* src_uv, uint8_t* dst_vu, int width);
void SwapUVRow_RVV(const uint8_t* src_uv, uint8_t* dst_vu, int width);
void AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width);
void AYUVToYRow_AVX512VBMI(const uint8_t* src_ayuv, uint8_t* dst_y, int width);
void AYUVToUVRow_C(const uint8_t* src_ayuv,
int src_stride_ayuv,
uint8_t* dst_uv,
int width);
void AYUVToUVRow_AVX512VBMI(const uint8_t* src_ayuv,
int src_stride_ayuv,
uint8_t* dst_uv,
int width);
void AYUVToVURow_C(const uint8_t* src_ayuv,
int src_stride_ayuv,
uint8_t* dst_vu,
int width);
void AYUVToVURow_AVX512VBMI(const uint8_t* src_ayuv,
int src_stride_ayuv,
uint8_t* dst_vu,
int width);
void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width);
void AYUVToUVRow_NEON(const uint8_t* src_ayuv,
int src_stride_ayuv,
@ -6550,6 +6681,9 @@ void ARGBAttenuateRow_SSSE3(const uint8_t* src_argb,
void ARGBAttenuateRow_AVX2(const uint8_t* src_argb,
uint8_t* dst_argb,
int width);
void ARGBAttenuateRow_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_argb,
int width);
void ARGBAttenuateRow_NEON(const uint8_t* src_argb,
uint8_t* dst_argb,
int width);
@ -6598,6 +6732,9 @@ void ARGBUnattenuateRow_Any_AVX2(const uint8_t* src_ptr,
void ARGBGrayRow_C(const uint8_t* src_argb, uint8_t* dst_argb, int width);
void ARGBGrayRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_argb, int width);
void ARGBGrayRow_AVX512BW(const uint8_t* src_argb,
uint8_t* dst_argb,
int width);
void ARGBGrayRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width);
void ARGBGrayRow_NEON_DotProd(const uint8_t* src_argb,
uint8_t* dst_argb,
@ -6817,6 +6954,11 @@ void InterpolateRow_16_Any_AVX2(uint16_t* dst_ptr,
ptrdiff_t src_stride,
int width,
int source_y_fraction);
void InterpolateRow_16_AVX512BW(uint16_t* dst_ptr,
const uint16_t* src_ptr,
ptrdiff_t src_stride,
int width,
int source_y_fraction);
void InterpolateRow_16_NEON(uint16_t* dst_ptr,
const uint16_t* src_ptr,
ptrdiff_t src_stride,

View File

@ -2646,6 +2646,12 @@ int AYUVToNV12(const uint8_t* src_ayuv,
}
}
#endif
#if defined(HAS_AYUVTOYROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI | kCpuHasAVX512VL)) {
AYUVToUVRow = AYUVToUVRow_AVX512VBMI;
AYUVToYRow = AYUVToYRow_AVX512VBMI;
}
#endif
#if defined(HAS_AYUVTOYROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
@ -2726,6 +2732,12 @@ int AYUVToNV21(const uint8_t* src_ayuv,
}
}
#endif
#if defined(HAS_AYUVTOYROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI | kCpuHasAVX512VL)) {
AYUVToVURow = AYUVToVURow_AVX512VBMI;
AYUVToYRow = AYUVToYRow_AVX512VBMI;
}
#endif
#if defined(HAS_AYUVTOYROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {

View File

@ -2429,6 +2429,11 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_I422ALPHATOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_I422ALPHATOARGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_Any_NEON;
@ -2484,6 +2489,11 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -2591,6 +2601,11 @@ int I422AlphaToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_I422ALPHATOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_I422ALPHATOARGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_Any_NEON;
@ -2646,6 +2661,11 @@ int I422AlphaToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -2790,6 +2810,11 @@ int I444AlphaToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -3049,6 +3074,11 @@ int I010AlphaToARGBMatrix(const uint16_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -3181,6 +3211,11 @@ int I210AlphaToARGBMatrix(const uint16_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -3311,6 +3346,11 @@ int I410AlphaToARGBMatrix(const uint16_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -3402,6 +3442,11 @@ int I400ToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_I400TOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
I400ToARGBRow = I400ToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_I400TOARGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
I400ToARGBRow = I400ToARGBRow_Any_NEON;
@ -4055,6 +4100,11 @@ int RAWToRGBA(const uint8_t* src_raw,
}
}
#endif
#if defined(HAS_RAWTORGBAROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI | kCpuHasAVX512VL)) {
RAWToRGBARow = RAWToRGBARow_AVX512VBMI;
}
#endif
#if defined(HAS_RAWTORGBAROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
RAWToRGBARow = RAWToRGBARow_Any_NEON;
@ -4347,8 +4397,15 @@ int AR30ToARGB(const uint8_t* src_ar30,
height = 1;
src_stride_ar30 = dst_stride_argb = 0;
}
void (*AR30ToARGBRow)(const uint8_t* src_ar30, uint8_t* dst_argb, int width) =
AR30ToARGBRow_C;
#if defined(HAS_AR30TOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
AR30ToARGBRow = AR30ToARGBRow_AVX512BW;
}
#endif
for (y = 0; y < height; ++y) {
AR30ToARGBRow_C(src_ar30, dst_argb, width);
AR30ToARGBRow(src_ar30, dst_argb, width);
src_ar30 += src_stride_ar30;
dst_argb += dst_stride_argb;
}
@ -4364,6 +4421,8 @@ int AR30ToABGR(const uint8_t* src_ar30,
int width,
int height) {
int y;
void (*AR30ToABGRRow)(const uint8_t* src_ar30, uint8_t* dst_abgr, int width) =
AR30ToABGRRow_C;
if (!src_ar30 || !dst_abgr || width <= 0 || height == 0 ||
height == INT_MIN) {
return -1;
@ -4381,8 +4440,13 @@ int AR30ToABGR(const uint8_t* src_ar30,
height = 1;
src_stride_ar30 = dst_stride_abgr = 0;
}
#if defined(HAS_AR30TOABGRROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
AR30ToABGRRow = AR30ToABGRRow_AVX512BW;
}
#endif
for (y = 0; y < height; ++y) {
AR30ToABGRRow_C(src_ar30, dst_abgr, width);
AR30ToABGRRow(src_ar30, dst_abgr, width);
src_ar30 += src_stride_ar30;
dst_abgr += dst_stride_abgr;
}
@ -4398,6 +4462,8 @@ int AR30ToAB30(const uint8_t* src_ar30,
int width,
int height) {
int y;
void (*AR30ToAB30Row)(const uint8_t* src_ar30, uint8_t* dst_ab30, int width) =
AR30ToAB30Row_C;
if (!src_ar30 || !dst_ab30 || width <= 0 || height == 0 ||
height == INT_MIN) {
return -1;
@ -4415,8 +4481,13 @@ int AR30ToAB30(const uint8_t* src_ar30,
height = 1;
src_stride_ar30 = dst_stride_ab30 = 0;
}
#if defined(HAS_AR30TOAB30ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
AR30ToAB30Row = AR30ToAB30Row_AVX512BW;
}
#endif
for (y = 0; y < height; ++y) {
AR30ToAB30Row_C(src_ar30, dst_ab30, width);
AR30ToAB30Row(src_ar30, dst_ab30, width);
src_ar30 += src_stride_ar30;
dst_ab30 += dst_stride_ab30;
}
@ -4597,6 +4668,11 @@ int NV12ToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_NV12TOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
NV12ToARGBRow = NV12ToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_NV12TOARGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
NV12ToARGBRow = NV12ToARGBRow_Any_NEON;
@ -4698,6 +4774,11 @@ int NV21ToARGBMatrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_NV21TOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
NV21ToARGBRow = NV21ToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_NV21TOARGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
NV21ToARGBRow = NV21ToARGBRow_Any_NEON;
@ -4876,6 +4957,11 @@ int NV12ToRGB24Matrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_NV12TORGB24ROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI | kCpuHasAVX512VL)) {
NV12ToRGB24Row = NV12ToRGB24Row_AVX512VBMI;
}
#endif
#if defined(HAS_NV12TORGB24ROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
NV12ToRGB24Row = NV12ToRGB24Row_RVV;
@ -4953,6 +5039,11 @@ int NV21ToRGB24Matrix(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_NV21TORGB24ROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI | kCpuHasAVX512VL)) {
NV21ToRGB24Row = NV21ToRGB24Row_AVX512VBMI;
}
#endif
#if defined(HAS_NV21TORGB24ROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
NV21ToRGB24Row = NV21ToRGB24Row_RVV;
@ -7955,6 +8046,11 @@ static int I420AlphaToARGBMatrixBilinear(
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -8175,6 +8271,11 @@ static int I422AlphaToARGBMatrixLinear(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -8347,6 +8448,11 @@ static int I010AlphaToARGBMatrixBilinear(
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -8541,6 +8647,11 @@ static int I210AlphaToARGBMatrixLinear(const uint16_t* src_y,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;

View File

@ -3747,6 +3747,11 @@ int ABGRToAR30(const uint8_t* src_abgr,
ABGRToAR30Row = ABGRToAR30Row_AVX2;
}
}
#endif
#if defined(HAS_ABGRTOAR30ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ABGRToAR30Row = ABGRToAR30Row_AVX512BW;
}
#endif
for (y = 0; y < height; ++y) {
ABGRToAR30Row(src_abgr, dst_ar30, width);
@ -3806,6 +3811,11 @@ int ARGBToAR30(const uint8_t* src_argb,
ARGBToAR30Row = ARGBToAR30Row_AVX2;
}
}
#endif
#if defined(HAS_ARGBTOAR30ROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBToAR30Row = ARGBToAR30Row_AVX512BW;
}
#endif
for (y = 0; y < height; ++y) {
ARGBToAR30Row(src_argb, dst_ar30, width);

View File

@ -65,6 +65,11 @@ static int NV16ToARGB(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_NV12TOARGBROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
NV12ToARGBRow = NV12ToARGBRow_AVX512BW;
}
#endif
#if defined(HAS_NV12TOARGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
NV12ToARGBRow = NV12ToARGBRow_Any_NEON;

View File

@ -1127,6 +1127,11 @@ void SwapUVPlane(const uint8_t* src_uv,
}
}
#endif
#if defined(HAS_SWAPUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
SwapUVRow = SwapUVRow_AVX512BW;
}
#endif
#if defined(HAS_SWAPUVROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
SwapUVRow = SwapUVRow_Any_NEON;
@ -1573,6 +1578,11 @@ void MergeRGBPlane(const uint8_t* src_r,
}
}
#endif
#if defined(HAS_MERGERGBROW_AVX512VBMI)
if (TestCpuFlag(kCpuHasAVX512VBMI | kCpuHasAVX512VL)) {
MergeRGBRow = MergeRGBRow_AVX512VBMI;
}
#endif
#if defined(HAS_MERGERGBROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
MergeRGBRow = MergeRGBRow_Any_NEON;
@ -2003,6 +2013,11 @@ void MergeXR30Plane(const uint16_t* src_r,
}
}
#endif
#if defined(HAS_MERGEXR30ROW_10_AVX512BW)
if (depth == 10 && TestCpuFlag(kCpuHasAVX512BW | kCpuHasAVX512VL)) {
MergeXR30Row = MergeXR30Row_10_AVX512BW;
}
#endif
#if defined(HAS_MERGEXR30ROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
if (depth == 10) {
@ -2755,6 +2770,40 @@ void MirrorPlane(const uint8_t* src_y,
}
}
// Mirror a plane of 16-bit data.
LIBYUV_API
void MirrorPlane_16(const uint16_t* src_y,
int src_stride_y,
uint16_t* dst_y,
int dst_stride_y,
int width,
int height) {
int y;
void (*MirrorRow_16)(const uint16_t* src, uint16_t* dst, int width) =
MirrorRow_16_C;
if (width <= 0 || height == 0 || height == INT_MIN) {
return;
}
// Negative height means invert the image.
if (height < 0) {
height = -height;
src_y = src_y + (ptrdiff_t)(height - 1) * src_stride_y;
src_stride_y = -src_stride_y;
}
#if defined(HAS_MIRRORROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
MirrorRow_16 = MirrorRow_16_AVX512BW;
}
#endif
// Mirror plane
for (y = 0; y < height; ++y) {
MirrorRow_16(src_y, dst_y, width);
src_y += src_stride_y;
dst_y += dst_stride_y;
}
}
// Mirror a plane of UV data.
LIBYUV_API
void MirrorUVPlane(const uint8_t* src_uv,
@ -3133,6 +3182,11 @@ int ARGBBlend(const uint8_t* src_argb0,
ARGBBlendRow = ARGBBlendRow_SSSE3;
}
#endif
#if defined(HAS_ARGBBLENDROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBBlendRow = ARGBBlendRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBBLENDROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBBlendRow = ARGBBlendRow_NEON;
@ -3479,6 +3533,11 @@ int ARGBMultiply(const uint8_t* src_argb0,
}
}
#endif
#if defined(HAS_ARGBMULTIPLYROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBMultiplyRow = ARGBMultiplyRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBMULTIPLYROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBMultiplyRow = ARGBMultiplyRow_Any_NEON;
@ -4010,6 +4069,11 @@ int ARGBAttenuate(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_ARGBATTENUATEROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBAttenuateRow = ARGBAttenuateRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBATTENUATEROW_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON;
@ -4133,6 +4197,11 @@ int ARGBGrayTo(const uint8_t* src_argb,
ARGBGrayRow = ARGBGrayRow_SSSE3;
}
#endif
#if defined(HAS_ARGBGRAYROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBGrayRow = ARGBGrayRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBGRAYROW_NEON)
if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(width, 8)) {
ARGBGrayRow = ARGBGrayRow_NEON;
@ -4188,6 +4257,11 @@ int ARGBGray(uint8_t* dst_argb,
ARGBGrayRow = ARGBGrayRow_SSSE3;
}
#endif
#if defined(HAS_ARGBGRAYROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
ARGBGrayRow = ARGBGrayRow_AVX512BW;
}
#endif
#if defined(HAS_ARGBGRAYROW_NEON)
if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(width, 8)) {
ARGBGrayRow = ARGBGrayRow_NEON;
@ -4859,6 +4933,11 @@ int InterpolatePlane_16(const uint16_t* src0,
}
}
#endif
#if defined(HAS_INTERPOLATEROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
InterpolateRow_16 = InterpolateRow_16_AVX512BW;
}
#endif
#if defined(HAS_INTERPOLATEROW_16_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
InterpolateRow_16 = InterpolateRow_16_Any_NEON;
@ -6206,6 +6285,11 @@ void HalfMergeUVPlane(const uint8_t* src_u,
HalfMergeUVRow = HalfMergeUVRow_AVX2;
}
#endif
#if defined(HAS_HALFMERGEUVROW_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
HalfMergeUVRow = HalfMergeUVRow_AVX512BW;
}
#endif
for (y = 0; y < height - 1; y += 2) {
// Merge a row of U and V into a row of UV.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1275,6 +1275,11 @@ static int ScalePlaneBilinearDown_16(int src_width,
}
}
#endif
#if defined(HAS_INTERPOLATEROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
InterpolateRow = InterpolateRow_16_AVX512BW;
}
#endif
#if defined(HAS_INTERPOLATEROW_16_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
InterpolateRow = InterpolateRow_16_Any_NEON;
@ -1894,6 +1899,11 @@ static int ScalePlaneBilinearUp_16(int src_width,
}
}
#endif
#if defined(HAS_INTERPOLATEROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
InterpolateRow = InterpolateRow_16_AVX512BW;
}
#endif
#if defined(HAS_INTERPOLATEROW_16_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
InterpolateRow = InterpolateRow_16_Any_NEON;

View File

@ -1523,6 +1523,11 @@ void ScalePlaneVertical_16(int src_height,
}
}
#endif
#if defined(HAS_INTERPOLATEROW_16_AVX512BW)
if (TestCpuFlag(kCpuHasAVX512BW)) {
InterpolateRow = InterpolateRow_16_AVX512BW;
}
#endif
#if defined(HAS_INTERPOLATEROW_16_NEON)
if (TestCpuFlag(kCpuHasNEON)) {
InterpolateRow = InterpolateRow_16_Any_NEON;

View File

@ -855,6 +855,34 @@ TEST_F(LibYUVPlanarTest, ARGBMirror_Opt) {
free_aligned_buffer_page_end(dst_pixels_c);
}
TEST_F(LibYUVPlanarTest, MirrorPlane_16_Opt) {
align_buffer_page_end(src_pixels_8, benchmark_width_ * benchmark_height_ * 2);
align_buffer_page_end(dst_pixels_opt_8,
benchmark_width_ * benchmark_height_ * 2);
align_buffer_page_end(dst_pixels_c_8,
benchmark_width_ * benchmark_height_ * 2);
uint16_t* src_pixels = reinterpret_cast<uint16_t*>(src_pixels_8);
uint16_t* dst_pixels_opt = reinterpret_cast<uint16_t*>(dst_pixels_opt_8);
uint16_t* dst_pixels_c = reinterpret_cast<uint16_t*>(dst_pixels_c_8);
MemRandomize(src_pixels_8, benchmark_width_ * benchmark_height_ * 2);
MaskCpuFlags(disable_cpu_flags_);
MirrorPlane_16(src_pixels, benchmark_width_, dst_pixels_c, benchmark_width_,
benchmark_width_, benchmark_height_);
MaskCpuFlags(benchmark_cpu_info_);
for (int i = 0; i < benchmark_iterations_; ++i) {
MirrorPlane_16(src_pixels, benchmark_width_, dst_pixels_opt,
benchmark_width_, benchmark_width_, benchmark_height_);
}
for (int i = 0; i < benchmark_width_ * benchmark_height_; ++i) {
EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]);
}
free_aligned_buffer_page_end(src_pixels_8);
free_aligned_buffer_page_end(dst_pixels_opt_8);
free_aligned_buffer_page_end(dst_pixels_c_8);
}
TEST_F(LibYUVPlanarTest, MirrorPlane_Opt) {
align_buffer_page_end(src_pixels, benchmark_width_ * benchmark_height_);
align_buffer_page_end(dst_pixels_opt, benchmark_width_ * benchmark_height_);