skvm support for 888x, 1010102, 101010x

Pretty straightforward, but needs the relaxed
asserts CL on the relation chain to draw all
GMs without asserting.

Change-Id: Ibe45922f9f5bc796117059b2bc73e83a90dc06a6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/270402
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/src/core/SkVM.cpp b/src/core/SkVM.cpp
index 2528726..6ce2199 100644
--- a/src/core/SkVM.cpp
+++ b/src/core/SkVM.cpp
@@ -851,6 +851,14 @@
         return round(mul(x, splat(limit)));
     }
 
+    Color Builder::unpack_1010102(I32 rgba) {
+        return {
+            from_unorm(10, extract(rgba,  0, splat(0x3ff))),
+            from_unorm(10, extract(rgba, 10, splat(0x3ff))),
+            from_unorm(10, extract(rgba, 20, splat(0x3ff))),
+            from_unorm( 2, extract(rgba, 30, splat(0x3  ))),
+        };
+    }
     Color Builder::unpack_8888(I32 rgba) {
         return {
             from_unorm(8, extract(rgba,  0, splat(0xff))),
diff --git a/src/core/SkVM.h b/src/core/SkVM.h
index 5d870f3..39aaeb0 100644
--- a/src/core/SkVM.h
+++ b/src/core/SkVM.h
@@ -542,8 +542,9 @@
         F32 from_unorm(int bits, I32);   // E.g. from_unorm(8, x) -> x * (1/255.0f)
         I32   to_unorm(int bits, F32);   // E.g.   to_unorm(8, x) -> round(x * 255)
 
-        Color unpack_8888(I32 rgba);
-        Color unpack_565 (I32 bgr );  // bottom 16 bits
+        Color unpack_1010102(I32 rgba);
+        Color unpack_8888   (I32 rgba);
+        Color unpack_565    (I32 bgr );  // bottom 16 bits
 
         void   premul(F32* r, F32* g, F32* b, F32 a);
         void unpremul(F32* r, F32* g, F32* b, F32 a);
diff --git a/src/core/SkVMBlitter.cpp b/src/core/SkVMBlitter.cpp
index 8e77ba4..21bf4c2 100644
--- a/src/core/SkVMBlitter.cpp
+++ b/src/core/SkVMBlitter.cpp
@@ -144,10 +144,17 @@
             }
 
             switch (params.colorType) {
-                default: *ok = false;        break;
-                case kRGB_565_SkColorType:   break;
-                case kRGBA_8888_SkColorType: break;
-                case kBGRA_8888_SkColorType: break;
+                default: *ok = false;
+                         break;
+
+                case kRGB_565_SkColorType:
+                case kRGB_888x_SkColorType:
+                case kRGBA_8888_SkColorType:
+                case kBGRA_8888_SkColorType:
+                case kRGBA_1010102_SkColorType:
+                case kBGRA_1010102_SkColorType:
+                case kRGB_101010x_SkColorType:
+                case kBGR_101010x_SkColorType:  break;
             }
 
             if (!skvm::BlendModeSupported(params.blendMode)) {
@@ -269,11 +276,25 @@
             SkDEBUGCODE(dst_loaded = true;)
             switch (params.colorType) {
                 default: SkUNREACHABLE;
-                case kRGB_565_SkColorType:   dst = unpack_565 (load16(dst_ptr)); break;
-                case kRGBA_8888_SkColorType: dst = unpack_8888(load32(dst_ptr)); break;
+                case kRGB_565_SkColorType: dst = unpack_565(load16(dst_ptr));
+                                           break;
+
+                case  kRGB_888x_SkColorType: [[fallthrough]];
+                case kRGBA_8888_SkColorType: dst = unpack_8888(load32(dst_ptr));
+                                             break;
+
                 case kBGRA_8888_SkColorType: dst = unpack_8888(load32(dst_ptr));
                                              std::swap(dst.r, dst.b);
                                              break;
+
+                case  kRGB_101010x_SkColorType: [[fallthrough]];
+                case kRGBA_1010102_SkColorType: dst = unpack_1010102(load32(dst_ptr));
+                                                break;
+
+                case  kBGR_101010x_SkColorType: [[fallthrough]];
+                case kBGRA_1010102_SkColorType: dst = unpack_1010102(load32(dst_ptr));
+                                                std::swap(dst.r, dst.b);
+                                                break;
             }
 
             // When a destination is known opaque, we may assume it both starts and stays fully
@@ -385,13 +406,24 @@
                                                to_unorm(5,src.r),11));
                     break;
 
-                case kBGRA_8888_SkColorType: std::swap(src.r, src.b);  // fallthrough
+                case kBGRA_8888_SkColorType: std::swap(src.r, src.b);  [[fallthrough]];
+                case  kRGB_888x_SkColorType:                           [[fallthrough]];
                 case kRGBA_8888_SkColorType:
                      store32(dst_ptr, pack(pack(to_unorm(8, src.r),
                                                 to_unorm(8, src.g), 8),
                                            pack(to_unorm(8, src.b),
                                                 to_unorm(8, src.a), 8), 16));
                      break;
+
+                case  kBGR_101010x_SkColorType:                          [[fallthrough]];
+                case kBGRA_1010102_SkColorType: std::swap(src.r, src.b); [[fallthrough]];
+                case  kRGB_101010x_SkColorType:                          [[fallthrough]];
+                case kRGBA_1010102_SkColorType:
+                     store32(dst_ptr, pack(pack(to_unorm(10, src.r),
+                                                to_unorm(10, src.g), 10),
+                                           pack(to_unorm(10, src.b),
+                                                to_unorm( 2, src.a), 10), 20));
+                     break;
             }
         }
     };
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 8fec905..4603aab 100755
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -671,8 +671,13 @@
     switch (pm.colorType()) {
         default: return false;
         case   kRGB_565_SkColorType:
+        case  kRGB_888x_SkColorType:
         case kRGBA_8888_SkColorType:
-        case kBGRA_8888_SkColorType: break;
+        case kBGRA_8888_SkColorType:
+        case kRGBA_1010102_SkColorType:
+        case kBGRA_1010102_SkColorType:
+        case  kRGB_101010x_SkColorType:
+        case  kBGR_101010x_SkColorType: break;
     }
 
     // We can exploit image opacity to skip work unpacking alpha channels.
@@ -736,10 +741,22 @@
         switch (pm.colorType()) {
             default: SkUNREACHABLE;
             case   kRGB_565_SkColorType: c = p->unpack_565 (p->gather16(img, index)); break;
-            case kRGBA_8888_SkColorType: c = p->unpack_8888(p->gather32(img, index)); break;
+
+            case  kRGB_888x_SkColorType: [[fallthrough]];
+            case kRGBA_8888_SkColorType: c = p->unpack_8888(p->gather32(img, index));
+                                         break;
             case kBGRA_8888_SkColorType: c = p->unpack_8888(p->gather32(img, index));
                                          std::swap(c.r, c.b);
                                          break;
+
+            case  kRGB_101010x_SkColorType: [[fallthrough]];
+            case kRGBA_1010102_SkColorType: c = p->unpack_1010102(p->gather32(img, index));
+                                            break;
+
+            case  kBGR_101010x_SkColorType: [[fallthrough]];
+            case kBGRA_1010102_SkColorType: c = p->unpack_1010102(p->gather32(img, index));
+                                            std::swap(c.r, c.b);
+                                            break;
         }
         // If we know the image is opaque, jump right to alpha = 1.0f, skipping work to unpack it.
         if (input_is_opaque) {