#include "babl-internal.h"
#include "babl-db.h"
#include "babl-base.h"
+
+#include "babl-cpuaccel.h"
#include <string.h>
#include <stdarg.h>
+void (*babl_base_init) (void) = babl_base_init_generic;
+#ifdef ARCH_X86_64
+void babl_base_init_x86_64_v2 (void);
+void babl_base_init_x86_64_v3 (void);
+#endif
+
+static void base_init (void)
+{
+#ifdef ARCH_X86_64
+ BablCpuAccelFlags accel = babl_cpu_accel_get_support ();
+ if (accel & BABL_CPU_ACCEL_X86_64_V3)
+ babl_base_init_x86_64_v3 ();
+ else if (accel & BABL_CPU_ACCEL_X86_64_V2)
+ babl_base_init_x86_64_v2 ();
+ else
+#endif
+ babl_base_init_generic ();
+}
+
+
static Babl *babl_extension_current_extender = NULL;
Babl *
if (ret != babl)
babl_free (babl);
else
- babl_base_init ();
+ {
+ base_init ();
+ }
babl = ret;
}
babl_set_extender (NULL);
static void models (void);
void
-babl_base_init (void)
+BABL_SIMD_SUFFIX(babl_base_init) (void)
{
babl_hmpf_on_name_lookups++;
types ();
models ();
- babl_formats_init ();
+ BABL_SIMD_SUFFIX (babl_formats_init) ();
babl_hmpf_on_name_lookups--;
}
void
-babl_base_destroy (void)
+BABL_SIMD_SUFFIX(babl_base_destroy) (void)
{
/* done by the destruction of the elemental babl clases */
}
static void
types (void)
{
- babl_base_type_float ();
- babl_base_type_u15 ();
- babl_base_type_half ();
- babl_base_type_u8 ();
- babl_base_type_u16 ();
- babl_base_type_u32 ();
+ BABL_SIMD_SUFFIX (babl_base_type_float) ();
+ BABL_SIMD_SUFFIX (babl_base_type_u15) ();
+ BABL_SIMD_SUFFIX (babl_base_type_half) ();
+ BABL_SIMD_SUFFIX (babl_base_type_u8) ();
+ BABL_SIMD_SUFFIX (babl_base_type_u16) ();
+ BABL_SIMD_SUFFIX (babl_base_type_u32) ();
}
/*
models (void)
{
babl_hmpf_on_name_lookups--;
- babl_base_model_rgb ();
- babl_base_model_gray ();
- babl_base_model_cmyk ();
+ BABL_SIMD_SUFFIX (babl_base_model_rgb) ();
+ BABL_SIMD_SUFFIX (babl_base_model_gray) ();
+ BABL_SIMD_SUFFIX (babl_base_model_cmyk) ();
babl_hmpf_on_name_lookups++;
- babl_base_model_ycbcr ();
+ BABL_SIMD_SUFFIX (babl_base_model_ycbcr) ();
}
#ifndef _BABL_BASE_H
#define _BABL_BASE_H
+#ifdef X86_64_V2
+#define BABL_SIMD_SUFFIX(symbol) symbol##_x86_64_v2
+#else
+#ifdef X86_64_V3
+#define BABL_SIMD_SUFFIX(symbol) symbol##_x86_64_v3
+#else
+#define BABL_SIMD_SUFFIX(symbol) symbol##_generic
+#endif
+#endif
+
+extern void (*babl_base_init) (void);
+extern void (*babl_base_destroy) (void);
+extern void (*babl_formats_init) (void);
+
+extern void (*babl_base_type_half) (void);
+extern void (*babl_base_type_float) (void);
+extern void (*babl_base_type_u8) (void);
+extern void (*babl_base_type_u16) (void);
+extern void (*babl_base_type_u15) (void);
+extern void (*babl_base_type_u32) (void);
+
+extern void (*babl_base_model_rgb) (void);
+extern void (*babl_base_model_cmyk) (void);
+extern void (*babl_base_model_gray) (void);
+extern void (*babl_base_model_ycbcr) (void);
+
+void BABL_SIMD_SUFFIX(babl_base_init) (void);
+void BABL_SIMD_SUFFIX(babl_base_destroy) (void);
+void BABL_SIMD_SUFFIX(babl_formats_init) (void);
+
+void BABL_SIMD_SUFFIX(babl_base_type_half) (void);
+void BABL_SIMD_SUFFIX(babl_base_type_float) (void);
+void BABL_SIMD_SUFFIX(babl_base_type_u8) (void);
+void BABL_SIMD_SUFFIX(babl_base_type_u16) (void);
+void BABL_SIMD_SUFFIX(babl_base_type_u15) (void);
+void BABL_SIMD_SUFFIX(babl_base_type_u32) (void);
-void babl_base_init (void);
-void babl_base_destroy (void);
-void babl_formats_init (void);
-
-void babl_base_type_half (void);
-void babl_base_type_float (void);
-void babl_base_type_u8 (void);
-void babl_base_type_u16 (void);
-void babl_base_type_u15 (void);
-void babl_base_type_u32 (void);
-
-void babl_base_model_pal (void);
-void babl_base_model_rgb (void);
-void babl_base_model_cmyk (void);
-void babl_base_model_gray (void);
-void babl_base_model_ycbcr (void);
+void BABL_SIMD_SUFFIX(babl_base_model_rgb) (void);
+void BABL_SIMD_SUFFIX(babl_base_model_cmyk) (void);
+void BABL_SIMD_SUFFIX(babl_base_model_gray) (void);
+void BABL_SIMD_SUFFIX(babl_base_model_ycbcr) (void);
#endif
#include "babl-base.h"
void
-babl_formats_init (void)
+BABL_SIMD_SUFFIX (babl_formats_init) (void)
{
const Babl *types[]={
babl_type_from_id (BABL_DOUBLE),
babl_base_sources,
include_directories: [rootInclude, bablInclude],
dependencies: [math, lcms],
+ c_args: common_c_flags
)
+
+if host_cpu_family == 'x86_64'
+
+ babl_base_x86_64_v2 = static_library('babl_base-x86-64-v2',
+ babl_base_sources,
+ include_directories: [rootInclude, bablInclude],
+ dependencies: [math, lcms],
+ c_args: common_c_flags + x86_64_v2_flags + '-DX86_64_V2'
+ )
+
+ babl_base_x86_64_v3 = static_library('babl_base-x86-64-v3',
+ babl_base_sources,
+ include_directories: [rootInclude, bablInclude],
+ dependencies: [math, lcms],
+ c_args: common_c_flags + x86_64_v3_flags + '-DX86_64_V3'
+ )
+
+endif
#endif
void
-babl_base_model_cmyk (void)
+BABL_SIMD_SUFFIX (babl_base_model_cmyk) (void)
{
babl_component_new ("cyan", NULL);
babl_component_new ("yellow", NULL);
static void init_single_precision (void);
void
-babl_base_model_gray (void)
+BABL_SIMD_SUFFIX (babl_base_model_gray) (void)
{
components ();
models ();
static void init_single_precision (void);
void
-babl_base_model_rgb (void)
+BABL_SIMD_SUFFIX (babl_base_model_rgb) (void)
{
components ();
models ();
static void formats (void);
void
-babl_base_model_ycbcr (void)
+BABL_SIMD_SUFFIX (babl_base_model_ycbcr) (void)
{
components ();
models ();
void
-babl_base_type_float (void)
+BABL_SIMD_SUFFIX (babl_base_type_float) (void)
{
babl_type_new (
"float",
void
-babl_base_type_half (void)
+BABL_SIMD_SUFFIX (babl_base_type_half) (void)
{
babl_type_new (
"half",
MAKE_CONVERSIONS_float (u15, 0.0, 1.0, 0, (1<<15))
void
-babl_base_type_u15 (void)
+BABL_SIMD_SUFFIX (babl_base_type_u15) (void)
{
babl_hmpf_on_name_lookups--;
babl_type_new (
void
-babl_base_type_u16 (void)
+BABL_SIMD_SUFFIX (babl_base_type_u16) (void)
{
babl_type_new (
"u16",
void
-babl_base_type_u32 (void)
+BABL_SIMD_SUFFIX (babl_base_type_u32) (void)
{
babl_type_new (
"u32",
void
-babl_base_type_u8 (void)
+BABL_SIMD_SUFFIX (babl_base_type_u8) (void)
{
babl_type_new (
"u8",
babl_deps = [math, thread, dl, lcms]
babl_includes = [rootInclude, bablBaseInclude]
+if host_cpu_family == 'x86_64'
+ simd_extra = [babl_base_x86_64_v2, babl_base_x86_64_v3]
+#elif host_cpu_family == 'arm'
+# simd_extra = [babl_base_arm_neon]
+else
+ simd_extra = []
+endif
+
# build library
babl = library(
lib_name,
c_args: babl_c_args,
link_whole: babl_base,
link_args: babl_link_args,
+ link_with: simd_extra,
dependencies: babl_deps,
link_depends: version_script,
version: so_version,
['-fno-unsafe-math-optimizations','-ftree-vectorize']
)
+
extra_warnings_list = [
'-Wdeclaration-after-statement',
'-Winit-self',
no_undefined = []
endif
-if host_cpu_family == 'arm'
+if host_cpu_family == 'x86_64'
+ x86_64_v2_flags = cc.get_supported_arguments(['-march=x86-64','-msse2', '-msse2','-msse4.1','-msse4.2','-mpopcnt','-mssse3'])
+ x86_64_v3_flags = x86_64_v2_flags + cc.get_supported_arguments(['-mavx','-mavx2','-mf16c','-mfma','-mmovbe', '-mbmi', '-mbmi2'])
+elif host_cpu_family == 'arm'
arm_neon_flags = cc.get_supported_arguments(['-mfpu=neon'])
elif host_cpu_family == 'aarch64'
- common_cflags += cc.get_supported_arguments(['-mfpu=neon'])
+ common_c_flags += cc.get_supported_arguments(['-mfpu=neon'])
endif
-
################################################################################
# Check for compiler CPU extensions