senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 1 | /* |
epoger@google.com | ec3ed6a | 2011-07-28 14:26:00 +0000 | [diff] [blame] | 2 | * Copyright 2009 The Android Open Source Project |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 6 | */ |
| 7 | |
senorblanco@chromium.org | dc7de74 | 2009-11-30 20:00:29 +0000 | [diff] [blame] | 8 | #include "SkBitmapProcState_opts_SSE2.h" |
tomhudson@google.com | 95ad155 | 2012-02-14 18:28:54 +0000 | [diff] [blame] | 9 | #include "SkBitmapProcState_opts_SSSE3.h" |
reed@google.com | 58af9a6 | 2011-10-12 13:43:52 +0000 | [diff] [blame] | 10 | #include "SkBlitMask.h" |
commit-bot@chromium.org | 8c4953c | 2014-04-30 14:58:46 +0000 | [diff] [blame] | 11 | #include "SkBlitRow.h" |
senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 12 | #include "SkBlitRow_opts_SSE2.h" |
mtklein | 4311f01 | 2016-04-19 14:00:13 -0700 | [diff] [blame] | 13 | #include "SkCpu.h" |
senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 14 | |
Melnikov.Sergey.V | 601e36a | 2016-04-08 15:31:45 -0700 | [diff] [blame] | 15 | |
| 16 | /* |
| 17 | ***************************************** |
| 18 | *********This file is deprecated********* |
| 19 | ***************************************** |
| 20 | * New CPU-specific work should be done in |
| 21 | * SkOpts framework. Run-time detection of |
| 22 | * available instruction set extensions is |
| 23 | * implemented in src/core/SkOpts.cpp file |
| 24 | ***************************************** |
| 25 | */ |
| 26 | |
| 27 | |
commit-bot@chromium.org | ce4402c | 2014-05-12 14:16:19 +0000 | [diff] [blame] | 28 | /* This file must *not* be compiled with -msse or any other optional SIMD |
| 29 | extension, otherwise gcc may generate SIMD instructions even for scalar ops |
| 30 | (and thus give an invalid instruction on Pentium3 on the code below). |
| 31 | For example, only files named *_SSE2.cpp in this directory should be |
| 32 | compiled with -msse2 or higher. */ |
senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 33 | |
commit-bot@chromium.org | 8c4953c | 2014-04-30 14:58:46 +0000 | [diff] [blame] | 34 | //////////////////////////////////////////////////////////////////////////////// |
| 35 | |
senorblanco@chromium.org | dc7de74 | 2009-11-30 20:00:29 +0000 | [diff] [blame] | 36 | void SkBitmapProcState::platformProcs() { |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 37 | /* Every optimization in the function requires at least SSE2 */ |
mtklein | 4311f01 | 2016-04-19 14:00:13 -0700 | [diff] [blame] | 38 | if (!SkCpu::Supports(SkCpu::SSE2)) { |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 39 | return; |
| 40 | } |
mtklein | 4311f01 | 2016-04-19 14:00:13 -0700 | [diff] [blame] | 41 | const bool ssse3 = SkCpu::Supports(SkCpu::SSSE3); |
commit-bot@chromium.org | c398f71 | 2014-04-23 20:07:19 +0000 | [diff] [blame] | 42 | |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 43 | /* Check fSampleProc32 */ |
| 44 | if (fSampleProc32 == S32_opaque_D32_filter_DX) { |
qiankun.miao | 60f3c65 | 2014-12-04 06:27:03 -0800 | [diff] [blame] | 45 | if (ssse3) { |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 46 | fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3; |
| 47 | } else { |
commit-bot@chromium.org | c398f71 | 2014-04-23 20:07:19 +0000 | [diff] [blame] | 48 | fSampleProc32 = S32_opaque_D32_filter_DX_SSE2; |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 49 | } |
| 50 | } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) { |
qiankun.miao | 60f3c65 | 2014-12-04 06:27:03 -0800 | [diff] [blame] | 51 | if (ssse3) { |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 52 | fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3; |
| 53 | } |
| 54 | } else if (fSampleProc32 == S32_alpha_D32_filter_DX) { |
qiankun.miao | 60f3c65 | 2014-12-04 06:27:03 -0800 | [diff] [blame] | 55 | if (ssse3) { |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 56 | fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3; |
| 57 | } else { |
commit-bot@chromium.org | c398f71 | 2014-04-23 20:07:19 +0000 | [diff] [blame] | 58 | fSampleProc32 = S32_alpha_D32_filter_DX_SSE2; |
| 59 | } |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 60 | } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) { |
qiankun.miao | 60f3c65 | 2014-12-04 06:27:03 -0800 | [diff] [blame] | 61 | if (ssse3) { |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 62 | fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3; |
commit-bot@chromium.org | c398f71 | 2014-04-23 20:07:19 +0000 | [diff] [blame] | 63 | } |
senorblanco@chromium.org | dc7de74 | 2009-11-30 20:00:29 +0000 | [diff] [blame] | 64 | } |
tomhudson@google.com | 06a7313 | 2012-02-22 18:30:43 +0000 | [diff] [blame] | 65 | |
commit-bot@chromium.org | 4b9b456 | 2014-04-28 15:07:50 +0000 | [diff] [blame] | 66 | /* Check fMatrixProc */ |
| 67 | if (fMatrixProc == ClampX_ClampY_filter_scale) { |
| 68 | fMatrixProc = ClampX_ClampY_filter_scale_SSE2; |
| 69 | } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) { |
| 70 | fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2; |
| 71 | } else if (fMatrixProc == ClampX_ClampY_filter_affine) { |
| 72 | fMatrixProc = ClampX_ClampY_filter_affine_SSE2; |
| 73 | } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) { |
| 74 | fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2; |
| 75 | } |
senorblanco@chromium.org | dc7de74 | 2009-11-30 20:00:29 +0000 | [diff] [blame] | 76 | } |
| 77 | |
commit-bot@chromium.org | 8c4953c | 2014-04-30 14:58:46 +0000 | [diff] [blame] | 78 | //////////////////////////////////////////////////////////////////////////////// |
| 79 | |
henrik.smiding | 4e65473 | 2015-02-10 09:42:33 -0800 | [diff] [blame] | 80 | static const SkBlitRow::Proc32 platform_32_procs_SSE2[] = { |
halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 81 | nullptr, // S32_Opaque, |
senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 82 | S32_Blend_BlitRow32_SSE2, // S32_Blend, |
mtklein | b4a7dc9 | 2016-03-23 06:29:12 -0700 | [diff] [blame] | 83 | nullptr, // Ported to SkOpts |
henrik.smiding | 3bb195e | 2014-06-27 08:03:17 -0700 | [diff] [blame] | 84 | S32A_Blend_BlitRow32_SSE2, // S32A_Blend, |
| 85 | }; |
henrik.smiding | 3bb195e | 2014-06-27 08:03:17 -0700 | [diff] [blame] | 86 | |
commit-bot@chromium.org | 8c4953c | 2014-04-30 14:58:46 +0000 | [diff] [blame] | 87 | SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) { |
mtklein | 4311f01 | 2016-04-19 14:00:13 -0700 | [diff] [blame] | 88 | if (SkCpu::Supports(SkCpu::SSE2)) { |
henrik.smiding | 3bb195e | 2014-06-27 08:03:17 -0700 | [diff] [blame] | 89 | return platform_32_procs_SSE2[flags]; |
commit-bot@chromium.org | 4759107 | 2014-02-19 03:09:52 +0000 | [diff] [blame] | 90 | } else { |
halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 91 | return nullptr; |
commit-bot@chromium.org | 4759107 | 2014-02-19 03:09:52 +0000 | [diff] [blame] | 92 | } |
senorblanco@chromium.org | 4e75355 | 2009-11-16 21:09:00 +0000 | [diff] [blame] | 93 | } |
| 94 | |
commit-bot@chromium.org | 8c4953c | 2014-04-30 14:58:46 +0000 | [diff] [blame] | 95 | //////////////////////////////////////////////////////////////////////////////// |
reed@google.com | 981d479 | 2011-03-09 12:55:47 +0000 | [diff] [blame] | 96 | |
tomhudson@google.com | d6770e6 | 2012-02-14 16:01:15 +0000 | [diff] [blame] | 97 | SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) { |
mtklein | 4311f01 | 2016-04-19 14:00:13 -0700 | [diff] [blame] | 98 | if (SkCpu::Supports(SkCpu::SSE2)) { |
tomhudson@google.com | d6770e6 | 2012-02-14 16:01:15 +0000 | [diff] [blame] | 99 | if (isOpaque) { |
| 100 | return SkBlitLCD16OpaqueRow_SSE2; |
| 101 | } else { |
| 102 | return SkBlitLCD16Row_SSE2; |
| 103 | } |
| 104 | } else { |
halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 105 | return nullptr; |
tomhudson@google.com | d6770e6 | 2012-02-14 16:01:15 +0000 | [diff] [blame] | 106 | } |
| 107 | |
| 108 | } |
commit-bot@chromium.org | 8c4953c | 2014-04-30 14:58:46 +0000 | [diff] [blame] | 109 | |
commit-bot@chromium.org | cba7378 | 2014-05-29 15:57:47 +0000 | [diff] [blame] | 110 | SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) { |
halcanary | 96fcdcc | 2015-08-27 07:41:13 -0700 | [diff] [blame] | 111 | return nullptr; |
reed@google.com | e901b4c | 2011-11-14 21:56:45 +0000 | [diff] [blame] | 112 | } |