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

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

Issue 1391653002: Remove ClipMaskType from GrCMM (Closed) Base URL: https://skia.googlesource.com/skia.git@cfp
Patch Set: rebase Created 5 years, 2 months 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/gpu/GrClipMaskManager.h ('k') | no next file » | 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 2012 Google Inc. 2 * Copyright 2012 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 "GrClipMaskManager.h" 8 #include "GrClipMaskManager.h"
9 #include "GrCaps.h" 9 #include "GrCaps.h"
10 #include "GrDrawContext.h" 10 #include "GrDrawContext.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 // last (false) parameter disallows use of the SW path renderer 61 // last (false) parameter disallows use of the SW path renderer
62 GrPathRendererChain::DrawType type = doAA ? 62 GrPathRendererChain::DrawType type = doAA ?
63 GrPathRendererChain::kColorAntiAlias_Dr awType : 63 GrPathRendererChain::kColorAntiAlias_Dr awType :
64 GrPathRendererChain::kColor_DrawType; 64 GrPathRendererChain::kColor_DrawType;
65 65
66 return nullptr == context->getPathRenderer(gpu, &pipelineBuilder, viewMatrix , *path, stroke, 66 return nullptr == context->getPathRenderer(gpu, &pipelineBuilder, viewMatrix , *path, stroke,
67 false, type); 67 false, type);
68 } 68 }
69 69
70 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) 70 GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget)
71 : fCurrClipMaskType(kNone_ClipMaskType) 71 : fDrawTarget(drawTarget)
72 , fDrawTarget(drawTarget)
73 , fClipMode(kIgnoreClip_StencilClipMode) { 72 , fClipMode(kIgnoreClip_StencilClipMode) {
74 } 73 }
75 74
76 GrContext* GrClipMaskManager::getContext() { return fDrawTarget->cmmAccess().con text(); } 75 GrContext* GrClipMaskManager::getContext() { return fDrawTarget->cmmAccess().con text(); }
77 76
78 /* 77 /*
79 * This method traverses the clip stack to see if the GrSoftwarePathRenderer 78 * This method traverses the clip stack to see if the GrSoftwarePathRenderer
80 * will be used on any element. If so, it returns true to indicate that the 79 * will be used on any element. If so, it returns true to indicate that the
81 * entire clip should be rendered in SW and then uploaded en masse to the gpu. 80 * entire clip should be rendered in SW and then uploaded en masse to the gpu.
82 */ 81 */
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 } 201 }
203 202
204 //////////////////////////////////////////////////////////////////////////////// 203 ////////////////////////////////////////////////////////////////////////////////
205 // sort out what kind of clip mask needs to be created: alpha, stencil, 204 // sort out what kind of clip mask needs to be created: alpha, stencil,
206 // scissor, or entirely software 205 // scissor, or entirely software
207 bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, 206 bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
208 GrPipelineBuilder::AutoRestoreStencil* ars , 207 GrPipelineBuilder::AutoRestoreStencil* ars ,
209 GrScissorState* scissorState, 208 GrScissorState* scissorState,
210 const SkRect* devBounds, 209 const SkRect* devBounds,
211 GrAppliedClip* out) { 210 GrAppliedClip* out) {
212 fCurrClipMaskType = kNone_ClipMaskType;
213 if (kRespectClip_StencilClipMode == fClipMode) { 211 if (kRespectClip_StencilClipMode == fClipMode) {
214 fClipMode = kIgnoreClip_StencilClipMode; 212 fClipMode = kIgnoreClip_StencilClipMode;
215 } 213 }
216 214
217 GrReducedClip::ElementList elements(16); 215 GrReducedClip::ElementList elements(16);
218 int32_t genID = 0; 216 int32_t genID = 0;
219 GrReducedClip::InitialState initialState = GrReducedClip::kAllIn_InitialStat e; 217 GrReducedClip::InitialState initialState = GrReducedClip::kAllIn_InitialStat e;
220 SkIRect clipSpaceIBounds; 218 SkIRect clipSpaceIBounds;
221 bool requiresAA = false; 219 bool requiresAA = false;
222 GrRenderTarget* rt = pipelineBuilder.getRenderTarget(); 220 GrRenderTarget* rt = pipelineBuilder.getRenderTarget();
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 } 526 }
529 texture->resourcePriv().setUniqueKey(key); 527 texture->resourcePriv().setUniqueKey(key);
530 return texture; 528 return texture;
531 } 529 }
532 530
533 GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID, 531 GrTexture* GrClipMaskManager::createAlphaClipMask(int32_t elementsGenID,
534 GrReducedClip::InitialState in itialState, 532 GrReducedClip::InitialState in itialState,
535 const GrReducedClip::ElementLi st& elements, 533 const GrReducedClip::ElementLi st& elements,
536 const SkVector& clipToMaskOffs et, 534 const SkVector& clipToMaskOffs et,
537 const SkIRect& clipSpaceIBound s) { 535 const SkIRect& clipSpaceIBound s) {
538 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType);
539 GrResourceProvider* resourceProvider = fDrawTarget->cmmAccess().resourceProv ider(); 536 GrResourceProvider* resourceProvider = fDrawTarget->cmmAccess().resourceProv ider();
540 GrUniqueKey key; 537 GrUniqueKey key;
541 GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key); 538 GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key);
542 if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key) ) { 539 if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key) ) {
543 fCurrClipMaskType = kAlpha_ClipMaskType;
544 return texture; 540 return texture;
545 } 541 }
546 542
547 SkAutoTUnref<GrTexture> texture(this->createCachedMask( 543 SkAutoTUnref<GrTexture> texture(this->createCachedMask(
548 clipSpaceIBounds.width(), clipSpaceIBounds.height(), key, true)); 544 clipSpaceIBounds.width(), clipSpaceIBounds.height(), key, true));
549 545
550 // There's no texture in the cache. Let's try to allocate it then. 546 // There's no texture in the cache. Let's try to allocate it then.
551 if (!texture) { 547 if (!texture) {
552 return nullptr; 548 return nullptr;
553 } 549 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 } else { 667 } else {
672 GrPipelineBuilder pipelineBuilder; 668 GrPipelineBuilder pipelineBuilder;
673 669
674 // all the remaining ops can just be directly draw into the accumula tion buffer 670 // all the remaining ops can just be directly draw into the accumula tion buffer
675 set_coverage_drawing_xpf(op, false, &pipelineBuilder); 671 set_coverage_drawing_xpf(op, false, &pipelineBuilder);
676 // The color passed in here does not matter since the coverageSetOpX P won't read it. 672 // The color passed in here does not matter since the coverageSetOpX P won't read it.
677 this->drawElement(&pipelineBuilder, translate, texture, element); 673 this->drawElement(&pipelineBuilder, translate, texture, element);
678 } 674 }
679 } 675 }
680 676
681 fCurrClipMaskType = kAlpha_ClipMaskType;
682 return texture.detach(); 677 return texture.detach();
683 } 678 }
684 679
685 //////////////////////////////////////////////////////////////////////////////// 680 ////////////////////////////////////////////////////////////////////////////////
686 // Create a 1-bit clip mask in the stencil buffer. 'devClipBounds' are in device 681 // Create a 1-bit clip mask in the stencil buffer. 'devClipBounds' are in device
687 // (as opposed to canvas) coordinates 682 // (as opposed to canvas) coordinates
688 bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, 683 bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt,
689 int32_t elementsGenID, 684 int32_t elementsGenID,
690 GrReducedClip::InitialState initia lState, 685 GrReducedClip::InitialState initia lState,
691 const GrReducedClip::ElementList& elements, 686 const GrReducedClip::ElementList& elements,
692 const SkIRect& clipSpaceIBounds, 687 const SkIRect& clipSpaceIBounds,
693 const SkIPoint& clipSpaceToStencil Offset) { 688 const SkIPoint& clipSpaceToStencil Offset) {
694 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType);
695 SkASSERT(rt); 689 SkASSERT(rt);
696 690
697 GrStencilAttachment* stencilAttachment = 691 GrStencilAttachment* stencilAttachment =
698 fDrawTarget->cmmAccess().resourceProvider()->attachStencilAttachment(rt) ; 692 fDrawTarget->cmmAccess().resourceProvider()->attachStencilAttachment(rt) ;
699 if (nullptr == stencilAttachment) { 693 if (nullptr == stencilAttachment) {
700 return false; 694 return false;
701 } 695 }
702 696
703 if (stencilAttachment->mustRenderClip(elementsGenID, clipSpaceIBounds, clipS paceToStencilOffset)) { 697 if (stencilAttachment->mustRenderClip(elementsGenID, clipSpaceIBounds, clipS paceToStencilOffset)) {
704 stencilAttachment->setLastClip(elementsGenID, clipSpaceIBounds, clipSpac eToStencilOffset); 698 stencilAttachment->setLastClip(elementsGenID, clipSpaceIBounds, clipSpac eToStencilOffset);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 // The view matrix is setup to do clip space -> stencil spac e translation, so 858 // The view matrix is setup to do clip space -> stencil spac e translation, so
865 // draw rect in clip space. 859 // draw rect in clip space.
866 fDrawTarget->drawNonAARect(pipelineBuilder, 860 fDrawTarget->drawNonAARect(pipelineBuilder,
867 GrColor_WHITE, 861 GrColor_WHITE,
868 viewMatrix, 862 viewMatrix,
869 SkRect::Make(clipSpaceIBounds)); 863 SkRect::Make(clipSpaceIBounds));
870 } 864 }
871 } 865 }
872 } 866 }
873 } 867 }
874 // set this last because recursive draws may overwrite it back to kNone.
875 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType);
876 fCurrClipMaskType = kStencil_ClipMaskType;
877 fClipMode = kRespectClip_StencilClipMode; 868 fClipMode = kRespectClip_StencilClipMode;
878 return true; 869 return true;
879 } 870 }
880 871
881 // mapping of clip-respecting stencil funcs to normal stencil funcs 872 // mapping of clip-respecting stencil funcs to normal stencil funcs
882 // mapping depends on whether stencil-clipping is in effect. 873 // mapping depends on whether stencil-clipping is in effect.
883 static const GrStencilFunc 874 static const GrStencilFunc
884 gSpecialToBasicStencilFunc[2][kClipStencilFuncCount] = { 875 gSpecialToBasicStencilFunc[2][kClipStencilFuncCount] = {
885 {// Stencil-Clipping is DISABLED, we are effectively always inside the clip 876 {// Stencil-Clipping is DISABLED, we are effectively always inside the clip
886 // In the Clip Funcs 877 // In the Clip Funcs
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
992 uint16_t funcMask = settings->funcMask(face); 983 uint16_t funcMask = settings->funcMask(face);
993 uint16_t funcRef = settings->funcRef(face); 984 uint16_t funcRef = settings->funcRef(face);
994 985
995 SkASSERT((unsigned) func < kStencilFuncCount); 986 SkASSERT((unsigned) func < kStencilFuncCount);
996 987
997 writeMask &= userBits; 988 writeMask &= userBits;
998 989
999 if (func >= kBasicStencilFuncCount) { 990 if (func >= kBasicStencilFuncCount) {
1000 int respectClip = kRespectClip_StencilClipMode == mode; 991 int respectClip = kRespectClip_StencilClipMode == mode;
1001 if (respectClip) { 992 if (respectClip) {
1002 // The GrGpu class should have checked this
1003 SkASSERT(this->isClipInStencil());
1004 switch (func) { 993 switch (func) {
1005 case kAlwaysIfInClip_StencilFunc: 994 case kAlwaysIfInClip_StencilFunc:
1006 funcMask = clipBit; 995 funcMask = clipBit;
1007 funcRef = clipBit; 996 funcRef = clipBit;
1008 break; 997 break;
1009 case kEqualIfInClip_StencilFunc: 998 case kEqualIfInClip_StencilFunc:
1010 case kLessIfInClip_StencilFunc: 999 case kLessIfInClip_StencilFunc:
1011 case kLEqualIfInClip_StencilFunc: 1000 case kLEqualIfInClip_StencilFunc:
1012 funcMask = (funcMask & userBits) | clipBit; 1001 funcMask = (funcMask & userBits) | clipBit;
1013 funcRef = (funcRef & userBits) | clipBit; 1002 funcRef = (funcRef & userBits) | clipBit;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 settings->copyFrontSettingsToBack(); 1037 settings->copyFrontSettingsToBack();
1049 } 1038 }
1050 } 1039 }
1051 1040
1052 //////////////////////////////////////////////////////////////////////////////// 1041 ////////////////////////////////////////////////////////////////////////////////
1053 GrTexture* GrClipMaskManager::createSoftwareClipMask(int32_t elementsGenID, 1042 GrTexture* GrClipMaskManager::createSoftwareClipMask(int32_t elementsGenID,
1054 GrReducedClip::InitialState initialState, 1043 GrReducedClip::InitialState initialState,
1055 const GrReducedClip::Elemen tList& elements, 1044 const GrReducedClip::Elemen tList& elements,
1056 const SkVector& clipToMaskO ffset, 1045 const SkVector& clipToMaskO ffset,
1057 const SkIRect& clipSpaceIBo unds) { 1046 const SkIRect& clipSpaceIBo unds) {
1058 SkASSERT(kNone_ClipMaskType == fCurrClipMaskType);
1059 GrUniqueKey key; 1047 GrUniqueKey key;
1060 GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key); 1048 GetClipMaskKey(elementsGenID, clipSpaceIBounds, &key);
1061 GrResourceProvider* resourceProvider = fDrawTarget->cmmAccess().resourceProv ider(); 1049 GrResourceProvider* resourceProvider = fDrawTarget->cmmAccess().resourceProv ider();
1062 if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key) ) { 1050 if (GrTexture* texture = resourceProvider->findAndRefTextureByUniqueKey(key) ) {
1063 return texture; 1051 return texture;
1064 } 1052 }
1065 1053
1066 // The mask texture may be larger than necessary. We round out the clip spac e bounds and pin 1054 // The mask texture may be larger than necessary. We round out the clip spac e bounds and pin
1067 // the top left corner of the resulting rect to the top left of the texture. 1055 // the top left corner of the resulting rect to the top left of the texture.
1068 SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpa ceIBounds.height()); 1056 SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpa ceIBounds.height());
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1111 } 1099 }
1112 1100
1113 // Allocate clip mask texture 1101 // Allocate clip mask texture
1114 GrTexture* result = this->createCachedMask(clipSpaceIBounds.width(), clipSpa ceIBounds.height(), 1102 GrTexture* result = this->createCachedMask(clipSpaceIBounds.width(), clipSpa ceIBounds.height(),
1115 key, false); 1103 key, false);
1116 if (nullptr == result) { 1104 if (nullptr == result) {
1117 return nullptr; 1105 return nullptr;
1118 } 1106 }
1119 helper.toTexture(result); 1107 helper.toTexture(result);
1120 1108
1121 fCurrClipMaskType = kAlpha_ClipMaskType;
1122 return result; 1109 return result;
1123 } 1110 }
1124 1111
1125 //////////////////////////////////////////////////////////////////////////////// 1112 ////////////////////////////////////////////////////////////////////////////////
1126 1113
1127 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc ilAttachment, 1114 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc ilAttachment,
1128 GrStencilSettings* settings) { 1115 GrStencilSettings* settings) {
1129 if (stencilAttachment) { 1116 if (stencilAttachment) {
1130 int stencilBits = stencilAttachment->bits(); 1117 int stencilBits = stencilAttachment->bits();
1131 this->adjustStencilParams(settings, fClipMode, stencilBits); 1118 this->adjustStencilParams(settings, fClipMode, stencilBits);
1132 } 1119 }
1133 } 1120 }
OLDNEW
« no previous file with comments | « src/gpu/GrClipMaskManager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698