[graphite] Track aggregate protected status on YUVA images

Change-Id: Ie10ccc2b5d7004d57e67199eeb31ccc4b8792521
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/836916
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Jim Van Verth <jvanverth@google.com>
diff --git a/src/gpu/graphite/Image_YUVA_Graphite.h b/src/gpu/graphite/Image_YUVA_Graphite.h
index 4d78734..46ad173 100644
--- a/src/gpu/graphite/Image_YUVA_Graphite.h
+++ b/src/gpu/graphite/Image_YUVA_Graphite.h
@@ -42,10 +42,7 @@
 
     bool onHasMipmaps() const override { return fYUVAProxies.mipmapped() == Mipmapped::kYes; }
 
-    bool onIsProtected() const override {
-        // TODO: add protected content support
-        return false;
-    }
+    bool onIsProtected() const override { return fYUVAProxies.isProtected() == Protected::kYes; }
 
     sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const override;
 
diff --git a/src/gpu/graphite/YUVATextureProxies.cpp b/src/gpu/graphite/YUVATextureProxies.cpp
index e960eb7..2a83369 100644
--- a/src/gpu/graphite/YUVATextureProxies.cpp
+++ b/src/gpu/graphite/YUVATextureProxies.cpp
@@ -41,10 +41,14 @@
         return;
     }
     fMipmapped = Mipmapped::kYes;
+    fProtected = Protected::kNo;
     for (int i = 0; i < n; ++i) {
         if (proxies[i]->mipmapped() == Mipmapped::kNo) {
             fMipmapped = Mipmapped::kNo;
         }
+        if (proxies[i]->isProtected()) {
+            fProtected = Protected::kYes;
+        }
         fProxies[i] = std::move(proxies[i]);
     }
     SkASSERT(this->isValid());
@@ -62,6 +66,7 @@
         return;
     }
     fMipmapped = Mipmapped::kYes;
+    fProtected = Protected::kNo;
     for (int i = 0; i < n; ++i) {
         if (!views[i]) {
             *this = {};
@@ -72,6 +77,9 @@
         if (views[i].proxy()->mipmapped() == Mipmapped::kNo) {
             fMipmapped = Mipmapped::kNo;
         }
+        if (views[i].proxy()->isProtected()) {
+            fProtected = Protected::kYes;
+        }
     }
     // Initial locations refer to the CPU pixmap channels.
     fYUVALocations = yuvaInfo.toYUVALocations(pixmapChannelMasks);
diff --git a/src/gpu/graphite/YUVATextureProxies.h b/src/gpu/graphite/YUVATextureProxies.h
index 4ae3b7d..a6ef2b6 100644
--- a/src/gpu/graphite/YUVATextureProxies.h
+++ b/src/gpu/graphite/YUVATextureProxies.h
@@ -45,6 +45,9 @@
     // Overall set of YUVA proxies is mip mapped if each plane is mip mapped.
     Mipmapped mipmapped() const { return fMipmapped; }
 
+    // Overall set of YUVA proxies is protected if *any* plane is protected.
+    Protected isProtected() const { return fProtected; }
+
     TextureProxy* proxy(int i) const { return fProxies[i].get(); }
 
     SkSpan<const sk_sp<TextureProxy>> proxies() const {
@@ -65,6 +68,7 @@
     std::array<sk_sp<TextureProxy>, SkYUVAInfo::kMaxPlanes> fProxies;
     SkYUVAInfo fYUVAInfo;
     Mipmapped fMipmapped = Mipmapped::kNo;
+    Protected fProtected = Protected::kNo;
     SkYUVAInfo::YUVALocations fYUVALocations = {};
 };