diff --git a/src/gpu/GrCaps.h b/src/gpu/GrCaps.h
index cdc8ca7..53bae23 100644
--- a/src/gpu/GrCaps.h
+++ b/src/gpu/GrCaps.h
@@ -156,6 +156,7 @@
     }
 
     virtual bool isFormatSRGB(const GrBackendFormat&) const = 0;
+    virtual bool isFormatCompressed(const GrBackendFormat&) const = 0;
 
     virtual bool isFormatTexturable(GrColorType, const GrBackendFormat&) const = 0;
     virtual bool isConfigTexturable(GrPixelConfig) const = 0;
diff --git a/src/gpu/GrProxyProvider.cpp b/src/gpu/GrProxyProvider.cpp
index 6051cc1..48a24fe 100644
--- a/src/gpu/GrProxyProvider.cpp
+++ b/src/gpu/GrProxyProvider.cpp
@@ -440,12 +440,13 @@
                                                    SkBudgeted budgeted,
                                                    GrProtected isProtected,
                                                    GrInternalSurfaceFlags surfaceFlags) {
-    if (GrPixelConfigIsCompressed(desc.fConfig)) {
+    const GrCaps* caps = this->caps();
+
+    if (caps->isFormatCompressed(format)) {
         // Deferred proxies for compressed textures are not supported.
         return nullptr;
     }
 
-    const GrCaps* caps = this->caps();
     GrColorType colorType = GrPixelConfigToColorType(desc.fConfig);
 
     SkASSERT(GrCaps::AreConfigsCompatible(desc.fConfig,
@@ -483,14 +484,16 @@
 sk_sp<GrTextureProxy> GrProxyProvider::createCompressedTextureProxy(
         int width, int height, SkBudgeted budgeted, SkImage::CompressionType compressionType,
         sk_sp<SkData> data) {
-    GrBackendFormat format = this->caps()->getBackendFormatFromCompressionType(compressionType);
 
     GrSurfaceDesc desc;
     desc.fConfig = GrCompressionTypePixelConfig(compressionType);
     desc.fWidth = width;
     desc.fHeight = height;
 
-    if (!this->caps()->isConfigTexturable(desc.fConfig)) {
+    GrColorType grColorType = GrCompressionTypeClosestColorType(compressionType);
+    GrBackendFormat format = this->caps()->getBackendFormatFromCompressionType(compressionType);
+
+    if (!this->caps()->isFormatTexturable(grColorType, format)) {
         return nullptr;
     }
 
diff --git a/src/gpu/dawn/GrDawnCaps.cpp b/src/gpu/dawn/GrDawnCaps.cpp
index 9e8954b..c9381bc 100644
--- a/src/gpu/dawn/GrDawnCaps.cpp
+++ b/src/gpu/dawn/GrDawnCaps.cpp
@@ -18,6 +18,10 @@
     return false;
 }
 
+bool GrDawnCaps::isFormatCompressed(const GrBackendFormat& format) const {
+    return false;
+}
+
 bool GrDawnCaps::isConfigTexturable(GrPixelConfig config) const {
     switch (config) {
         case kRGBA_8888_GrPixelConfig:
diff --git a/src/gpu/dawn/GrDawnCaps.h b/src/gpu/dawn/GrDawnCaps.h
index 734422a..f975990 100644
--- a/src/gpu/dawn/GrDawnCaps.h
+++ b/src/gpu/dawn/GrDawnCaps.h
@@ -17,7 +17,9 @@
 public:
     GrDawnCaps(const GrContextOptions& contextOptions);
 
-    bool isFormatSRGB(const GrBackendFormat& format) const override;
+    bool isFormatSRGB(const GrBackendFormat&) const override;
+    bool isFormatCompressed(const GrBackendFormat&) const override;
+
     bool isFormatTexturable(GrColorType, const GrBackendFormat& format) const override;
     bool isFormatCopyable(GrColorType, const GrBackendFormat& format) const override;
 
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index dba4fe9..d781865 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -3777,6 +3777,13 @@
     return GrGLBackendFormatToGLFormat(format) == GrGLFormat::kSRGB8_ALPHA8;
 }
 
+bool GrGLCaps::isFormatCompressed(const GrBackendFormat& format) const {
+    GrGLFormat grGLFormat = GrGLBackendFormatToGLFormat(format);
+
+    return grGLFormat == GrGLFormat::kCOMPRESSED_RGB8_ETC2 ||
+           grGLFormat == GrGLFormat::kCOMPRESSED_ETC1_RGB8;
+}
+
 bool GrGLCaps::isFormatTexturable(GrColorType ct, GrGLFormat format) const {
     const FormatInfo& info = this->getFormatInfo(format);
     // Currently we conflate texturable to mean the format itself is texturable in a draw and that
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index b8782ac..f4fa5e1 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -108,7 +108,8 @@
     GrGLCaps(const GrContextOptions& contextOptions, const GrGLContextInfo& ctxInfo,
              const GrGLInterface* glInterface);
 
-    bool isFormatSRGB(const GrBackendFormat& format) const override;
+    bool isFormatSRGB(const GrBackendFormat&) const override;
+    bool isFormatCompressed(const GrBackendFormat&) const override;
 
     bool isFormatTexturable(GrColorType, const GrBackendFormat&) const override;
 
diff --git a/src/gpu/mock/GrMockCaps.h b/src/gpu/mock/GrMockCaps.h
index b244c0d..73f3611 100644
--- a/src/gpu/mock/GrMockCaps.h
+++ b/src/gpu/mock/GrMockCaps.h
@@ -46,6 +46,11 @@
         return *format.getMockColorType() == GrColorType::kRGBA_8888_SRGB;
     }
 
+    // Mock caps doesn't support any compressed formats right now
+    bool isFormatCompressed(const GrBackendFormat&) const override {
+        return false;
+    }
+
     bool isFormatTexturable(GrColorType, const GrBackendFormat& format) const override {
         if (!format.getMockColorType()) {
             return false;
diff --git a/src/gpu/mtl/GrMtlCaps.h b/src/gpu/mtl/GrMtlCaps.h
index d3f39e5..f982c02 100644
--- a/src/gpu/mtl/GrMtlCaps.h
+++ b/src/gpu/mtl/GrMtlCaps.h
@@ -26,7 +26,8 @@
     GrMtlCaps(const GrContextOptions& contextOptions, id<MTLDevice> device,
               MTLFeatureSet featureSet);
 
-    bool isFormatSRGB(const GrBackendFormat& format) const override;
+    bool isFormatSRGB(const GrBackendFormat&) const override;
+    bool isFormatCompressed(const GrBackendFormat&) const override;
 
     bool isFormatTexturable(GrColorType, const GrBackendFormat&) const override;
     bool isConfigTexturable(GrPixelConfig config) const override;
diff --git a/src/gpu/mtl/GrMtlCaps.mm b/src/gpu/mtl/GrMtlCaps.mm
index 558fc3f..af94b4d 100644
--- a/src/gpu/mtl/GrMtlCaps.mm
+++ b/src/gpu/mtl/GrMtlCaps.mm
@@ -274,6 +274,20 @@
     return format_is_srgb(static_cast<MTLPixelFormat>(*format.getMtlFormat()));
 }
 
+bool GrMtlCaps::isFormatCompressed(const GrBackendFormat& format) const {
+#ifdef SK_BUILD_FOR_MAC
+    return false;
+#else
+    if (!format.getMtlFormat()) {
+        return false;
+    }
+
+    MTLPixelFormat mtlFormat = static_cast<MTLPixelFormat>(*format.getMtlFormat());
+
+    return mtlFormat == MTLPixelFormatETC2_RGB8;
+#endif
+}
+
 bool GrMtlCaps::isFormatTexturable(GrColorType, const GrBackendFormat& format) const {
     if (!format.getMtlFormat()) {
         return false;
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 2f98524..3ee070b 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -778,6 +778,17 @@
     return format_is_srgb(*format.getVkFormat());
 }
 
+bool GrVkCaps::isFormatCompressed(const GrBackendFormat& format) const {
+    if (!format.getVkFormat()) {
+        return false;
+    }
+
+    VkFormat vkFormat = *format.getVkFormat();
+    SkASSERT(GrVkFormatIsSupported(vkFormat));
+
+    return vkFormat == VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
+}
+
 bool GrVkCaps::isFormatTexturable(GrColorType, const GrBackendFormat& format) const {
     if (!format.getVkFormat()) {
         return false;
diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h
index ceadd68..af1bfd3 100644
--- a/src/gpu/vk/GrVkCaps.h
+++ b/src/gpu/vk/GrVkCaps.h
@@ -32,7 +32,9 @@
              uint32_t instanceVersion, uint32_t physicalDeviceVersion,
              const GrVkExtensions& extensions, GrProtected isProtected = GrProtected::kNo);
 
-    bool isFormatSRGB(const GrBackendFormat& format) const override;
+    bool isFormatSRGB(const GrBackendFormat&) const override;
+    bool isFormatCompressed(const GrBackendFormat&) const override;
+
 
     bool isFormatTexturable(GrColorType, const GrBackendFormat&) const override;
     bool isVkFormatTexturable(VkFormat) const;
