blob: c71667dd8c1f5983aaf865c1b72e770ee53c447a [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 }
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000050 } else if (fSampleProc32 == S32_alpha_D32_filter_DX) {
qiankun.miao60f3c652014-12-04 06:27:03 -080051 if (ssse3) {
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000052 fSampleProc32 = S32_alpha_D32_filter_DX_SSSE3;
53 } else {
commit-bot@chromium.orgc398f712014-04-23 20:07:19 +000054 fSampleProc32 = S32_alpha_D32_filter_DX_SSE2;
55 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000056 }
tomhudson@google.com06a73132012-02-22 18:30:43 +000057
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000058 /* Check fMatrixProc */
59 if (fMatrixProc == ClampX_ClampY_filter_scale) {
60 fMatrixProc = ClampX_ClampY_filter_scale_SSE2;
61 } else if (fMatrixProc == ClampX_ClampY_nofilter_scale) {
62 fMatrixProc = ClampX_ClampY_nofilter_scale_SSE2;
commit-bot@chromium.org4b9b4562014-04-28 15:07:50 +000063 }
senorblanco@chromium.orgdc7de742009-11-30 20:00:29 +000064}
65
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000066////////////////////////////////////////////////////////////////////////////////
67
henrik.smiding4e654732015-02-10 09:42:33 -080068static const SkBlitRow::Proc32 platform_32_procs_SSE2[] = {
halcanary96fcdcc2015-08-27 07:41:13 -070069 nullptr, // S32_Opaque,
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000070 S32_Blend_BlitRow32_SSE2, // S32_Blend,
mtkleinb4a7dc92016-03-23 06:29:12 -070071 nullptr, // Ported to SkOpts
henrik.smiding3bb195e2014-06-27 08:03:17 -070072 S32A_Blend_BlitRow32_SSE2, // S32A_Blend,
73};
henrik.smiding3bb195e2014-06-27 08:03:17 -070074
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000075SkBlitRow::Proc32 SkBlitRow::PlatformProcs32(unsigned flags) {
mtklein4311f012016-04-19 14:00:13 -070076 if (SkCpu::Supports(SkCpu::SSE2)) {
henrik.smiding3bb195e2014-06-27 08:03:17 -070077 return platform_32_procs_SSE2[flags];
commit-bot@chromium.org47591072014-02-19 03:09:52 +000078 } else {
halcanary96fcdcc2015-08-27 07:41:13 -070079 return nullptr;
commit-bot@chromium.org47591072014-02-19 03:09:52 +000080 }
senorblanco@chromium.org4e753552009-11-16 21:09:00 +000081}
82
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000083////////////////////////////////////////////////////////////////////////////////
reed@google.com981d4792011-03-09 12:55:47 +000084
tomhudson@google.comd6770e62012-02-14 16:01:15 +000085SkBlitMask::BlitLCD16RowProc SkBlitMask::PlatformBlitRowProcs16(bool isOpaque) {
mtklein4311f012016-04-19 14:00:13 -070086 if (SkCpu::Supports(SkCpu::SSE2)) {
tomhudson@google.comd6770e62012-02-14 16:01:15 +000087 if (isOpaque) {
88 return SkBlitLCD16OpaqueRow_SSE2;
89 } else {
90 return SkBlitLCD16Row_SSE2;
91 }
92 } else {
halcanary96fcdcc2015-08-27 07:41:13 -070093 return nullptr;
tomhudson@google.comd6770e62012-02-14 16:01:15 +000094 }
95
96}
commit-bot@chromium.org8c4953c2014-04-30 14:58:46 +000097
commit-bot@chromium.orgcba73782014-05-29 15:57:47 +000098SkBlitMask::RowProc SkBlitMask::PlatformRowProcs(SkColorType, SkMask::Format, RowFlags) {
halcanary96fcdcc2015-08-27 07:41:13 -070099 return nullptr;
reed@google.come901b4c2011-11-14 21:56:45 +0000100}