mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 03:15:11 +00:00
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:
parent
e83771fccf
commit
583dd6ec47
@ -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)))
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user