SkJumper: Linux
Just need to take care to match C symbols with asm symbols. Linux
doesn't add the leading underscore automatically like Mac and Windows.
Change-Id: I488cdfec942b442554ffefdfd006a1305ad77d9d
Reviewed-on: https://skia-review.googlesource.com/8667
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index a442cce..a7787c3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -29,7 +29,7 @@
skia_enable_android_framework_defines = false
skia_enable_discrete_gpu = true
skia_enable_effects = true
- skia_enable_jumper = is_skia_standalone && is_mac
+ skia_enable_jumper = is_skia_standalone && (is_linux || is_mac)
skia_enable_gpu = true
skia_enable_pdf = true
skia_enable_tools = is_skia_standalone
diff --git a/src/jumper/SkJumper.cpp b/src/jumper/SkJumper.cpp
index ea7da54..d62b5b6 100644
--- a/src/jumper/SkJumper.cpp
+++ b/src/jumper/SkJumper.cpp
@@ -55,24 +55,31 @@
// We'll only ever call start_pipeline(), which then chains into the rest for us.
using StageFn = void(void);
+// Some platforms expect C "name" maps to asm "_name", others to "name".
+#if defined(_MSC_VER) || defined(__APPLE__)
+ #define ASM(name, suffix) sk_##name##_##suffix
+#else
+ #define ASM(name, suffix) _sk_##name##_##suffix
+#endif
+
extern "C" {
#if defined(__x86_64__) || defined(_M_X64)
- void sk_start_pipeline_hsw (size_t, void**, K*);
- void sk_start_pipeline_sse41(size_t, void**, K*);
- void sk_start_pipeline_sse2 (size_t, void**, K*);
+ void ASM(start_pipeline,hsw )(size_t, void**, K*);
+ void ASM(start_pipeline,sse41)(size_t, void**, K*);
+ void ASM(start_pipeline,sse2 )(size_t, void**, K*);
- StageFn sk_just_return_hsw,
- sk_just_return_sse41,
- sk_just_return_sse2;
+ StageFn ASM(just_return,hsw),
+ ASM(just_return,sse41),
+ ASM(just_return,sse2);
- #define M(st) StageFn sk_##st##_hsw;
+ #define M(st) StageFn ASM(st,hsw);
STAGES(M)
#undef M
- #define M(st) StageFn sk_##st##_sse41;
+ #define M(st) StageFn ASM(st,sse41);
STAGES(M)
#undef M
- #define M(st) StageFn sk_##st##_sse2;
+ #define M(st) StageFn ASM(st,sse2);
STAGES(M)
#undef M
#endif
@@ -91,7 +98,7 @@
static StageFn* lookup_hsw(SkRasterPipeline::StockStage st) {
switch (st) {
default: return nullptr;
- #define M(st) case SkRasterPipeline::st: return sk_##st##_hsw;
+ #define M(st) case SkRasterPipeline::st: return ASM(st,hsw);
STAGES(M)
#undef M
}
@@ -99,7 +106,7 @@
static StageFn* lookup_sse41(SkRasterPipeline::StockStage st) {
switch (st) {
default: return nullptr;
- #define M(st) case SkRasterPipeline::st: return sk_##st##_sse41;
+ #define M(st) case SkRasterPipeline::st: return ASM(st,sse41);
STAGES(M)
#undef M
}
@@ -107,7 +114,7 @@
static StageFn* lookup_sse2(SkRasterPipeline::StockStage st) {
switch (st) {
default: return nullptr;
- #define M(st) case SkRasterPipeline::st: return sk_##st##_sse2;
+ #define M(st) case SkRasterPipeline::st: return ASM(st,sse2);
STAGES(M)
#undef M
}
@@ -154,17 +161,17 @@
// While possible, build and run at full vector stride.
#if defined(__x86_64__) || defined(_M_X64)
if (1 && SkCpu::Supports(SkCpu::HSW)) {
- if (!build_and_run(8, lookup_hsw, sk_just_return_hsw, sk_start_pipeline_hsw)) {
+ if (!build_and_run(8, lookup_hsw, ASM(just_return,hsw), ASM(start_pipeline,hsw))) {
return false;
}
}
if (1 && SkCpu::Supports(SkCpu::SSE41)) {
- if (!build_and_run(4, lookup_sse41, sk_just_return_sse41, sk_start_pipeline_sse41)) {
+ if (!build_and_run(4, lookup_sse41, ASM(just_return,sse41), ASM(start_pipeline,sse41))) {
return false;
}
}
if (1 && SkCpu::Supports(SkCpu::SSE2)) {
- if (!build_and_run(4, lookup_sse2, sk_just_return_sse2, sk_start_pipeline_sse2)) {
+ if (!build_and_run(4, lookup_sse2, ASM(just_return,sse2), ASM(start_pipeline,sse2))) {
return false;
}
}