blob: 2cb2e65bf1996929f89921d05c33c2f6891a4e21 [file] [log] [blame]
senorblanco@chromium.org4e753552009-11-16 21:09:00 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * 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.org4e753552009-11-16 21:09:00 +00006 */
7
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +00008#include "SkBitmapFilter_opts_SSE2.h"
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +00009#include "SkBitmapProcState_opts_SSE2.h"
tomhudson@google.com95ad1552012-02-14 18:28:54 +000010#include "SkBitmapProcState_opts_SSSE3.h"
humper4f96ab32014-06-27 11:27:03 -070011#include "SkBitmapScaler.h"
reed@google.com58af9a62011-10-12 13:43:52 +000012#include "SkBlitMask.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000013#include "SkBlitRow.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000014#include "SkBlitRow_opts_SSE2.h"
mtklein4311f012016-04-19 14:00:13 -070015#include "SkCpu.h"
reed959a2932016-05-05 01:36:43 -070016#include "SkOncePtr.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000017#include "SkRTConf.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000018
Melnikov.Sergey.V601e36a2016-04-08 15:31:45 -070019
20/*
21 *****************************************
22 *********This file is deprecated*********
23 *****************************************
24 * New CPU-specific work should be done in
25 * SkOpts framework. Run-time detection of
26 * available instruction set extensions is
27 * implemented in src/core/SkOpts.cpp file
28 *****************************************
29 */
30
31
commit-bot@chromium.orgce4402c2014-05-12 14:16:19 +000032/* This file must *not* be compiled with -msse or any other optional SIMD
33 extension, otherwise gcc may generate SIMD instructions even for scalar ops
34 (and thus give an invalid instruction on Pentium3 on the code below).
35 For example, only files named *_SSE2.cpp in this directory should be
36 compiled with -msse2 or higher. */
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000037
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000038////////////////////////////////////////////////////////////////////////////////
39
humper4f96ab32014-06-27 11:27:03 -070040void SkBitmapScaler::PlatformConvolutionProcs(SkConvolutionProcs* procs) {
mtklein4311f012016-04-19 14:00:13 -070041 if (SkCpu::Supports(SkCpu::SSE2)) {
reed@google.comfed04b32013-09-05 20:31:17 +000042 procs->fExtraHorizontalReads = 3;
43 procs->fConvolveVertically = &convolveVertically_SSE2;
44 procs->fConvolve4RowsHorizontally = &convolve4RowsHorizontally_SSE2;
45 procs->fConvolveHorizontally = &convolveHorizontally_SSE2;
46 procs->fApplySIMDPadding = &applySIMDPadding_SSE2;
humper@google.com138ebc32013-07-19 20:20:04 +000047 }
48}
49
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000050////////////////////////////////////////////////////////////////////////////////
51
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000052void SkBitmapProcState::platformProcs() {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000053 /* Every optimization in the function requires at least SSE2 */
mtklein4311f012016-04-19 14:00:13 -070054 if (!SkCpu::Supports(SkCpu::SSE2)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000055 return;
56 }
mtklein4311f012016-04-19 14:00:13 -070057 const bool ssse3 = SkCpu::Supports(SkCpu::SSSE3);
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000058
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000059 /* Check fSampleProc32 */
60 if (fSampleProc32 == S32_opaque_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -080061 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000062 fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
63 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000064 fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000065 }
66 } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
qiankun.miao60f3c652014-12-04 06:27:03 -080067 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000068 fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3;
69 }
70 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -080071 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000072 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
73 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000074 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
75 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000076 } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
qiankun.miao60f3c652014-12-04 06:27:03 -080077 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000078 fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000079 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000080 }
tomhudson@google.com06a73132012-02-22 18:30:43 +000081
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000082 /* Check fMatrixProc */
83 if (fMatrixProc == ClampX_ClampY_filter_scale) {
84 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
85 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
86 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
87 } else if (fMatrixProc == ClampX_ClampY_filter_affine) {
88 fMatrixProc = ClampX_ClampY_filter_affine_SSE2;
89 } else if (fMatrixProc == ClampX_ClampY_nofilter_affine) {
90 fMatrixProc = ClampX_ClampY_nofilter_affine_SSE2;
91 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000092}
93
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000094////////////////////////////////////////////////////////////////////////////////
95
henrik.smiding4e654732015-02-10 09:42:33 -080096static const SkBlitRow::Proc16 platform_16_procs[] = {
commit-bot@chromium.org39ce33a2014-02-24 04:23:39 +000097 S32_D565_Opaque_SSE2, // S32_D565_Opaque
halcanary96fcdcc2015-08-27 07:41:13 -070098 nullptr, // S32_D565_Blend
commit-bot@chromium.org47591072014-02-19 03:09:52 +000099 S32A_D565_Opaque_SSE2, // S32A_D565_Opaque
halcanary96fcdcc2015-08-27 07:41:13 -0700100 nullptr, // S32A_D565_Blend
commit-bot@chromium.org27580472014-03-07 03:25:32 +0000101 S32_D565_Opaque_Dither_SSE2, // S32_D565_Opaque_Dither
halcanary96fcdcc2015-08-27 07:41:13 -0700102 nullptr, // S32_D565_Blend_Dither
commit-bot@chromium.orgfe089b32014-03-07 13:24:42 +0000103 S32A_D565_Opaque_Dither_SSE2, // S32A_D565_Opaque_Dither
halcanary96fcdcc2015-08-27 07:41:13 -0700104 nullptr, // S32A_D565_Blend_Dither
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000105};
106
reeda7f11912015-01-13 13:51:00 -0800107SkBlitRow::Proc16 SkBlitRow::PlatformFactory565(unsigned flags) {
mtklein4311f012016-04-19 14:00:13 -0700108 if (SkCpu::Supports(SkCpu::SSE2)) {
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000109 return platform_16_procs[flags];
110 } else {
halcanary96fcdcc2015-08-27 07:41:13 -0700111 return nullptr;
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000112 }
113}
114
henrik.smiding70840cb2015-03-20 09:20:46 -0700115static const SkBlitRow::ColorProc16 platform_565_colorprocs_SSE2[] = {
116 Color32A_D565_SSE2, // Color32A_D565,
halcanary96fcdcc2015-08-27 07:41:13 -0700117 nullptr, // Color32A_D565_Dither
henrik.smiding4e654732015-02-10 09:42:33 -0800118};
119
reeda7f11912015-01-13 13:51:00 -0800120SkBlitRow::ColorProc16 SkBlitRow::PlatformColorFactory565(unsigned flags) {
henrik.smiding70840cb2015-03-20 09:20:46 -0700121/* If you're thinking about writing an SSE4 version of this, do check it's
122 * actually faster on Atom. Our original SSE4 version was slower than this
123 * SSE2 version on Silvermont, and only marginally faster on a Core i7,
124 * mainly due to the MULLD timings.
125 */
mtklein4311f012016-04-19 14:00:13 -0700126 if (SkCpu::Supports(SkCpu::SSE2)) {
henrik.smiding70840cb2015-03-20 09:20:46 -0700127 return platform_565_colorprocs_SSE2[flags];
henrik.smiding4e654732015-02-10 09:42:33 -0800128 } else {
halcanary96fcdcc2015-08-27 07:41:13 -0700129 return nullptr;
henrik.smiding4e654732015-02-10 09:42:33 -0800130 }
reeda7f11912015-01-13 13:51:00 -0800131}
132
henrik.smiding4e654732015-02-10 09:42:33 -0800133static const SkBlitRow::Proc32 platform_32_procs_SSE2[] = {
halcanary96fcdcc2015-08-27 07:41:13 -0700134 nullptr, // S32_Opaque,
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000135 S32_Blend_BlitRow32_SSE2, // S32_Blend,
mtkleinb4a7dc92016-03-23 06:29:12 -0700136 nullptr, // Ported to SkOpts
henrik.smiding3bb195e2014-06-27 08:03:17 -0700137 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
138};
henrik.smiding3bb195e2014-06-27 08:03:17 -0700139
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000140SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
mtklein4311f012016-04-19 14:00:13 -0700141 if (SkCpu::Supports(SkCpu::SSE2)) {
henrik.smiding3bb195e2014-06-27 08:03:17 -0700142 return platform_32_procs_SSE2[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000143 } else {
halcanary96fcdcc2015-08-27 07:41:13 -0700144 return nullptr;
commit-bot@chromium.org47591072014-02-19 03:09:52 +0000145 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +0000146}
147
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000148////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +0000149
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000150SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
mtklein4311f012016-04-19 14:00:13 -0700151 if (SkCpu::Supports(SkCpu::SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000152 if (isOpaque) {
153 return SkBlitLCD16OpaqueRow_SSE2;
154 } else {
155 return SkBlitLCD16Row_SSE2;
156 }
157 } else {
halcanary96fcdcc2015-08-27 07:41:13 -0700158 return nullptr;
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000159 }
160
161}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000162
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000163SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) {
halcanary96fcdcc2015-08-27 07:41:13 -0700164 return nullptr;
reed@google.come901b4c2011-11-14 21:56:45 +0000165}