Switch to a more complete method of filtering hoisted layers
authorrobertphillips <robertphillips@google.com>
Tue, 13 Jan 2015 18:37:55 +0000 (10:37 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 13 Jan 2015 18:37:55 +0000 (10:37 -0800)
Review URL: https://codereview.chromium.org/842323003

src/gpu/GrLayerCache.h
src/gpu/GrLayerHoister.cpp

index cdbd080..11c8f07 100644 (file)
@@ -164,7 +164,7 @@ public:
         SkASSERT(SK_InvalidGenID != pictureID);
 
         if (fPaint) {
-            if (fPaint->getImageFilter() && fPaint->getImageFilter()->canFilterImageGPU()) {
+            if (fPaint->getImageFilter()) {
                 fFilter = SkSafeRef(fPaint->getImageFilter());
                 fPaint->setImageFilter(NULL);
             }
index 7d6f5ab..3bb7b2e 100644 (file)
@@ -10,6 +10,8 @@
 #include "GrRecordReplaceDraw.h"
 
 #include "SkCanvas.h"
+#include "SkDeviceImageFilterProxy.h"
+#include "SkDeviceProperties.h"
 #include "SkGpuDevice.h"
 #include "SkGrPixelRef.h"
 #include "SkLayerInfo.h"
@@ -274,13 +276,19 @@ void GrLayerHoister::DrawLayersToAtlas(GrContext* context,
     }
 }
 
+SkBitmap wrap_texture(GrTexture* texture) {
+    SkBitmap result;
+    result.setInfo(texture->surfacePriv().info());
+    result.setPixelRef(SkNEW_ARGS(SkGrPixelRef, (result.info(), texture)))->unref();
+    return result;
+}
+
 void GrLayerHoister::FilterLayer(GrContext* context,
                                  SkGpuDevice* device,
                                  const GrHoistedLayer& info) {
     GrCachedLayer* layer = info.fLayer;
 
     SkASSERT(layer->filter());
-    SkASSERT(layer->filter()->canFilterImageGPU());
 
     static const int kDefaultCacheSize = 32 * 1024 * 1024;
 
@@ -294,7 +302,6 @@ void GrLayerHoister::FilterLayer(GrContext* context,
     totMat.preConcat(info.fLocalMat);
     totMat.postTranslate(-SkIntToScalar(filterOffset.fX), -SkIntToScalar(filterOffset.fY));
 
-
     SkASSERT(0 == layer->rect().fLeft && 0 == layer->rect().fTop);
     SkIRect clipBounds = layer->rect();
 
@@ -303,9 +310,11 @@ void GrLayerHoister::FilterLayer(GrContext* context,
     SkAutoTUnref<SkImageFilter::Cache> cache(SkImageFilter::Cache::Create(kDefaultCacheSize));
     SkImageFilter::Context filterContext(totMat, clipBounds, cache);
 
-    if (!device->filterTexture(context, layer->texture(), layer->filter(),
-                               filterContext, &filteredBitmap, &offset)) {
-        // Filtering failed. Press on with the unfiltered version
+    SkDeviceImageFilterProxy proxy(device, SkSurfaceProps(0, kUnknown_SkPixelGeometry));
+    const SkBitmap src = wrap_texture(layer->texture());
+
+    if (!layer->filter()->filterImage(&proxy, src, filterContext, &filteredBitmap, &offset)) {
+        // Filtering failed. Press on with the unfiltered version.
         return;
     }