Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: src/core/SkBitmapProcState.cpp

Issue 664783004: create shaderproc for nofilter-opaque-dx (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: remove confusing neon wrap Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « bench/BitmapBench.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkBitmapCache.h" 8 #include "SkBitmapCache.h"
9 #include "SkBitmapProcState.h" 9 #include "SkBitmapProcState.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
(...skipping 12 matching lines...) Expand all
23 extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[]; 23 extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[];
24 extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[]; 24 extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[];
25 extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, i nt, uint16_t*); 25 extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, i nt, uint16_t*);
26 extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, i nt, int, uint16_t*, int); 26 extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, i nt, int, uint16_t*, int);
27 extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint16_t*, int); 27 extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint16_t*, int);
28 extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3 2_t*, int, SkPMColor*); 28 extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint3 2_t*, int, SkPMColor*);
29 extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int); 29 extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int);
30 extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcSt ate&, int, int, uint32_t*, int); 30 extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcSt ate&, int, int, uint32_t*, int);
31 #endif 31 #endif
32 32
33 extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& , int, int, uint32_t*, int);
34
33 #define NAME_WRAP(x) x 35 #define NAME_WRAP(x) x
34 #include "SkBitmapProcState_filter.h" 36 #include "SkBitmapProcState_filter.h"
35 #include "SkBitmapProcState_procs.h" 37 #include "SkBitmapProcState_procs.h"
36 38
37 /////////////////////////////////////////////////////////////////////////////// 39 ///////////////////////////////////////////////////////////////////////////////
38 40
39 // true iff the matrix contains, at most, scale and translate elements 41 // true iff the matrix contains, at most, scale and translate elements
40 static bool matrix_only_scale_translate(const SkMatrix& m) { 42 static bool matrix_only_scale_translate(const SkMatrix& m) {
41 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask); 43 return m.getType() <= (SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask);
42 } 44 }
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 // our special-case shaderprocs 584 // our special-case shaderprocs
583 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) { 585 if (SK_ARM_NEON_WRAP(S16_D16_filter_DX) == fSampleProc16) {
584 if (clampClamp) { 586 if (clampClamp) {
585 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp roc); 587 fShaderProc16 = SK_ARM_NEON_WRAP(Clamp_S16_D16_filter_DX_shaderp roc);
586 } else if (SkShader::kRepeat_TileMode == fTileModeX && 588 } else if (SkShader::kRepeat_TileMode == fTileModeX &&
587 SkShader::kRepeat_TileMode == fTileModeY) { 589 SkShader::kRepeat_TileMode == fTileModeY) {
588 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader proc); 590 fShaderProc16 = SK_ARM_NEON_WRAP(Repeat_S16_D16_filter_DX_shader proc);
589 } 591 }
590 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 & & clampClamp) { 592 } else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 & & clampClamp) {
591 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad erproc); 593 fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shad erproc);
594 } else if (S32_opaque_D32_nofilter_DX == fSampleProc32 && clampClamp) {
595 fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc;
592 } 596 }
593 597
594 if (NULL == fShaderProc32) { 598 if (NULL == fShaderProc32) {
595 fShaderProc32 = this->chooseShaderProc32(); 599 fShaderProc32 = this->chooseShaderProc32();
596 } 600 }
597 } 601 }
598 602
599 // see if our platform has any accelerated overrides 603 // see if our platform has any accelerated overrides
600 this->platformProcs(); 604 this->platformProcs();
601 605
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 } else { 1016 } else {
1013 size >>= 2; 1017 size >>= 2;
1014 } 1018 }
1015 1019
1016 if (fFilterLevel != SkPaint::kNone_FilterLevel) { 1020 if (fFilterLevel != SkPaint::kNone_FilterLevel) {
1017 size >>= 1; 1021 size >>= 1;
1018 } 1022 }
1019 1023
1020 return size; 1024 return size;
1021 } 1025 }
1026
1027 ///////////////////////
1028
1029 void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, in t x, int y,
1030 SkPMColor* SK_RESTRICT dst, in t count) {
1031 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
1032 SkMatrix::kScale_Mask)) == 0);
1033
1034 const unsigned maxX = s.fBitmap->width() - 1;
1035 SkFractionalInt fx;
1036 int dstY;
1037 {
1038 SkPoint pt;
1039 s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar (y) + SK_ScalarHalf,
1040 &pt);
1041 fx = SkScalarToFractionalInt(pt.fY);
1042 const unsigned maxY = s.fBitmap->height() - 1;
1043 dstY = SkClampMax(SkFractionalIntToInt(fx), maxY);
1044 fx = SkScalarToFractionalInt(pt.fX);
1045 }
1046
1047 const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY);
1048 const SkFractionalInt dx = s.fInvSxFractionalInt;
1049
1050 // Check if we're safely inside [0...maxX] so no need to clamp each computed index.
1051 //
1052 if ((uint64_t)SkFractionalIntToInt(fx) <= maxX &&
1053 (uint64_t)SkFractionalIntToInt(fx + dx * (count - 1)) <= maxX)
1054 {
1055 int count4 = count >> 2;
1056 for (int i = 0; i < count4; ++i) {
1057 SkPMColor src0 = src[SkFractionalIntToInt(fx)]; fx += dx;
1058 SkPMColor src1 = src[SkFractionalIntToInt(fx)]; fx += dx;
1059 SkPMColor src2 = src[SkFractionalIntToInt(fx)]; fx += dx;
1060 SkPMColor src3 = src[SkFractionalIntToInt(fx)]; fx += dx;
1061 dst[0] = src0;
1062 dst[1] = src1;
1063 dst[2] = src2;
1064 dst[3] = src3;
1065 dst += 4;
1066 }
1067 for (int i = (count4 << 2); i < count; ++i) {
1068 unsigned index = SkFractionalIntToInt(fx);
1069 SkASSERT(index <= maxX);
1070 *dst++ = src[index];
1071 fx += dx;
1072 }
1073 } else {
1074 for (int i = 0; i < count; ++i) {
1075 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)];
1076 fx += dx;
1077 }
1078 }
1079 }
1080
OLDNEW
« no previous file with comments | « bench/BitmapBench.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698