Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "SkCpu.h"
      9 #include "SkHalf.h"
     10 #include "SkOnce.h"
     11 #include "SkOpts.h"
     12 
     13 #if defined(SK_ARM_HAS_NEON)
     14     #if defined(SK_ARM_HAS_CRC32)
     15         #define SK_OPTS_NS neon_and_crc32
     16     #else
     17         #define SK_OPTS_NS neon
     18     #endif
     19 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX2
     20     #define SK_OPTS_NS avx2
     21 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_AVX
     22     #define SK_OPTS_NS avx
     23 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE42
     24     #define SK_OPTS_NS sse42
     25 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE41
     26     #define SK_OPTS_NS sse41
     27 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSSE3
     28     #define SK_OPTS_NS ssse3
     29 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE3
     30     #define SK_OPTS_NS sse3
     31 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2
     32     #define SK_OPTS_NS sse2
     33 #elif SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE1
     34     #define SK_OPTS_NS sse
     35 #else
     36     #define SK_OPTS_NS portable
     37 #endif
     38 
     39 #include "SkBitmapProcState_opts.h"
     40 #include "SkBlitMask_opts.h"
     41 #include "SkBlitRow_opts.h"
     42 #include "SkChecksum_opts.h"
     43 #include "SkRasterPipeline_opts.h"
     44 #include "SkSwizzler_opts.h"
     45 #include "SkUtils_opts.h"
     46 #include "SkXfermode_opts.h"
     47 
     48 namespace SkOpts {
     49     // Define default function pointer values here...
     50     // If our global compile options are set high enough, these defaults might even be
     51     // CPU-specialized, e.g. a typical x86-64 machine might start with SSE2 defaults.
     52     // They'll still get a chance to be replaced with even better ones, e.g. using SSE4.1.
     53 #define DEFINE_DEFAULT(name) decltype(name) name = SK_OPTS_NS::name
     54     DEFINE_DEFAULT(create_xfermode);
     55 
     56     DEFINE_DEFAULT(blit_mask_d32_a8);
     57 
     58     DEFINE_DEFAULT(blit_row_s32a_opaque);
     59 
     60     DEFINE_DEFAULT(RGBA_to_BGRA);
     61     DEFINE_DEFAULT(RGBA_to_rgbA);
     62     DEFINE_DEFAULT(RGBA_to_bgrA);
     63     DEFINE_DEFAULT(RGB_to_RGB1);
     64     DEFINE_DEFAULT(RGB_to_BGR1);
     65     DEFINE_DEFAULT(gray_to_RGB1);
     66     DEFINE_DEFAULT(grayA_to_RGBA);
     67     DEFINE_DEFAULT(grayA_to_rgbA);
     68     DEFINE_DEFAULT(inverted_CMYK_to_RGB1);
     69     DEFINE_DEFAULT(inverted_CMYK_to_BGR1);
     70 
     71     DEFINE_DEFAULT(memset16);
     72     DEFINE_DEFAULT(memset32);
     73     DEFINE_DEFAULT(memset64);
     74 
     75     DEFINE_DEFAULT(hash_fn);
     76 
     77     DEFINE_DEFAULT(S32_alpha_D32_filter_DX);
     78 #undef DEFINE_DEFAULT
     79 
     80 #define M(st) (StageFn)SK_OPTS_NS::st,
     81     StageFn stages_highp[] = { SK_RASTER_PIPELINE_STAGES(M) };
     82     StageFn just_return_highp = (StageFn)SK_OPTS_NS::just_return;
     83     void (*start_pipeline_highp)(size_t,size_t,size_t,size_t,void**)
     84         = SK_OPTS_NS::start_pipeline;
     85 #undef M
     86 
     87 #define M(st) (StageFn)SK_OPTS_NS::lowp::st,
     88     StageFn stages_lowp[] = { SK_RASTER_PIPELINE_STAGES(M) };
     89     StageFn just_return_lowp = (StageFn)SK_OPTS_NS::lowp::just_return;
     90     void (*start_pipeline_lowp)(size_t,size_t,size_t,size_t,void**)
     91         = SK_OPTS_NS::lowp::start_pipeline;
     92 #undef M
     93 
     94     // Each Init_foo() is defined in src/opts/SkOpts_foo.cpp.
     95     void Init_ssse3();
     96     void Init_sse41();
     97     void Init_sse42();
     98     void Init_avx();
     99     void Init_hsw();
    100     void Init_crc32();
    101 
    102     static void init() {
    103 #if !defined(SK_BUILD_NO_OPTS)
    104     #if defined(SK_CPU_X86)
    105         #if SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSSE3
    106             if (SkCpu::Supports(SkCpu::SSSE3)) { Init_ssse3(); }
    107         #endif
    108 
    109         #if SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSE41
    110             if (SkCpu::Supports(SkCpu::SSE41)) { Init_sse41(); }
    111         #endif
    112 
    113         #if SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_SSE42
    114             if (SkCpu::Supports(SkCpu::SSE42)) { Init_sse42(); }
    115         #endif
    116 
    117         #if SK_CPU_SSE_LEVEL < SK_CPU_SSE_LEVEL_AVX
    118             if (SkCpu::Supports(SkCpu::AVX)) { Init_avx();   }
    119             if (SkCpu::Supports(SkCpu::HSW)) { Init_hsw();   }
    120         #endif
    121 
    122     #elif defined(SK_CPU_ARM64)
    123         if (SkCpu::Supports(SkCpu::CRC32)) { Init_crc32(); }
    124 
    125     #endif
    126 #endif
    127     }
    128 
    129     void Init() {
    130         static SkOnce once;
    131         once(init);
    132     }
    133 }  // namespace SkOpts
    134