OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "GrClipStackClip.h" | 8 #include "GrClipStackClip.h" |
9 | 9 |
10 #include "GrAppliedClip.h" | 10 #include "GrAppliedClip.h" |
11 #include "GrContextPriv.h" | 11 #include "GrContextPriv.h" |
12 #include "GrDrawingManager.h" | 12 #include "GrDrawingManager.h" |
13 #include "GrRenderTargetContextPriv.h" | 13 #include "GrRenderTargetContextPriv.h" |
14 #include "GrFixedClip.h" | 14 #include "GrFixedClip.h" |
15 #include "GrGpuResourcePriv.h" | 15 #include "GrGpuResourcePriv.h" |
16 #include "GrRenderTargetPriv.h" | 16 #include "GrRenderTargetPriv.h" |
17 #include "GrStencilAttachment.h" | 17 #include "GrStencilAttachment.h" |
18 #include "GrSWMaskHelper.h" | 18 #include "GrSWMaskHelper.h" |
| 19 #include "GrTextureProxy.h" |
19 #include "effects/GrConvexPolyEffect.h" | 20 #include "effects/GrConvexPolyEffect.h" |
20 #include "effects/GrRRectEffect.h" | 21 #include "effects/GrRRectEffect.h" |
21 #include "effects/GrTextureDomain.h" | 22 #include "effects/GrTextureDomain.h" |
22 | 23 |
23 typedef SkClipStack::Element Element; | 24 typedef SkClipStack::Element Element; |
24 typedef GrReducedClip::InitialState InitialState; | 25 typedef GrReducedClip::InitialState InitialState; |
25 typedef GrReducedClip::ElementList ElementList; | 26 typedef GrReducedClip::ElementList ElementList; |
26 | 27 |
27 static const int kMaxAnalyticElements = 4; | 28 static const int kMaxAnalyticElements = 4; |
28 | 29 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 return; | 74 return; |
74 } | 75 } |
75 SkRect devBounds; | 76 SkRect devBounds; |
76 fStack->getConservativeBounds(-fOrigin.x(), -fOrigin.y(), width, height, &de
vBounds, | 77 fStack->getConservativeBounds(-fOrigin.x(), -fOrigin.y(), width, height, &de
vBounds, |
77 isIntersectionOfRects); | 78 isIntersectionOfRects); |
78 devBounds.roundOut(devResult); | 79 devBounds.roundOut(devResult); |
79 } | 80 } |
80 | 81 |
81 //////////////////////////////////////////////////////////////////////////////// | 82 //////////////////////////////////////////////////////////////////////////////// |
82 // set up the draw state to enable the aa clipping mask. | 83 // set up the draw state to enable the aa clipping mask. |
83 static sk_sp<GrFragmentProcessor> create_fp_for_mask(GrTexture* result, | 84 static sk_sp<GrFragmentProcessor> create_fp_for_mask(GrTextureProxy* result, |
84 const SkIRect &devBound) { | 85 const SkIRect &devBound) { |
85 SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); | 86 SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height()); |
86 return GrDeviceSpaceTextureDecalFragmentProcessor::Make(result, domainTexels
, | 87 return GrDeviceSpaceTextureDecalFragmentProcessor::Make(result, domainTexels
, |
87 {devBound.fLeft, dev
Bound.fTop}); | 88 {devBound.fLeft, dev
Bound.fTop}); |
88 } | 89 } |
89 | 90 |
90 // Does the path in 'element' require SW rendering? If so, return true (and, | 91 // Does the path in 'element' require SW rendering? If so, return true (and, |
91 // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set | 92 // optionally, set 'prOut' to NULL. If not, return false (and, optionally, set |
92 // 'prOut' to the non-SW path renderer that will do the job). | 93 // 'prOut' to the non-SW path renderer that will do the job). |
93 bool GrClipStackClip::PathNeedsSWRenderer(GrContext* context, | 94 bool GrClipStackClip::PathNeedsSWRenderer(GrContext* context, |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 if (reducedClip.requiresAA() && | 329 if (reducedClip.requiresAA() && |
329 get_analytic_clip_processor(reducedClip.elements(), disallowAnalytic
AA, | 330 get_analytic_clip_processor(reducedClip.elements(), disallowAnalytic
AA, |
330 {-clipX, -clipY}, devBounds, &clipFP)) { | 331 {-clipX, -clipY}, devBounds, &clipFP)) { |
331 out->addCoverageFP(std::move(clipFP)); | 332 out->addCoverageFP(std::move(clipFP)); |
332 return true; | 333 return true; |
333 } | 334 } |
334 } | 335 } |
335 | 336 |
336 // If the stencil buffer is multisampled we can use it to do everything. | 337 // If the stencil buffer is multisampled we can use it to do everything. |
337 if (!renderTargetContext->isStencilBufferMultisampled() && reducedClip.requi
resAA()) { | 338 if (!renderTargetContext->isStencilBufferMultisampled() && reducedClip.requi
resAA()) { |
338 sk_sp<GrTexture> result; | 339 sk_sp<GrTextureProxy> result; |
339 if (UseSWOnlyPath(context, hasUserStencilSettings, renderTargetContext,
reducedClip)) { | 340 if (UseSWOnlyPath(context, hasUserStencilSettings, renderTargetContext,
reducedClip)) { |
340 // The clip geometry is complex enough that it will be more efficien
t to create it | 341 // The clip geometry is complex enough that it will be more efficien
t to create it |
341 // entirely in software | 342 // entirely in software |
342 result = CreateSoftwareClipMask(context->textureProvider(), reducedC
lip); | 343 result = CreateSoftwareClipMask(context->textureProvider(), reducedC
lip); |
343 } else { | 344 } else { |
344 result = CreateAlphaClipMask(context, reducedClip); | 345 result = CreateAlphaClipMask(context, reducedClip); |
345 // If createAlphaClipMask fails it means UseSWOnlyPath has a bug | 346 // If createAlphaClipMask fails it means UseSWOnlyPath has a bug |
346 SkASSERT(result); | 347 SkASSERT(result); |
347 } | 348 } |
348 | 349 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 static void GetClipMaskKey(int32_t clipGenID, const SkIRect& bounds, GrUniqueKey
* key) { | 383 static void GetClipMaskKey(int32_t clipGenID, const SkIRect& bounds, GrUniqueKey
* key) { |
383 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); | 384 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); |
384 GrUniqueKey::Builder builder(key, kDomain, 3); | 385 GrUniqueKey::Builder builder(key, kDomain, 3); |
385 builder[0] = clipGenID; | 386 builder[0] = clipGenID; |
386 // SkToS16 because image filters outset layers to a size indicated by the fi
lter, which can | 387 // SkToS16 because image filters outset layers to a size indicated by the fi
lter, which can |
387 // sometimes result in negative coordinates from clip space. | 388 // sometimes result in negative coordinates from clip space. |
388 builder[1] = SkToS16(bounds.fLeft) | (SkToS16(bounds.fRight) << 16); | 389 builder[1] = SkToS16(bounds.fLeft) | (SkToS16(bounds.fRight) << 16); |
389 builder[2] = SkToS16(bounds.fTop) | (SkToS16(bounds.fBottom) << 16); | 390 builder[2] = SkToS16(bounds.fTop) | (SkToS16(bounds.fBottom) << 16); |
390 } | 391 } |
391 | 392 |
392 sk_sp<GrTexture> GrClipStackClip::CreateAlphaClipMask(GrContext* context, | 393 sk_sp<GrTextureProxy> GrClipStackClip::CreateAlphaClipMask(GrContext* context, |
393 const GrReducedClip& reduc
edClip) { | 394 const GrReducedClip&
reducedClip) { |
394 GrResourceProvider* resourceProvider = context->resourceProvider(); | 395 GrResourceProvider* resourceProvider = context->resourceProvider(); |
395 GrUniqueKey key; | 396 GrUniqueKey key; |
396 GetClipMaskKey(reducedClip.elementsGenID(), reducedClip.ibounds(), &key); | 397 GetClipMaskKey(reducedClip.elementsGenID(), reducedClip.ibounds(), &key); |
397 if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key)
) { | 398 if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key)
) { |
398 return sk_sp<GrTexture>(texture); | 399 return GrTextureProxy::Make(sk_sp<GrTexture>(texture)); |
399 } | 400 } |
400 | 401 |
401 sk_sp<GrRenderTargetContext> rtc(context->makeRenderTargetContextWithFallbac
k( | 402 sk_sp<GrRenderTargetContext> rtc(context->makeRenderTargetContextWithFallbac
k( |
402 SkB
ackingFit::kApprox, | 403 SkB
ackingFit::kApprox, |
403 red
ucedClip.width(), | 404 red
ucedClip.width(), |
404 red
ucedClip.height(), | 405 red
ucedClip.height(), |
405 kAl
pha_8_GrPixelConfig, | 406 kAl
pha_8_GrPixelConfig, |
406 nul
lptr)); | 407 nul
lptr)); |
407 if (!rtc) { | 408 if (!rtc) { |
408 return nullptr; | 409 return nullptr; |
409 } | 410 } |
410 | 411 |
411 if (!reducedClip.drawAlphaClipMask(rtc.get())) { | 412 if (!reducedClip.drawAlphaClipMask(rtc.get())) { |
412 return nullptr; | 413 return nullptr; |
413 } | 414 } |
414 | 415 |
415 sk_sp<GrTexture> texture(rtc->asTexture()); | 416 sk_sp<GrTextureProxy> texture(rtc->asDeferredTexture()); |
416 SkASSERT(texture); | 417 SkASSERT(texture); |
417 texture->resourcePriv().setUniqueKey(key); | 418 //texture->resourcePriv().setUniqueKey(key); |
418 return texture; | 419 return texture; |
419 } | 420 } |
420 | 421 |
421 sk_sp<GrTexture> GrClipStackClip::CreateSoftwareClipMask(GrTextureProvider* texP
rovider, | 422 //////////////////////////////////////////////////////////////////////////////// |
422 const GrReducedClip& re
ducedClip) { | 423 sk_sp<GrTextureProxy> GrClipStackClip::CreateSoftwareClipMask(GrTextureProvider*
texProvider, |
| 424 const GrReducedCli
p& reducedClip) { |
423 GrUniqueKey key; | 425 GrUniqueKey key; |
424 GetClipMaskKey(reducedClip.elementsGenID(), reducedClip.ibounds(), &key); | 426 GetClipMaskKey(reducedClip.elementsGenID(), reducedClip.ibounds(), &key); |
425 if (GrTexture* texture = texProvider->findAndRefTextureByUniqueKey(key)) { | 427 if (GrTexture* texture = texProvider->findAndRefTextureByUniqueKey(key)) { |
426 return sk_sp<GrTexture>(texture); | 428 return GrTextureProxy::Make(sk_ref_sp(texture)); // sub-optimal!! |
427 } | 429 } |
428 | 430 |
429 // The mask texture may be larger than necessary. We round out the clip spac
e bounds and pin | 431 // The mask texture may be larger than necessary. We round out the clip spac
e bounds and pin |
430 // the top left corner of the resulting rect to the top left of the texture. | 432 // the top left corner of the resulting rect to the top left of the texture. |
431 SkIRect maskSpaceIBounds = SkIRect::MakeWH(reducedClip.width(), reducedClip.
height()); | 433 SkIRect maskSpaceIBounds = SkIRect::MakeWH(reducedClip.width(), reducedClip.
height()); |
432 | 434 |
433 GrSWMaskHelper helper(texProvider); | 435 GrSWMaskHelper helper(texProvider); |
434 | 436 |
435 // Set the matrix so that rendered clip elements are transformed to mask spa
ce from clip | 437 // Set the matrix so that rendered clip elements are transformed to mask spa
ce from clip |
436 // space. | 438 // space. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 desc.fConfig = kAlpha_8_GrPixelConfig; | 485 desc.fConfig = kAlpha_8_GrPixelConfig; |
484 | 486 |
485 sk_sp<GrTexture> result(texProvider->createApproxTexture(desc)); | 487 sk_sp<GrTexture> result(texProvider->createApproxTexture(desc)); |
486 if (!result) { | 488 if (!result) { |
487 return nullptr; | 489 return nullptr; |
488 } | 490 } |
489 result->resourcePriv().setUniqueKey(key); | 491 result->resourcePriv().setUniqueKey(key); |
490 | 492 |
491 helper.toTexture(result.get()); | 493 helper.toTexture(result.get()); |
492 | 494 |
493 return result; | 495 return GrTextureProxy::Make(result); |
494 } | 496 } |
OLD | NEW |