Skip to content

Commit

Permalink
trim off more bgra stages
Browse files Browse the repository at this point in the history
Same deal as before, just swap_rb where needed.

The change to SkWebpCodec could probably land independently if we want.

Change-Id: Idd53ab76232cb95eb2f41cd65c6903fa7c5b01d6
Reviewed-on: https://skia-review.googlesource.com/c/163440
Commit-Queue: Brian Osman <brianosman@google.com>
Auto-Submit: Mike Klein <mtklein@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
  • Loading branch information
Mike Klein authored and Skia Commit-Bot committed Oct 18, 2018
1 parent d04b551 commit 1a3eb52
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 152 deletions.
41 changes: 3 additions & 38 deletions bench/ColorSpaceXformBench.cpp
Expand Up @@ -13,29 +13,20 @@
#include "SkMakeUnique.h"
#include "SkPM4f.h"
#include "SkRandom.h"
#include "SkRasterPipeline.h"

enum class Mode { steps, pipeA, pipeB, xformer };
enum class Mode { steps, xformer };

struct ColorSpaceXformBench : public Benchmark {
ColorSpaceXformBench(Mode mode) : fMode(mode) {}

const Mode fMode;

std::unique_ptr<SkColorSpaceXformSteps> fSteps;
std::function<void(size_t, size_t, size_t, size_t)> fPipeA;

SkJumper_MemoryCtx fPipeSrc = {nullptr,0},
fPipeDst = {nullptr,0};
SkSTArenaAlloc<1024> fAlloc;

std::unique_ptr<SkColorSpaceXformer> fXformer;
std::unique_ptr<SkColorSpaceXformSteps> fSteps;
std::unique_ptr<SkColorSpaceXformer> fXformer;

const char* onGetName() override {
switch (fMode) {
case Mode::steps : return "ColorSpaceXformBench_steps";
case Mode::pipeA : return "ColorSpaceXformBench_pipeA";
case Mode::pipeB : return "ColorSpaceXformBench_pipeB";
case Mode::xformer: return "ColorSpaceXformBench_xformer";
}
return "";
Expand All @@ -50,14 +41,6 @@ struct ColorSpaceXformBench : public Benchmark {

fSteps = skstd::make_unique<SkColorSpaceXformSteps>(src.get(), kOpaque_SkAlphaType,
dst.get(), kPremul_SkAlphaType);

SkRasterPipeline p(&fAlloc);
p.append(SkRasterPipeline::load_bgra, &fPipeSrc);
fSteps->apply(&p);
p.append(SkRasterPipeline::store_bgra, &fPipeDst);

fPipeA = p.compile();

fXformer = SkColorSpaceXformer::Make(dst); // src is implicitly sRGB, what we want anyway
}

Expand All @@ -68,9 +51,6 @@ struct ColorSpaceXformBench : public Benchmark {
for (int i = 0; i < n; i++) {
SkColor src = rand.nextU(),
dst;
fPipeSrc.pixels = &src;
fPipeDst.pixels = &dst;

switch (fMode) {
case Mode::steps: {
float rgba[4];
Expand All @@ -79,19 +59,6 @@ struct ColorSpaceXformBench : public Benchmark {
dst = Sk4f_toL32(swizzle_rb(Sk4f::Load(rgba)));
} break;

case Mode::pipeA: {
fPipeA(0,0,1,1);
} break;

case Mode::pipeB: {
SkSTArenaAlloc<1024> alloc;
SkRasterPipeline p(&alloc);
p.append(SkRasterPipeline::load_bgra, &fPipeSrc);
fSteps->apply(&p);
p.append(SkRasterPipeline::store_bgra, &fPipeDst);
p.run(0,0,1,1);
} break;

case Mode::xformer: {
dst = fXformer->apply(src);
} break;
Expand All @@ -107,6 +74,4 @@ struct ColorSpaceXformBench : public Benchmark {
};

DEF_BENCH(return new ColorSpaceXformBench{Mode::steps };)
DEF_BENCH(return new ColorSpaceXformBench{Mode::pipeA };)
DEF_BENCH(return new ColorSpaceXformBench{Mode::pipeB };)
DEF_BENCH(return new ColorSpaceXformBench{Mode::xformer};)
54 changes: 4 additions & 50 deletions src/codec/SkWebpCodec.cpp
Expand Up @@ -333,44 +333,6 @@ static bool is_8888(SkColorType colorType) {
}
}

static void pick_memory_stages(SkColorType ct, SkRasterPipeline::StockStage* load,
SkRasterPipeline::StockStage* store) {
switch(ct) {
case kUnknown_SkColorType:
case kAlpha_8_SkColorType:
case kARGB_4444_SkColorType:
case kGray_8_SkColorType:
case kRGB_888x_SkColorType:
case kRGB_101010x_SkColorType:
SkASSERT(false);
break;
case kRGB_565_SkColorType:
if (load) *load = SkRasterPipeline::load_565;
if (store) *store = SkRasterPipeline::store_565;
break;
case kRGBA_8888_SkColorType:
if (load) *load = SkRasterPipeline::load_8888;
if (store) *store = SkRasterPipeline::store_8888;
break;
case kBGRA_8888_SkColorType:
if (load) *load = SkRasterPipeline::load_bgra;
if (store) *store = SkRasterPipeline::store_bgra;
break;
case kRGBA_1010102_SkColorType:
if (load) *load = SkRasterPipeline::load_1010102;
if (store) *store = SkRasterPipeline::store_1010102;
break;
case kRGBA_F16_SkColorType:
if (load) *load = SkRasterPipeline::load_f16;
if (store) *store = SkRasterPipeline::store_f16;
break;
case kRGBA_F32_SkColorType:
if (load) *load = SkRasterPipeline::load_f32;
if (store) *store = SkRasterPipeline::store_f32;
break;
}
}

// Requires that the src input be unpremultiplied (or opaque).
static void blend_line(SkColorType dstCT, void* dst,
SkColorType srcCT, const void* src,
Expand All @@ -381,31 +343,23 @@ static void blend_line(SkColorType dstCT, void* dst,
src_ctx = { (void*)src, 0 };

SkRasterPipeline_<256> p;
SkRasterPipeline::StockStage load_dst, store_dst;
pick_memory_stages(dstCT, &load_dst, &store_dst);

// Load the final dst.
p.append(load_dst, &dst_ctx);
p.append_load_dst(dstCT, &dst_ctx);
if (kUnpremul_SkAlphaType == dstAt) {
p.append(SkRasterPipeline::premul);
p.append(SkRasterPipeline::premul_dst);
}
p.append(SkRasterPipeline::move_src_dst);

// Load the src.
SkRasterPipeline::StockStage load_src;
pick_memory_stages(srcCT, &load_src, nullptr);
p.append(load_src, &src_ctx);
p.append_load(srcCT, &src_ctx);
if (srcHasAlpha) {
p.append(SkRasterPipeline::premul);
}

p.append(SkRasterPipeline::srcover);

// Convert back to dst.
if (kUnpremul_SkAlphaType == dstAt) {
p.append(SkRasterPipeline::unpremul);
}
p.append(store_dst, &dst_ctx);
p.append_store(dstCT, &dst_ctx);

p.run(0,0, width,1);
}
Expand Down
6 changes: 4 additions & 2 deletions src/core/SkColorSpaceXformer.cpp
Expand Up @@ -23,9 +23,11 @@ SkColorSpaceXformer::SkColorSpaceXformer(sk_sp<SkColorSpace> dst)
, fReentryCount(0) {

SkRasterPipeline p(&fAlloc);
p.append(SkRasterPipeline::load_bgra, &fFromSRGBSrc);
p.append(SkRasterPipeline::load_8888, &fFromSRGBSrc);
p.append(SkRasterPipeline::swap_rb);
fFromSRGBSteps.apply(&p);
p.append(SkRasterPipeline::store_bgra, &fFromSRGBDst);
p.append(SkRasterPipeline::swap_rb);
p.append(SkRasterPipeline::store_8888, &fFromSRGBDst);
fFromSRGB = p.compile();
}

Expand Down
45 changes: 27 additions & 18 deletions src/core/SkRasterPipeline.cpp
Expand Up @@ -200,7 +200,6 @@ void SkRasterPipeline::append_load(SkColorType ct, const SkJumper_MemoryCtx* ctx
case kAlpha_8_SkColorType: this->append(load_a8, ctx); break;
case kRGB_565_SkColorType: this->append(load_565, ctx); break;
case kARGB_4444_SkColorType: this->append(load_4444, ctx); break;
case kBGRA_8888_SkColorType: this->append(load_bgra, ctx); break;
case kRGBA_8888_SkColorType: this->append(load_8888, ctx); break;
case kRGBA_1010102_SkColorType: this->append(load_1010102, ctx); break;
case kRGBA_F16_SkColorType: this->append(load_f16, ctx); break;
Expand All @@ -210,13 +209,17 @@ void SkRasterPipeline::append_load(SkColorType ct, const SkJumper_MemoryCtx* ctx
this->append(alpha_to_gray);
break;

case kRGB_888x_SkColorType: this->append(load_8888, ctx);
this->append(force_opaque);
break;
case kRGB_888x_SkColorType: this->append(load_8888, ctx);
this->append(force_opaque);
break;

case kRGB_101010x_SkColorType: this->append(load_1010102, ctx);
this->append(force_opaque);
break;

case kRGB_101010x_SkColorType: this->append(load_1010102, ctx);
this->append(force_opaque);
break;
case kBGRA_8888_SkColorType: this->append(load_8888, ctx);
this->append(swap_rb);
break;
}
}

Expand All @@ -227,7 +230,6 @@ void SkRasterPipeline::append_load_dst(SkColorType ct, const SkJumper_MemoryCtx*
case kAlpha_8_SkColorType: this->append(load_a8_dst, ctx); break;
case kRGB_565_SkColorType: this->append(load_565_dst, ctx); break;
case kARGB_4444_SkColorType: this->append(load_4444_dst, ctx); break;
case kBGRA_8888_SkColorType: this->append(load_bgra_dst, ctx); break;
case kRGBA_8888_SkColorType: this->append(load_8888_dst, ctx); break;
case kRGBA_1010102_SkColorType: this->append(load_1010102_dst, ctx); break;
case kRGBA_F16_SkColorType: this->append(load_f16_dst, ctx); break;
Expand All @@ -244,6 +246,10 @@ void SkRasterPipeline::append_load_dst(SkColorType ct, const SkJumper_MemoryCtx*
case kRGB_101010x_SkColorType: this->append(load_1010102_dst, ctx);
this->append(force_opaque_dst);
break;

case kBGRA_8888_SkColorType: this->append(load_8888_dst, ctx);
this->append(swap_rb_dst);
break;
}
}

Expand All @@ -254,23 +260,26 @@ void SkRasterPipeline::append_store(SkColorType ct, const SkJumper_MemoryCtx* ct
case kAlpha_8_SkColorType: this->append(store_a8, ctx); break;
case kRGB_565_SkColorType: this->append(store_565, ctx); break;
case kARGB_4444_SkColorType: this->append(store_4444, ctx); break;
case kBGRA_8888_SkColorType: this->append(store_bgra, ctx); break;
case kRGBA_8888_SkColorType: this->append(store_8888, ctx); break;
case kRGBA_1010102_SkColorType: this->append(store_1010102, ctx); break;
case kRGBA_F16_SkColorType: this->append(store_f16, ctx); break;
case kRGBA_F32_SkColorType: this->append(store_f32, ctx); break;

case kRGB_888x_SkColorType: this->append(force_opaque);
this->append(store_8888, ctx);
break;
case kRGB_888x_SkColorType: this->append(force_opaque);
this->append(store_8888, ctx);
break;

case kRGB_101010x_SkColorType: this->append(force_opaque);
this->append(store_1010102, ctx);
break;
case kRGB_101010x_SkColorType: this->append(force_opaque);
this->append(store_1010102, ctx);
break;

case kGray_8_SkColorType: this->append(luminance_to_alpha);
this->append(store_a8, ctx);
break;
case kGray_8_SkColorType: this->append(luminance_to_alpha);
this->append(store_a8, ctx);
break;

case kBGRA_8888_SkColorType: this->append(swap_rb);
this->append(store_8888, ctx);
break;
}
}

Expand Down
3 changes: 1 addition & 2 deletions src/core/SkRasterPipeline.h
Expand Up @@ -41,7 +41,7 @@
M(clamp_0) M(clamp_1) M(clamp_a) M(clamp_a_dst) M(clamp_gamut) \
M(unpremul) M(premul) M(premul_dst) \
M(force_opaque) M(force_opaque_dst) \
M(set_rgb) M(unbounded_set_rgb) M(swap_rb) \
M(set_rgb) M(unbounded_set_rgb) M(swap_rb) M(swap_rb_dst) \
M(from_srgb) M(to_srgb) \
M(black_color) M(white_color) M(uniform_color) M(unbounded_uniform_color) \
M(seed_shader) M(dither) \
Expand All @@ -51,7 +51,6 @@
M(load_f16) M(load_f16_dst) M(store_f16) M(gather_f16) \
M(load_f32) M(load_f32_dst) M(store_f32) M(gather_f32) \
M(load_8888) M(load_8888_dst) M(store_8888) M(gather_8888) \
M(load_bgra) M(load_bgra_dst) M(store_bgra) M(gather_bgra) \
M(load_1010102) M(load_1010102_dst) M(store_1010102) M(gather_1010102) \
M(alpha_to_gray) M(alpha_to_gray_dst) M(luminance_to_alpha) \
M(bilerp_clamp_8888) \
Expand Down
50 changes: 11 additions & 39 deletions src/opts/SkRasterPipeline_opts.h
Expand Up @@ -1268,11 +1268,17 @@ STAGE(unbounded_set_rgb, const float* rgb) {
g = rgb[1];
b = rgb[2];
}

STAGE(swap_rb, Ctx::None) {
auto tmp = r;
r = b;
b = tmp;
}
STAGE(swap_rb_dst, Ctx::None) {
auto tmp = dr;
dr = db;
db = tmp;
}

STAGE(move_src_dst, Ctx::None) {
dr = r;
Expand Down Expand Up @@ -1607,29 +1613,6 @@ STAGE(store_8888, const SkJumper_MemoryCtx* ctx) {
store(ptr, px, tail);
}

STAGE(load_bgra, const SkJumper_MemoryCtx* ctx) {
auto ptr = ptr_at_xy<const uint32_t>(ctx, dx,dy);
from_8888(load<U32>(ptr, tail), &b,&g,&r,&a);
}
STAGE(load_bgra_dst, const SkJumper_MemoryCtx* ctx) {
auto ptr = ptr_at_xy<const uint32_t>(ctx, dx,dy);
from_8888(load<U32>(ptr, tail), &db,&dg,&dr,&da);
}
STAGE(gather_bgra, const SkJumper_GatherCtx* ctx) {
const uint32_t* ptr;
U32 ix = ix_and_ptr(&ptr, ctx, r,g);
from_8888(gather(ptr, ix), &b,&g,&r,&a);
}
STAGE(store_bgra, const SkJumper_MemoryCtx* ctx) {
auto ptr = ptr_at_xy<uint32_t>(ctx, dx,dy);

U32 px = to_unorm(b, 255)
| to_unorm(g, 255) << 8
| to_unorm(r, 255) << 16
| to_unorm(a, 255) << 24;
store(ptr, px, tail);
}

STAGE(load_1010102, const SkJumper_MemoryCtx* ctx) {
auto ptr = ptr_at_xy<const uint32_t>(ctx, dx,dy);
from_1010102(load<U32>(ptr, tail), &r,&g,&b,&a);
Expand Down Expand Up @@ -2573,6 +2556,11 @@ STAGE_PP(swap_rb, Ctx::None) {
r = b;
b = tmp;
}
STAGE_PP(swap_rb_dst, Ctx::None) {
auto tmp = dr;
dr = db;
db = tmp;
}

STAGE_PP(move_src_dst, Ctx::None) {
dr = r;
Expand Down Expand Up @@ -2828,27 +2816,11 @@ STAGE_PP(load_8888_dst, const SkJumper_MemoryCtx* ctx) {
STAGE_PP(store_8888, const SkJumper_MemoryCtx* ctx) {
store_8888_(ptr_at_xy<uint32_t>(ctx, dx,dy), tail, r,g,b,a);
}

STAGE_PP(load_bgra, const SkJumper_MemoryCtx* ctx) {
load_8888_(ptr_at_xy<const uint32_t>(ctx, dx,dy), tail, &b,&g,&r,&a);
}
STAGE_PP(load_bgra_dst, const SkJumper_MemoryCtx* ctx) {
load_8888_(ptr_at_xy<const uint32_t>(ctx, dx,dy), tail, &db,&dg,&dr,&da);
}
STAGE_PP(store_bgra, const SkJumper_MemoryCtx* ctx) {
store_8888_(ptr_at_xy<uint32_t>(ctx, dx,dy), tail, b,g,r,a);
}

STAGE_GP(gather_8888, const SkJumper_GatherCtx* ctx) {
const uint32_t* ptr;
U32 ix = ix_and_ptr(&ptr, ctx, x,y);
from_8888(gather<U32>(ptr, ix), &r, &g, &b, &a);
}
STAGE_GP(gather_bgra, const SkJumper_GatherCtx* ctx) {
const uint32_t* ptr;
U32 ix = ix_and_ptr(&ptr, ctx, x,y);
from_8888(gather<U32>(ptr, ix), &b, &g, &r, &a);
}

// ~~~~~~ 16-bit memory loads and stores ~~~~~~ //

Expand Down
6 changes: 5 additions & 1 deletion src/shaders/SkImageShader.cpp
Expand Up @@ -336,19 +336,23 @@ bool SkImageShader::onAppendStages(const StageRec& rec) const {
case kAlpha_8_SkColorType: p->append(SkRasterPipeline::gather_a8, ctx); break;
case kRGB_565_SkColorType: p->append(SkRasterPipeline::gather_565, ctx); break;
case kARGB_4444_SkColorType: p->append(SkRasterPipeline::gather_4444, ctx); break;
case kBGRA_8888_SkColorType: p->append(SkRasterPipeline::gather_bgra, ctx); break;
case kRGBA_8888_SkColorType: p->append(SkRasterPipeline::gather_8888, ctx); break;
case kRGBA_1010102_SkColorType: p->append(SkRasterPipeline::gather_1010102, ctx); break;
case kRGBA_F16_SkColorType: p->append(SkRasterPipeline::gather_f16, ctx); break;
case kRGBA_F32_SkColorType: p->append(SkRasterPipeline::gather_f32, ctx); break;

case kGray_8_SkColorType: p->append(SkRasterPipeline::gather_a8, ctx);
p->append(SkRasterPipeline::alpha_to_gray ); break;

case kRGB_888x_SkColorType: p->append(SkRasterPipeline::gather_8888, ctx);
p->append(SkRasterPipeline::force_opaque ); break;

case kRGB_101010x_SkColorType: p->append(SkRasterPipeline::gather_1010102, ctx);
p->append(SkRasterPipeline::force_opaque ); break;

case kBGRA_8888_SkColorType: p->append(SkRasterPipeline::gather_8888, ctx);
p->append(SkRasterPipeline::swap_rb ); break;

default: SkASSERT(false);
}
if (decal_ctx) {
Expand Down

0 comments on commit 1a3eb52

Please sign in to comment.