blob: ec4e9f66bda3b979144f6d77d081c62c9a4350c0 [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
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +00008#include "SkBitmapProcState_opts_SSE2.h"
tomhudson@google.com95ad1552012-02-14 18:28:54 +00009#include "SkBitmapProcState_opts_SSSE3.h"
reed@google.com58af9a62011-10-12 13:43:52 +000010#include "SkBlitMask.h"
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000011#include "SkBlitRow.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000012#include "SkBlitRow_opts_SSE2.h"
mtklein4311f012016-04-19 14:00:13 -070013#include "SkCpu.h"
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000014
Melnikov.Sergey.V601e36a2016-04-08 15:31:45 -070015
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.orgce4402c2014-05-12 14:16:19 +000028/* 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.org4e753552009-11-16 21:09:00 +000033
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000034////////////////////////////////////////////////////////////////////////////////
35
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000036void SkBitmapProcState::platformProcs() {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000037 /* Every optimization in the function requires at least SSE2 */
mtklein4311f012016-04-19 14:00:13 -070038 if (!SkCpu::Supports(SkCpu::SSE2)) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000039 return;
40 }
mtklein4311f012016-04-19 14:00:13 -070041 const bool ssse3 = SkCpu::Supports(SkCpu::SSSE3);
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000042
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000043 /* Check fSampleProc32 */
44 if (fSampleProc32 == S32_opaque_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -080045 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000046 fSampleProc32 = S32_opaque_D32_filter_DX_SSSE3;
47 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000048 fSampleProc32 = S32_opaque_D32_filter_DX_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000049 }
50 } else if (fSampleProc32 == S32_opaque_D32_filter_DXDY) {
qiankun.miao60f3c652014-12-04 06:27:03 -080051 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000052 fSampleProc32 = S32_opaque_D32_filter_DXDY_SSSE3;
53 }
54 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -080055 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000056 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
57 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000058 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
59 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000060 } else if (fSampleProc32 == S32_alpha_D32_filter_DXDY) {
qiankun.miao60f3c652014-12-04 06:27:03 -080061 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000062 fSampleProc32 = S32_alpha_D32_filter_DXDY_SSSE3;
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000063 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000064 }
tomhudson@google.com06a73132012-02-22 18:30:43 +000065
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000066 /* 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.orgdc7de742009-11-30 20:00:29 +000076}
77
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000078////////////////////////////////////////////////////////////////////////////////
79
henrik.smiding4e654732015-02-10 09:42:33 -080080static const SkBlitRow::Proc32 platform_32_procs_SSE2[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070081 nullptr, // S32_Opaque,
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000082 S32_Blend_BlitRow32_SSE2, // S32_Blend,
mtkleinb4a7dc92016-03-23 06:29:12 -070083 nullptr, // Ported to SkOpts
henrik.smiding3bb195e2014-06-27 08:03:17 -070084 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
85};
henrik.smiding3bb195e2014-06-27 08:03:17 -070086
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000087SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
mtklein4311f012016-04-19 14:00:13 -070088 if (SkCpu::Supports(SkCpu::SSE2)) {
henrik.smiding3bb195e2014-06-27 08:03:17 -070089 return platform_32_procs_SSE2[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +000090 } else {
halcanary96fcdcc2015-08-27 07:41:13 -070091 return nullptr;
commit-bot@chromium.org47591072014-02-19 03:09:52 +000092 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000093}
94
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000095////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +000096
tomhudson@google.comd6770e62012-02-14 16:01:15 +000097SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
mtklein4311f012016-04-19 14:00:13 -070098 if (SkCpu::Supports(SkCpu::SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +000099 if (isOpaque) {
100 return SkBlitLCD16OpaqueRow_SSE2;
101 } else {
102 return SkBlitLCD16Row_SSE2;
103 }
104 } else {
halcanary96fcdcc2015-08-27 07:41:13 -0700105 return nullptr;
tomhudson@google.comd6770e62012-02-14 16:01:15 +0000106 }
107
108}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +0000109
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +0000110SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) {
halcanary96fcdcc2015-08-27 07:41:13 -0700111 return nullptr;
reed@google.come901b4c2011-11-14 21:56:45 +0000112}