| OLD | NEW |
| 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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 fps[i]->unref(); | 196 fps[i]->unref(); |
| 197 } | 197 } |
| 198 return resultFP; | 198 return resultFP; |
| 199 } | 199 } |
| 200 | 200 |
| 201 //////////////////////////////////////////////////////////////////////////////// | 201 //////////////////////////////////////////////////////////////////////////////// |
| 202 // sort out what kind of clip mask needs to be created: alpha, stencil, | 202 // sort out what kind of clip mask needs to be created: alpha, stencil, |
| 203 // scissor, or entirely software | 203 // scissor, or entirely software |
| 204 bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, | 204 bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
| 205 GrPipelineBuilder::AutoRestoreStencil* ars
, | 205 GrPipelineBuilder::AutoRestoreStencil* ars
, |
| 206 GrScissorState* scissorState, | |
| 207 const SkRect* devBounds, | 206 const SkRect* devBounds, |
| 208 GrAppliedClip* out) { | 207 GrAppliedClip* out) { |
| 209 if (kRespectClip_StencilClipMode == fClipMode) { | 208 if (kRespectClip_StencilClipMode == fClipMode) { |
| 210 fClipMode = kIgnoreClip_StencilClipMode; | 209 fClipMode = kIgnoreClip_StencilClipMode; |
| 211 } | 210 } |
| 212 | 211 |
| 213 GrReducedClip::ElementList elements(16); | 212 GrReducedClip::ElementList elements(16); |
| 214 int32_t genID = 0; | 213 int32_t genID = 0; |
| 215 GrReducedClip::InitialState initialState = GrReducedClip::kAllIn_InitialStat
e; | 214 GrReducedClip::InitialState initialState = GrReducedClip::kAllIn_InitialStat
e; |
| 216 SkIRect clipSpaceIBounds; | 215 SkIRect clipSpaceIBounds; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 229 | 228 |
| 230 // The clip mask manager always draws with a single IRect so we special case
that logic here | 229 // The clip mask manager always draws with a single IRect so we special case
that logic here |
| 231 // Image filters just use a rect, so we also special case that logic | 230 // Image filters just use a rect, so we also special case that logic |
| 232 switch (clip.clipType()) { | 231 switch (clip.clipType()) { |
| 233 case GrClip::kWideOpen_ClipType: | 232 case GrClip::kWideOpen_ClipType: |
| 234 SkFAIL("Should have caught this with clip.isWideOpen()"); | 233 SkFAIL("Should have caught this with clip.isWideOpen()"); |
| 235 return true; | 234 return true; |
| 236 case GrClip::kIRect_ClipType: { | 235 case GrClip::kIRect_ClipType: { |
| 237 SkIRect scissor = clip.irect(); | 236 SkIRect scissor = clip.irect(); |
| 238 if (scissor.intersect(clipSpaceRTIBounds)) { | 237 if (scissor.intersect(clipSpaceRTIBounds)) { |
| 239 scissorState->set(scissor); | 238 out->fScissorState.set(scissor); |
| 240 this->setPipelineBuilderStencil(pipelineBuilder, ars); | 239 this->setPipelineBuilderStencil(pipelineBuilder, ars); |
| 241 return true; | 240 return true; |
| 242 } | 241 } |
| 243 return false; | 242 return false; |
| 244 } | 243 } |
| 245 case GrClip::kClipStack_ClipType: { | 244 case GrClip::kClipStack_ClipType: { |
| 246 clipSpaceRTIBounds.offset(clip.origin()); | 245 clipSpaceRTIBounds.offset(clip.origin()); |
| 247 GrReducedClip::ReduceClipStack(*clip.clipStack(), | 246 GrReducedClip::ReduceClipStack(*clip.clipStack(), |
| 248 clipSpaceRTIBounds, | 247 clipSpaceRTIBounds, |
| 249 &elements, | 248 &elements, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 279 // a fractional pixel coverage. | 278 // a fractional pixel coverage. |
| 280 bool disallowAnalyticAA = pipelineBuilder.getRenderTarget()->isUnifiedMu
ltisampled(); | 279 bool disallowAnalyticAA = pipelineBuilder.getRenderTarget()->isUnifiedMu
ltisampled(); |
| 281 const GrFragmentProcessor* clipFP = nullptr; | 280 const GrFragmentProcessor* clipFP = nullptr; |
| 282 if (elements.isEmpty() || | 281 if (elements.isEmpty() || |
| 283 (requiresAA && !disallowAnalyticAA && | 282 (requiresAA && !disallowAnalyticAA && |
| 284 SkToBool(clipFP = this->getAnalyticClipProcessor(elements, clipToRT
Offset, devBounds)))) { | 283 SkToBool(clipFP = this->getAnalyticClipProcessor(elements, clipToRT
Offset, devBounds)))) { |
| 285 SkIRect scissorSpaceIBounds(clipSpaceIBounds); | 284 SkIRect scissorSpaceIBounds(clipSpaceIBounds); |
| 286 scissorSpaceIBounds.offset(-clip.origin()); | 285 scissorSpaceIBounds.offset(-clip.origin()); |
| 287 if (nullptr == devBounds || | 286 if (nullptr == devBounds || |
| 288 !SkRect::Make(scissorSpaceIBounds).contains(*devBounds)) { | 287 !SkRect::Make(scissorSpaceIBounds).contains(*devBounds)) { |
| 289 scissorState->set(scissorSpaceIBounds); | 288 out->fScissorState.set(scissorSpaceIBounds); |
| 290 } | 289 } |
| 291 this->setPipelineBuilderStencil(pipelineBuilder, ars); | 290 this->setPipelineBuilderStencil(pipelineBuilder, ars); |
| 292 out->fClipCoverageFP.reset(clipFP); | 291 out->fClipCoverageFP.reset(clipFP); |
| 293 return true; | 292 return true; |
| 294 } | 293 } |
| 295 } | 294 } |
| 296 | 295 |
| 297 // If MSAA is enabled we can do everything in the stencil buffer. | 296 // If MSAA is enabled we can do everything in the stencil buffer. |
| 298 if (0 == rt->numStencilSamples() && requiresAA) { | 297 if (0 == rt->numStencilSamples() && requiresAA) { |
| 299 SkAutoTUnref<GrTexture> result; | 298 SkAutoTUnref<GrTexture> result; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 initialState, | 338 initialState, |
| 340 elements, | 339 elements, |
| 341 clipSpaceIBounds, | 340 clipSpaceIBounds, |
| 342 clipSpaceToStencilSpaceOffset); | 341 clipSpaceToStencilSpaceOffset); |
| 343 | 342 |
| 344 // This must occur after createStencilClipMask. That function may change the
scissor. Also, it | 343 // This must occur after createStencilClipMask. That function may change the
scissor. Also, it |
| 345 // only guarantees that the stencil mask is correct within the bounds it was
passed, so we must | 344 // only guarantees that the stencil mask is correct within the bounds it was
passed, so we must |
| 346 // use both stencil and scissor test to the bounds for the final draw. | 345 // use both stencil and scissor test to the bounds for the final draw. |
| 347 SkIRect scissorSpaceIBounds(clipSpaceIBounds); | 346 SkIRect scissorSpaceIBounds(clipSpaceIBounds); |
| 348 scissorSpaceIBounds.offset(clipSpaceToStencilSpaceOffset); | 347 scissorSpaceIBounds.offset(clipSpaceToStencilSpaceOffset); |
| 349 scissorState->set(scissorSpaceIBounds); | 348 out->fScissorState.set(scissorSpaceIBounds); |
| 350 this->setPipelineBuilderStencil(pipelineBuilder, ars); | 349 this->setPipelineBuilderStencil(pipelineBuilder, ars); |
| 351 return true; | 350 return true; |
| 352 } | 351 } |
| 353 | 352 |
| 354 namespace { | 353 namespace { |
| 355 //////////////////////////////////////////////////////////////////////////////// | 354 //////////////////////////////////////////////////////////////////////////////// |
| 356 // Set a coverage drawing XPF on the pipelineBuilder for the given op and invert
Coverage mode | 355 // Set a coverage drawing XPF on the pipelineBuilder for the given op and invert
Coverage mode |
| 357 void set_coverage_drawing_xpf(SkRegion::Op op, bool invertCoverage, | 356 void set_coverage_drawing_xpf(SkRegion::Op op, bool invertCoverage, |
| 358 GrPipelineBuilder* pipelineBuilder) { | 357 GrPipelineBuilder* pipelineBuilder) { |
| 359 SkASSERT(op <= SkRegion::kLastOp); | 358 SkASSERT(op <= SkRegion::kLastOp); |
| (...skipping 749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 | 1108 |
| 1110 //////////////////////////////////////////////////////////////////////////////// | 1109 //////////////////////////////////////////////////////////////////////////////// |
| 1111 | 1110 |
| 1112 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, | 1111 void GrClipMaskManager::adjustPathStencilParams(const GrStencilAttachment* stenc
ilAttachment, |
| 1113 GrStencilSettings* settings) { | 1112 GrStencilSettings* settings) { |
| 1114 if (stencilAttachment) { | 1113 if (stencilAttachment) { |
| 1115 int stencilBits = stencilAttachment->bits(); | 1114 int stencilBits = stencilAttachment->bits(); |
| 1116 this->adjustStencilParams(settings, fClipMode, stencilBits); | 1115 this->adjustStencilParams(settings, fClipMode, stencilBits); |
| 1117 } | 1116 } |
| 1118 } | 1117 } |
| OLD | NEW |