trim off more bgra stages

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>
diff --git a/bench/ColorSpaceXformBench.cpp b/bench/ColorSpaceXformBench.cpp
index c877ff9..6c8de54 100644
--- a/bench/ColorSpaceXformBench.cpp
+++ b/bench/ColorSpaceXformBench.cpp
@@ -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 "";
@@ -50,14 +41,6 @@
 
         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
     }
 
@@ -68,9 +51,6 @@
         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];
@@ -79,19 +59,6 @@
                     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;
@@ -107,6 +74,4 @@
 };
 
 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};)
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp
index d637b19..8ebbf43 100644
--- a/src/codec/SkWebpCodec.cpp
+++ b/src/codec/SkWebpCodec.cpp
@@ -333,44 +333,6 @@
     }
 }
 
-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,
@@ -381,31 +343,23 @@
                        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);
 }
diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp
index 65feaec..63d9e51 100644
--- a/src/core/SkColorSpaceXformer.cpp
+++ b/src/core/SkColorSpaceXformer.cpp
@@ -23,9 +23,11 @@
     , 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();
 }
 
diff --git a/src/core/SkRasterPipeline.cpp b/src/core/SkRasterPipeline.cpp
index f9bdaa5..d65f7cd 100644
--- a/src/core/SkRasterPipeline.cpp
+++ b/src/core/SkRasterPipeline.cpp
@@ -200,7 +200,6 @@
         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;
@@ -210,13 +209,17 @@
                                         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;
     }
 }
 
@@ -227,7 +230,6 @@
         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;
@@ -244,6 +246,10 @@
         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;
     }
 }
 
@@ -254,23 +260,26 @@
         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;
     }
 }
 
diff --git a/src/core/SkRasterPipeline.h b/src/core/SkRasterPipeline.h
index de9da46..809f404 100644
--- a/src/core/SkRasterPipeline.h
+++ b/src/core/SkRasterPipeline.h
@@ -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)                                       \
@@ -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)                                           \
diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h
index 490b88c..1df0ebe 100644
--- a/src/opts/SkRasterPipeline_opts.h
+++ b/src/opts/SkRasterPipeline_opts.h
@@ -1268,11 +1268,17 @@
     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;
@@ -1607,29 +1613,6 @@
     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);
@@ -2573,6 +2556,11 @@
     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;
@@ -2828,27 +2816,11 @@
 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 ~~~~~~ //
 
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 02939bb..adefd63 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -336,7 +336,6 @@
             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;
@@ -344,11 +343,16 @@
 
             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) {
diff --git a/tests/SkRasterPipelineTest.cpp b/tests/SkRasterPipelineTest.cpp
index ee7816b..59f1910 100644
--- a/tests/SkRasterPipelineTest.cpp
+++ b/tests/SkRasterPipelineTest.cpp
@@ -171,7 +171,8 @@
     SkJumper_MemoryCtx ptr = { rgba, 0 };
 
     SkRasterPipeline_<256> p;
-    p.append(SkRasterPipeline::load_bgra,  &ptr);
+    p.append(SkRasterPipeline::load_8888,  &ptr);
+    p.append(SkRasterPipeline::swap_rb);
     p.append(SkRasterPipeline::store_8888, &ptr);
     p.run(0,0,64,1);
 
@@ -195,7 +196,8 @@
     SkJumper_MemoryCtx ptr = { &rgba, 0 };
 
     SkRasterPipeline_<256> p;
-    p.append(SkRasterPipeline::load_bgra,  &ptr);
+    p.append(SkRasterPipeline::load_8888,  &ptr);
+    p.append(SkRasterPipeline::swap_rb);
     p.append(SkRasterPipeline::clamp_0);
     p.append(SkRasterPipeline::clamp_1);
     p.append(SkRasterPipeline::store_8888, &ptr);