Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(669)

Side by Side Diff: src/gpu/GrBlurUtils.cpp

Issue 2514543002: Defer more renderTargetContexts in the GPU image filter paths - take 2 (Closed)
Patch Set: Add more bullet proofing Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/effects/SkBlurMaskFilter.cpp ('k') | src/gpu/GrContext.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrBlurUtils.h" 8 #include "GrBlurUtils.h"
9 #include "GrRenderTargetContext.h" 9 #include "GrRenderTargetContext.h"
10 #include "GrCaps.h" 10 #include "GrCaps.h"
11 #include "GrContext.h" 11 #include "GrContext.h"
12 #include "GrFixedClip.h" 12 #include "GrFixedClip.h"
13 #include "effects/GrSimpleTextureEffect.h" 13 #include "effects/GrSimpleTextureEffect.h"
14 #include "GrStyle.h" 14 #include "GrStyle.h"
15 #include "GrTexture.h" 15 #include "GrTexture.h"
16 #include "GrTextureProxy.h"
16 #include "GrTextureProvider.h" 17 #include "GrTextureProvider.h"
17 #include "SkDraw.h" 18 #include "SkDraw.h"
18 #include "SkGrPriv.h" 19 #include "SkGrPriv.h"
19 #include "SkMaskFilter.h" 20 #include "SkMaskFilter.h"
20 #include "SkPaint.h" 21 #include "SkPaint.h"
21 #include "SkTLazy.h" 22 #include "SkTLazy.h"
22 23
23 static bool clip_bounds_quick_reject(const SkIRect& clipBounds, const SkIRect& r ect) { 24 static bool clip_bounds_quick_reject(const SkIRect& clipBounds, const SkIRect& r ect) {
24 return clipBounds.isEmpty() || rect.isEmpty() || !SkIRect::Intersects(clipBo unds, rect); 25 return clipBounds.isEmpty() || rect.isEmpty() || !SkIRect::Intersects(clipBo unds, rect);
25 } 26 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 if (!texture) { 86 if (!texture) {
86 return false; 87 return false;
87 } 88 }
88 texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, 89 texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig,
89 dstM.fImage, dstM.fRowBytes); 90 dstM.fImage, dstM.fRowBytes);
90 91
91 return draw_mask(renderTargetContext, clipData, viewMatrix, dstM.fBounds, gr p, texture.get()); 92 return draw_mask(renderTargetContext, clipData, viewMatrix, dstM.fBounds, gr p, texture.get());
92 } 93 }
93 94
94 // Create a mask of 'devPath' and place the result in 'mask'. 95 // Create a mask of 'devPath' and place the result in 'mask'.
95 static sk_sp<GrTexture> create_mask_GPU(GrContext* context, 96 static sk_sp<GrTextureProxy> create_mask_GPU(GrContext* context,
96 const SkIRect& maskRect, 97 const SkIRect& maskRect,
97 const SkPath& devPath, 98 const SkPath& devPath,
98 SkStrokeRec::InitStyle fillOrHairline, 99 SkStrokeRec::InitStyle fillOrHairli ne,
99 bool doAA, 100 bool doAA,
100 int sampleCnt) { 101 int sampleCnt) {
101 if (!doAA) { 102 if (!doAA) {
102 // Don't need MSAA if mask isn't AA 103 // Don't need MSAA if mask isn't AA
103 sampleCnt = 0; 104 sampleCnt = 0;
104 } 105 }
105 106
106 sk_sp<GrRenderTargetContext> renderTargetContext(context->makeRenderTargetCo ntextWithFallback( 107 sk_sp<GrRenderTargetContext> rtContext(context->makeDeferredRenderTargetCont extWithFallback(
107 SkBackingFit::kApprox, maskRect.width(), maskRect.height(), kAlpha_8_GrP ixelConfig, nullptr, 108 SkBackingFit::kApprox, maskRect.width(), maskRect.height(), kAlpha_8_GrP ixelConfig, nullptr,
108 sampleCnt)); 109 sampleCnt));
109 if (!renderTargetContext) { 110 if (!rtContext) {
110 return nullptr; 111 return nullptr;
111 } 112 }
112 113
113 renderTargetContext->clear(nullptr, 0x0, true); 114 rtContext->clear(nullptr, 0x0, true);
114 115
115 GrPaint tempPaint; 116 GrPaint tempPaint;
116 tempPaint.setAntiAlias(doAA); 117 tempPaint.setAntiAlias(doAA);
117 tempPaint.setCoverageSetOpXPFactory(SkRegion::kReplace_Op); 118 tempPaint.setCoverageSetOpXPFactory(SkRegion::kReplace_Op);
118 119
119 // setup new clip 120 // setup new clip
120 const SkIRect clipRect = SkIRect::MakeWH(maskRect.width(), maskRect.height() ); 121 const SkIRect clipRect = SkIRect::MakeWH(maskRect.width(), maskRect.height() );
121 GrFixedClip clip(clipRect); 122 GrFixedClip clip(clipRect);
122 123
123 // Draw the mask into maskTexture with the path's integerized top-left at 124 // Draw the mask into maskTexture with the path's integerized top-left at
124 // the origin using tempPaint. 125 // the origin using tempPaint.
125 SkMatrix translate; 126 SkMatrix translate;
126 translate.setTranslate(-SkIntToScalar(maskRect.fLeft), -SkIntToScalar(maskRe ct.fTop)); 127 translate.setTranslate(-SkIntToScalar(maskRect.fLeft), -SkIntToScalar(maskRe ct.fTop));
127 renderTargetContext->drawPath(clip, tempPaint, translate, devPath, GrStyle(f illOrHairline)); 128 rtContext->drawPath(clip, tempPaint, translate, devPath, GrStyle(fillOrHairl ine));
128 return renderTargetContext->asTexture();; 129 return sk_ref_sp(rtContext->asDeferredTexture());
129 } 130 }
130 131
131 static void draw_path_with_mask_filter(GrContext* context, 132 static void draw_path_with_mask_filter(GrContext* context,
132 GrRenderTargetContext* renderTargetContex t, 133 GrRenderTargetContext* renderTargetContex t,
133 const GrClip& clip, 134 const GrClip& clip,
134 GrPaint* paint, 135 GrPaint* paint,
135 const SkMatrix& viewMatrix, 136 const SkMatrix& viewMatrix,
136 const SkMaskFilter* maskFilter, 137 const SkMaskFilter* maskFilter,
137 const GrStyle& style, 138 const GrStyle& style,
138 const SkPath* path, 139 const SkPath* path,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 paint, 198 paint,
198 clip, 199 clip,
199 viewMatrix, 200 viewMatrix,
200 SkStrokeRec(fillOrHairline), 201 SkStrokeRec(fillOrHairline),
201 *path)) { 202 *path)) {
202 // the mask filter was able to draw itself directly, so there's noth ing 203 // the mask filter was able to draw itself directly, so there's noth ing
203 // left to do. 204 // left to do.
204 return; 205 return;
205 } 206 }
206 207
207 sk_sp<GrTexture> mask(create_mask_GPU(context, 208 sk_sp<GrTextureProxy> maskProxy(create_mask_GPU(context,
208 finalIRect, 209 finalIRect,
209 *path, 210 *path,
210 fillOrHairline, 211 fillOrHairline,
211 paint->isAntiAlias(), 212 paint->isAntiAlias(),
212 renderTargetContext->numColorSampl es())); 213 renderTargetContext->num ColorSamples()));
213 if (mask) { 214 if (maskProxy) {
214 GrTexture* filtered; 215 GrTexture* filtered;
215 216
216 if (maskFilter->filterMaskGPU(mask.get(), viewMatrix, finalIRect, &f iltered)) { 217 GrTexture* mask = maskProxy->instantiate(context->textureProvider()) ;
218 if (!mask) {
219 return;
220 }
221
222 if (maskFilter->filterMaskGPU(mask, viewMatrix, finalIRect, &filtere d)) {
217 // filterMaskGPU gives us ownership of a ref to the result 223 // filterMaskGPU gives us ownership of a ref to the result
218 sk_sp<GrTexture> atu(filtered); 224 sk_sp<GrTexture> atu(filtered);
219 if (draw_mask(renderTargetContext, clip, viewMatrix, finalIRect, paint, filtered)) { 225 if (draw_mask(renderTargetContext, clip, viewMatrix, finalIRect, paint, filtered)) {
220 // This path is completely drawn 226 // This path is completely drawn
221 return; 227 return;
222 } 228 }
223 } 229 }
224 } 230 }
225 } 231 }
226 232
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 SkMaskFilter* mf = paint.getMaskFilter(); 292 SkMaskFilter* mf = paint.getMaskFilter();
287 if (mf && !mf->asFragmentProcessor(nullptr, nullptr, viewMatrix)) { 293 if (mf && !mf->asFragmentProcessor(nullptr, nullptr, viewMatrix)) {
288 // The MaskFilter wasn't already handled in SkPaintToGrPaint 294 // The MaskFilter wasn't already handled in SkPaintToGrPaint
289 draw_path_with_mask_filter(context, renderTargetContext, clip, &grPaint, viewMatrix, 295 draw_path_with_mask_filter(context, renderTargetContext, clip, &grPaint, viewMatrix,
290 mf, style, 296 mf, style,
291 path, pathIsMutable); 297 path, pathIsMutable);
292 } else { 298 } else {
293 renderTargetContext->drawPath(clip, grPaint, viewMatrix, *path, style); 299 renderTargetContext->drawPath(clip, grPaint, viewMatrix, *path, style);
294 } 300 }
295 } 301 }
OLDNEW
« no previous file with comments | « src/effects/SkBlurMaskFilter.cpp ('k') | src/gpu/GrContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698