create shaderproc for nofilter-opaque-dx
speedup nofilter BUG=skia: Review URL: https://codereview.chromium.org/664783004
This commit is contained in:
parent
404eb87993
commit
a40a276bce
@ -75,6 +75,7 @@ class BitmapBench : public Benchmark {
|
||||
const SkAlphaType fAlphaType;
|
||||
const bool fForceUpdate; //bitmap marked as dirty before each draw. forces bitmap to be updated on device cache
|
||||
const bool fIsVolatile;
|
||||
const bool fDoScale;
|
||||
|
||||
SkBitmap fBitmap;
|
||||
SkPaint fPaint;
|
||||
@ -83,11 +84,12 @@ class BitmapBench : public Benchmark {
|
||||
enum { W = 128 };
|
||||
enum { H = 128 };
|
||||
public:
|
||||
BitmapBench(SkColorType ct, SkAlphaType at, bool forceUpdate = false, bool isVolatile = false)
|
||||
BitmapBench(SkColorType ct, SkAlphaType at, bool forceUpdate, bool isVolatile, bool doScale)
|
||||
: fColorType(ct)
|
||||
, fAlphaType(at)
|
||||
, fForceUpdate(forceUpdate)
|
||||
, fIsVolatile(isVolatile)
|
||||
, fDoScale(doScale)
|
||||
{}
|
||||
|
||||
protected:
|
||||
@ -95,10 +97,15 @@ protected:
|
||||
fName.set("bitmap");
|
||||
fName.appendf("_%s%s", sk_tool_utils::colortype_name(fColorType),
|
||||
kOpaque_SkAlphaType == fAlphaType ? "" : "_A");
|
||||
if (fForceUpdate)
|
||||
if (fDoScale) {
|
||||
fName.append("_scale");
|
||||
}
|
||||
if (fForceUpdate) {
|
||||
fName.append("_update");
|
||||
if (fIsVolatile)
|
||||
}
|
||||
if (fIsVolatile) {
|
||||
fName.append("_volatile");
|
||||
}
|
||||
|
||||
return fName.c_str();
|
||||
}
|
||||
@ -125,6 +132,9 @@ protected:
|
||||
}
|
||||
|
||||
virtual void onDraw(const int loops, SkCanvas* canvas) {
|
||||
if (fDoScale) {
|
||||
canvas->scale(.99f, .99f);
|
||||
}
|
||||
SkIPoint dim = this->getSize();
|
||||
SkRandom rand;
|
||||
|
||||
@ -193,7 +203,7 @@ class FilterBitmapBench : public BitmapBench {
|
||||
public:
|
||||
FilterBitmapBench(SkColorType ct, SkAlphaType at,
|
||||
bool forceUpdate, bool isVolitile, uint32_t flags)
|
||||
: INHERITED(ct, at, forceUpdate, isVolitile)
|
||||
: INHERITED(ct, at, forceUpdate, isVolitile, false)
|
||||
, fFlags(flags) {
|
||||
}
|
||||
|
||||
@ -272,7 +282,7 @@ private:
|
||||
public:
|
||||
SourceAlphaBitmapBench(SourceAlpha alpha, SkColorType ct,
|
||||
bool forceUpdate = false, bool bitmapVolatile = false)
|
||||
: INHERITED(ct, kPremul_SkAlphaType, forceUpdate, bitmapVolatile)
|
||||
: INHERITED(ct, kPremul_SkAlphaType, forceUpdate, bitmapVolatile, false)
|
||||
, fSourceAlpha(alpha) {
|
||||
}
|
||||
|
||||
@ -349,13 +359,14 @@ private:
|
||||
typedef BitmapBench INHERITED;
|
||||
};
|
||||
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kPremul_SkAlphaType); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType); )
|
||||
DEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType); )
|
||||
DEF_BENCH( return new BitmapBench(kIndex_8_SkColorType, kPremul_SkAlphaType); )
|
||||
DEF_BENCH( return new BitmapBench(kIndex_8_SkColorType, kOpaque_SkAlphaType); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, false); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, false); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, false, false, true); )
|
||||
DEF_BENCH( return new BitmapBench(kRGB_565_SkColorType, kOpaque_SkAlphaType, false, false, false); )
|
||||
DEF_BENCH( return new BitmapBench(kIndex_8_SkColorType, kPremul_SkAlphaType, false, false, false); )
|
||||
DEF_BENCH( return new BitmapBench(kIndex_8_SkColorType, kOpaque_SkAlphaType, false, false, false); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, true, false); )
|
||||
DEF_BENCH( return new BitmapBench(kN32_SkColorType, kOpaque_SkAlphaType, true, false, false); )
|
||||
|
||||
// scale filter -> S32_opaque_D32_filter_DX_{SSE2,SSSE3} and Fact9 is also for S32_D16_filter_DX_SSE2
|
||||
DEF_BENCH( return new FilterBitmapBench(kN32_SkColorType, kPremul_SkAlphaType, false, false, kScale_Flag | kBilerp_Flag); )
|
||||
|
@ -30,6 +30,8 @@ extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&,
|
||||
extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int);
|
||||
#endif
|
||||
|
||||
extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState&, int, int, uint32_t*, int);
|
||||
|
||||
#define NAME_WRAP(x) x
|
||||
#include "SkBitmapProcState_filter.h"
|
||||
#include "SkBitmapProcState_procs.h"
|
||||
@ -589,6 +591,8 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
|
||||
}
|
||||
} else if (SK_ARM_NEON_WRAP(SI8_opaque_D32_filter_DX) == fSampleProc32 && clampClamp) {
|
||||
fShaderProc32 = SK_ARM_NEON_WRAP(Clamp_SI8_opaque_D32_filter_DX_shaderproc);
|
||||
} else if (S32_opaque_D32_nofilter_DX == fSampleProc32 && clampClamp) {
|
||||
fShaderProc32 = Clamp_S32_opaque_D32_nofilter_DX_shaderproc;
|
||||
}
|
||||
|
||||
if (NULL == fShaderProc32) {
|
||||
@ -1019,3 +1023,58 @@ int SkBitmapProcState::maxCountForBufferSize(size_t bufferSize) const {
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
///////////////////////
|
||||
|
||||
void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, int x, int y,
|
||||
SkPMColor* SK_RESTRICT dst, int count) {
|
||||
SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
|
||||
SkMatrix::kScale_Mask)) == 0);
|
||||
|
||||
const unsigned maxX = s.fBitmap->width() - 1;
|
||||
SkFractionalInt fx;
|
||||
int dstY;
|
||||
{
|
||||
SkPoint pt;
|
||||
s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf,
|
||||
&pt);
|
||||
fx = SkScalarToFractionalInt(pt.fY);
|
||||
const unsigned maxY = s.fBitmap->height() - 1;
|
||||
dstY = SkClampMax(SkFractionalIntToInt(fx), maxY);
|
||||
fx = SkScalarToFractionalInt(pt.fX);
|
||||
}
|
||||
|
||||
const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY);
|
||||
const SkFractionalInt dx = s.fInvSxFractionalInt;
|
||||
|
||||
// Check if we're safely inside [0...maxX] so no need to clamp each computed index.
|
||||
//
|
||||
if ((uint64_t)SkFractionalIntToInt(fx) <= maxX &&
|
||||
(uint64_t)SkFractionalIntToInt(fx + dx * (count - 1)) <= maxX)
|
||||
{
|
||||
int count4 = count >> 2;
|
||||
for (int i = 0; i < count4; ++i) {
|
||||
SkPMColor src0 = src[SkFractionalIntToInt(fx)]; fx += dx;
|
||||
SkPMColor src1 = src[SkFractionalIntToInt(fx)]; fx += dx;
|
||||
SkPMColor src2 = src[SkFractionalIntToInt(fx)]; fx += dx;
|
||||
SkPMColor src3 = src[SkFractionalIntToInt(fx)]; fx += dx;
|
||||
dst[0] = src0;
|
||||
dst[1] = src1;
|
||||
dst[2] = src2;
|
||||
dst[3] = src3;
|
||||
dst += 4;
|
||||
}
|
||||
for (int i = (count4 << 2); i < count; ++i) {
|
||||
unsigned index = SkFractionalIntToInt(fx);
|
||||
SkASSERT(index <= maxX);
|
||||
*dst++ = src[index];
|
||||
fx += dx;
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < count; ++i) {
|
||||
dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)];
|
||||
fx += dx;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user