Bug 1683779 - Use only rust constructs to detect SSE2/AVX/NEON support. r=jrmuizel

Differential Revision: https://phabricator.services.mozilla.com/D100293
This commit is contained in:
Andrew Osmond 2020-12-22 01:37:03 +00:00
parent e83771fccf
commit 583dd6ec47
4 changed files with 50 additions and 116 deletions

View File

@ -153,13 +153,6 @@ mod test {
#[test]
fn basic() {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
use crate::transform::qcms_enable_avx;
if is_x86_feature_detected!("avx") {
qcms_enable_avx()
}
};
let sRGB_profile = crate::c_bindings::qcms_profile_sRGB();
let mut Rec709Primaries = qcms_CIE_xyYTRIPLE {
@ -535,27 +528,6 @@ mod test {
fn SetUp(&mut self) {
qcms_enable_iccv4();
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
if is_x86_feature_detected!("avx") {
qcms_enable_avx()
}
#[cfg(target_arch = "arm")]
unsafe {
use crate::transform::qcms_enable_neon;
if is_arm_feature_detected!("neon") {
qcms_enable_neon()
}
};
#[cfg(target_arch = "aarch64")]
unsafe {
use crate::transform::qcms_enable_neon;
if is_aarch64_feature_detected!("neon") {
qcms_enable_neon()
}
};
}
unsafe fn TearDown(&mut self) {
@ -695,7 +667,9 @@ mod test {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_rgb_out_lut_sse2)));
if is_x86_feature_detected!("sse2") {
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_rgb_out_lut_sse2)));
}
if is_x86_feature_detected!("avx") {
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_rgb_out_lut_avx)))
}
@ -722,7 +696,9 @@ mod test {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_rgba_out_lut_sse2)));
if is_x86_feature_detected!("sse2") {
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_rgba_out_lut_sse2)));
}
if is_x86_feature_detected!("avx") {
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_rgba_out_lut_avx)))
}
@ -749,7 +725,9 @@ mod test {
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_bgra_out_lut_sse2)));
if is_x86_feature_detected!("sse2") {
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_bgra_out_lut_sse2)));
}
if is_x86_feature_detected!("avx") {
assert!(self.ProduceVerifyOutput(Some(qcms_transform_data_bgra_out_lut_avx)))
}

View File

@ -55,7 +55,7 @@ use crate::{
use ::libc::{self};
use std::sync::atomic::Ordering;
use std::sync::{atomic::AtomicBool, Arc};
use std::sync::Arc;
pub const PRECACHE_OUTPUT_SIZE: usize = 8192;
pub const PRECACHE_OUTPUT_MAX: usize = PRECACHE_OUTPUT_SIZE - 1;
@ -1008,12 +1008,6 @@ pub unsafe extern "C" fn qcms_transform_release(mut t: *mut qcms_transform) {
drop(t)
}
fn sse_version_available() -> i32 {
/* we know at build time that 64-bit CPUs always have SSE2
* this tells the compiler that non-SSE2 branches will never be
* taken (i.e. OK to optimze away the SSE1 and non-SIMD code */
return 2;
}
const bradford_matrix: matrix = matrix {
m: [
[0.8951, 0.2664, -0.1614],
@ -1221,53 +1215,49 @@ pub fn transform_create(
}
if (*in_0).color_space == RGB_SIGNATURE {
if precache {
if cfg!(any(target_arch = "x86", target_arch = "x86_64"))
&& qcms_supports_avx.load(Ordering::Relaxed)
{
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_avx)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_avx)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_avx)
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
if is_x86_feature_detected!("avx") {
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_avx)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_avx)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_avx)
}
} else if cfg!(all(
any(target_arch = "x86", target_arch = "x86_64"),
not(miri)
)) && sse_version_available() >= 2
{
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_sse2)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_sse2)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_sse2)
}
} else if cfg!(not(miri)) && is_x86_feature_detected!("sse2") {
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_sse2)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_sse2)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_sse2)
}
} else if cfg!(any(target_arch = "arm", target_arch = "aarch64"))
&& qcms_supports_neon.load(Ordering::Relaxed)
{
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
{
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_neon)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_neon)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_neon)
}
}
#[cfg(target_arch = "arm")]
let neon_supported = is_arm_feature_detected!("neon");
#[cfg(target_arch = "aarch64")]
let neon_supported = is_aarch64_feature_detected!("neon");
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
if neon_supported {
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_neon)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_neon)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_neon)
}
}
if transform.transform_fn.is_none() {
if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_precache)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_precache)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_precache)
}
} else if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut_precache)
} else if in_type == DATA_RGBA_8 {
transform.transform_fn = Some(qcms_transform_data_rgba_out_lut_precache)
} else if in_type == DATA_BGRA_8 {
transform.transform_fn = Some(qcms_transform_data_bgra_out_lut_precache)
}
} else if in_type == DATA_RGB_8 {
transform.transform_fn = Some(qcms_transform_data_rgb_out_lut)
@ -1382,14 +1372,3 @@ pub unsafe extern "C" fn qcms_transform_data(
pub extern "C" fn qcms_enable_iccv4() {
qcms_supports_iccv4.store(true, Ordering::Relaxed);
}
pub static qcms_supports_avx: AtomicBool = AtomicBool::new(false);
pub static qcms_supports_neon: AtomicBool = AtomicBool::new(false);
#[no_mangle]
pub extern "C" fn qcms_enable_avx() {
qcms_supports_avx.store(true, Ordering::Relaxed);
}
#[no_mangle]
pub extern "C" fn qcms_enable_neon() {
qcms_supports_neon.store(true, Ordering::Relaxed);
}

View File

@ -201,16 +201,6 @@ class GfxQcms_ProfilePairBase : public ::testing::Test {
// XXX: This means that we can't have qcms v2 unit test
// without changing the qcms API.
qcms_enable_iccv4();
#ifdef MOZILLA_MAY_SUPPORT_AVX
if (mozilla::supports_avx()) {
qcms_enable_avx();
}
#endif
#ifdef MOZILLA_MAY_SUPPORT_NEON
if (mozilla::supports_neon()) {
qcms_enable_neon();
}
#endif
}
void TearDown() override {

View File

@ -53,9 +53,6 @@
#include "VRProcessManager.h"
#include "VRThread.h"
#include "mozilla/SSE.h"
#include "mozilla/arm.h"
#ifdef XP_WIN
# include <process.h>
# define getpid _getpid
@ -2068,16 +2065,6 @@ eCMSMode gfxPlatform::GetCMSMode() {
if (enableV4) {
qcms_enable_iccv4();
}
#ifdef MOZILLA_MAY_SUPPORT_AVX
if (mozilla::supports_avx()) {
qcms_enable_avx();
}
#endif
#ifdef MOZILLA_MAY_SUPPORT_NEON
if (mozilla::supports_neon()) {
qcms_enable_neon();
}
#endif
gCMSInitialized = true;
}
return gCMSMode;