SkRasterPipeline_opts: split next() into next_body() and next_tail().
This may work around an Chrome/MSVC/PGO compiler crasher. Even if not, it's harmless for performance, and arguably more readable. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=3789 Change-Id: I0bf23f65d7832b9f43e275f85e7985fcd6b13b9f Reviewed-on: https://skia-review.googlesource.com/3789 Commit-Queue: Mike Klein <mtklein@chromium.org> Reviewed-by: Mike Klein <mtklein@chromium.org>
This commit is contained in:
parent
7cfd46aebd
commit
49372e69d3
@ -33,12 +33,19 @@ using Tail = void(SK_VECTORCALL *)(SkRasterPipeline::Stage*, size_t, size_t,
|
|||||||
|
|
||||||
#define SI static inline
|
#define SI static inline
|
||||||
|
|
||||||
template <typename Fn, typename... Args>
|
// Stages are logically a pipeline, and physically are contiguous in an array.
|
||||||
SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
// To get to the next stage, we just increment our pointer to the next array element.
|
||||||
// Stages are logically a pipeline, and physically are contiguous in an array.
|
SI void SK_VECTORCALL next_body(SkRasterPipeline::Stage* st, size_t x,
|
||||||
// To get to the next stage, we just increment our pointer to the next array element.
|
SkNf r, SkNf g, SkNf b, SkNf a,
|
||||||
((Fn)st->fNext)(st+1, std::forward<Args>(args)...);
|
SkNf dr, SkNf dg, SkNf db, SkNf da) {
|
||||||
|
((Body)st->fNext)(st+1, x, r,g,b,a, dr,dg,db,da);
|
||||||
}
|
}
|
||||||
|
SI void SK_VECTORCALL next_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail,
|
||||||
|
SkNf r, SkNf g, SkNf b, SkNf a,
|
||||||
|
SkNf dr, SkNf dg, SkNf db, SkNf da) {
|
||||||
|
((Tail)st->fNext)(st+1, x,tail, r,g,b,a, dr,dg,db,da);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define STAGE(name, kCallNext) \
|
#define STAGE(name, kCallNext) \
|
||||||
template <bool kIsTail> \
|
template <bool kIsTail> \
|
||||||
@ -50,7 +57,7 @@ SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
|||||||
SkNf dr, SkNf dg, SkNf db, SkNf da) { \
|
SkNf dr, SkNf dg, SkNf db, SkNf da) { \
|
||||||
name##_kernel<false>(st->fCtx, x,0, r,g,b,a, dr,dg,db,da); \
|
name##_kernel<false>(st->fCtx, x,0, r,g,b,a, dr,dg,db,da); \
|
||||||
if (kCallNext) { \
|
if (kCallNext) { \
|
||||||
next<Body>(st, x, r,g,b,a, dr,dg,db,da); \
|
next_body(st, x, r,g,b,a, dr,dg,db,da); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
SI void SK_VECTORCALL name##_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail, \
|
SI void SK_VECTORCALL name##_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail, \
|
||||||
@ -58,7 +65,7 @@ SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
|||||||
SkNf dr, SkNf dg, SkNf db, SkNf da) { \
|
SkNf dr, SkNf dg, SkNf db, SkNf da) { \
|
||||||
name##_kernel<true>(st->fCtx, x,tail, r,g,b,a, dr,dg,db,da); \
|
name##_kernel<true>(st->fCtx, x,tail, r,g,b,a, dr,dg,db,da); \
|
||||||
if (kCallNext) { \
|
if (kCallNext) { \
|
||||||
next<Tail>(st, x,tail, r,g,b,a, dr,dg,db,da); \
|
next_tail(st, x,tail, r,g,b,a, dr,dg,db,da); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
template <bool kIsTail> \
|
template <bool kIsTail> \
|
||||||
@ -78,7 +85,7 @@ SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
|||||||
g = name##_kernel(g,a,dg,da); \
|
g = name##_kernel(g,a,dg,da); \
|
||||||
b = name##_kernel(b,a,db,da); \
|
b = name##_kernel(b,a,db,da); \
|
||||||
a = name##_kernel(a,a,da,da); \
|
a = name##_kernel(a,a,da,da); \
|
||||||
next<Body>(st, x, r,g,b,a, dr,dg,db,da); \
|
next_body(st, x, r,g,b,a, dr,dg,db,da); \
|
||||||
} \
|
} \
|
||||||
SI void SK_VECTORCALL name##_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail, \
|
SI void SK_VECTORCALL name##_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail, \
|
||||||
SkNf r, SkNf g, SkNf b, SkNf a, \
|
SkNf r, SkNf g, SkNf b, SkNf a, \
|
||||||
@ -87,7 +94,7 @@ SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
|||||||
g = name##_kernel(g,a,dg,da); \
|
g = name##_kernel(g,a,dg,da); \
|
||||||
b = name##_kernel(b,a,db,da); \
|
b = name##_kernel(b,a,db,da); \
|
||||||
a = name##_kernel(a,a,da,da); \
|
a = name##_kernel(a,a,da,da); \
|
||||||
next<Tail>(st, x,tail, r,g,b,a, dr,dg,db,da); \
|
next_tail(st, x,tail, r,g,b,a, dr,dg,db,da); \
|
||||||
} \
|
} \
|
||||||
static SK_ALWAYS_INLINE SkNf name##_kernel(const SkNf& s, const SkNf& sa, \
|
static SK_ALWAYS_INLINE SkNf name##_kernel(const SkNf& s, const SkNf& sa, \
|
||||||
const SkNf& d, const SkNf& da)
|
const SkNf& d, const SkNf& da)
|
||||||
@ -103,7 +110,7 @@ SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
|||||||
g = name##_kernel(g,a,dg,da); \
|
g = name##_kernel(g,a,dg,da); \
|
||||||
b = name##_kernel(b,a,db,da); \
|
b = name##_kernel(b,a,db,da); \
|
||||||
a = a + (da * (1.0f-a)); \
|
a = a + (da * (1.0f-a)); \
|
||||||
next<Body>(st, x, r,g,b,a, dr,dg,db,da); \
|
next_body(st, x, r,g,b,a, dr,dg,db,da); \
|
||||||
} \
|
} \
|
||||||
SI void SK_VECTORCALL name##_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail, \
|
SI void SK_VECTORCALL name##_tail(SkRasterPipeline::Stage* st, size_t x, size_t tail, \
|
||||||
SkNf r, SkNf g, SkNf b, SkNf a, \
|
SkNf r, SkNf g, SkNf b, SkNf a, \
|
||||||
@ -112,7 +119,7 @@ SI void next(SkRasterPipeline::Stage* st, Args&&... args) {
|
|||||||
g = name##_kernel(g,a,dg,da); \
|
g = name##_kernel(g,a,dg,da); \
|
||||||
b = name##_kernel(b,a,db,da); \
|
b = name##_kernel(b,a,db,da); \
|
||||||
a = a + (da * (1.0f-a)); \
|
a = a + (da * (1.0f-a)); \
|
||||||
next<Tail>(st, x,tail, r,g,b,a, dr,dg,db,da); \
|
next_tail(st, x,tail, r,g,b,a, dr,dg,db,da); \
|
||||||
} \
|
} \
|
||||||
static SK_ALWAYS_INLINE SkNf name##_kernel(const SkNf& s, const SkNf& sa, \
|
static SK_ALWAYS_INLINE SkNf name##_kernel(const SkNf& s, const SkNf& sa, \
|
||||||
const SkNf& d, const SkNf& da)
|
const SkNf& d, const SkNf& da)
|
||||||
|
Loading…
Reference in New Issue
Block a user