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

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

Issue 15780002: Replace GrDrawState::AutoDeviceCoordDraw with GrDrawState::AutoViewMatrixRestore::setIdentity(). s (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: update based on comments Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrAAHairLinePathRenderer.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 /* 2 /*
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "GrClipMaskManager.h" 9 #include "GrClipMaskManager.h"
10 #include "GrAAConvexPathRenderer.h" 10 #include "GrAAConvexPathRenderer.h"
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 GrCrash("Unexpected element type"); 340 GrCrash("Unexpected element type");
341 return false; 341 return false;
342 } 342 }
343 } 343 }
344 344
345 void GrClipMaskManager::mergeMask(GrTexture* dstMask, 345 void GrClipMaskManager::mergeMask(GrTexture* dstMask,
346 GrTexture* srcMask, 346 GrTexture* srcMask,
347 SkRegion::Op op, 347 SkRegion::Op op,
348 const GrIRect& dstBound, 348 const GrIRect& dstBound,
349 const GrIRect& srcBound) { 349 const GrIRect& srcBound) {
350 GrDrawState::AutoViewMatrixRestore avmr;
350 GrDrawState* drawState = fGpu->drawState(); 351 GrDrawState* drawState = fGpu->drawState();
351 SkMatrix oldMatrix = drawState->getViewMatrix(); 352 SkAssertResult(avmr.setIdentity(drawState));
352 drawState->viewMatrix()->reset();
353 353
354 drawState->setRenderTarget(dstMask->asRenderTarget()); 354 drawState->setRenderTarget(dstMask->asRenderTarget());
355 355
356 setup_boolean_blendcoeffs(drawState, op); 356 setup_boolean_blendcoeffs(drawState, op);
357 357
358 SkMatrix sampleM; 358 SkMatrix sampleM;
359 sampleM.setIDiv(srcMask->width(), srcMask->height()); 359 sampleM.setIDiv(srcMask->width(), srcMask->height());
360 drawState->setEffect(0, 360 drawState->setEffect(0,
361 GrTextureDomainEffect::Create(srcMask, 361 GrTextureDomainEffect::Create(srcMask,
362 sampleM, 362 sampleM,
363 GrTextureDomainEffect::MakeTexelDomain(src Mask, srcBound), 363 GrTextureDomainEffect::MakeTexelDomain(src Mask, srcBound),
364 GrTextureDomainEffect::kDecal_WrapMode, 364 GrTextureDomainEffect::kDecal_WrapMode,
365 false))->unref(); 365 false))->unref();
366 fGpu->drawSimpleRect(SkRect::MakeFromIRect(dstBound), NULL); 366 fGpu->drawSimpleRect(SkRect::MakeFromIRect(dstBound), NULL);
367 367
368 drawState->disableStage(0); 368 drawState->disableStage(0);
369 drawState->setViewMatrix(oldMatrix);
370 } 369 }
371 370
372 // get a texture to act as a temporary buffer for AA clip boolean operations 371 // get a texture to act as a temporary buffer for AA clip boolean operations
373 // TODO: given the expense of createTexture we may want to just cache this too 372 // TODO: given the expense of createTexture we may want to just cache this too
374 void GrClipMaskManager::getTemp(int width, int height, GrAutoScratchTexture* tem p) { 373 void GrClipMaskManager::getTemp(int width, int height, GrAutoScratchTexture* tem p) {
375 if (NULL != temp->texture()) { 374 if (NULL != temp->texture()) {
376 // we've already allocated the temp texture 375 // we've already allocated the temp texture
377 return; 376 return;
378 } 377 }
379 378
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 if (this->getMaskTexture(clipStackGenID, clipSpaceIBounds, &result)) { 429 if (this->getMaskTexture(clipStackGenID, clipSpaceIBounds, &result)) {
431 fCurrClipMaskType = kAlpha_ClipMaskType; 430 fCurrClipMaskType = kAlpha_ClipMaskType;
432 return result; 431 return result;
433 } 432 }
434 433
435 if (NULL == result) { 434 if (NULL == result) {
436 fAACache.reset(); 435 fAACache.reset();
437 return NULL; 436 return NULL;
438 } 437 }
439 438
440 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRI nit);
441 GrDrawState* drawState = fGpu->drawState();
442
443 // The top-left of the mask corresponds to the top-left corner of the bounds . 439 // The top-left of the mask corresponds to the top-left corner of the bounds .
444 SkVector clipToMaskOffset = { 440 SkVector clipToMaskOffset = {
445 SkIntToScalar(-clipSpaceIBounds.fLeft), 441 SkIntToScalar(-clipSpaceIBounds.fLeft),
446 SkIntToScalar(-clipSpaceIBounds.fTop) 442 SkIntToScalar(-clipSpaceIBounds.fTop)
447 }; 443 };
448 // The texture may be larger than necessary, this rect represents the part o f the texture 444 // The texture may be larger than necessary, this rect represents the part o f the texture
449 // we populate with a rasterization of the clip. 445 // we populate with a rasterization of the clip.
450 SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpa ceIBounds.height()); 446 SkIRect maskSpaceIBounds = SkIRect::MakeWH(clipSpaceIBounds.width(), clipSpa ceIBounds.height());
451 447
448 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip space.
449 SkMatrix translate;
450 translate.setTranslate(clipToMaskOffset);
451 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ASRI nit, &translate);
452
453 GrDrawState* drawState = fGpu->drawState();
454
452 // We're drawing a coverage mask and want coverage to be run through the ble nd function. 455 // We're drawing a coverage mask and want coverage to be run through the ble nd function.
453 drawState->enableState(GrDrawState::kCoverageDrawing_StateBit); 456 drawState->enableState(GrDrawState::kCoverageDrawing_StateBit);
454 457
455 // Set the matrix so that rendered clip elements are transformed to mask spa ce from clip space.
456 drawState->viewMatrix()->setTranslate(clipToMaskOffset);
457
458 // The scratch texture that we are drawing into can be substantially larger than the mask. Only 458 // The scratch texture that we are drawing into can be substantially larger than the mask. Only
459 // clear the part that we care about. 459 // clear the part that we care about.
460 fGpu->clear(&maskSpaceIBounds, 460 fGpu->clear(&maskSpaceIBounds,
461 kAllIn_InitialState == initialState ? 0xffffffff : 0x00000000, 461 kAllIn_InitialState == initialState ? 0xffffffff : 0x00000000,
462 result->asRenderTarget()); 462 result->asRenderTarget());
463 463
464 // When we use the stencil in the below loop it is important to have this cl ip installed. 464 // When we use the stencil in the below loop it is important to have this cl ip installed.
465 // The second pass that zeros the stencil buffer renders the rect maskSpaceI Bounds so the first 465 // The second pass that zeros the stencil buffer renders the rect maskSpaceI Bounds so the first
466 // pass must not set values outside of this bounds or stencil values outside the rect won't be 466 // pass must not set values outside of this bounds or stencil values outside the rect won't be
467 // cleared. 467 // cleared.
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 GrStencilBuffer* stencilBuffer = rt->getStencilBuffer(); 582 GrStencilBuffer* stencilBuffer = rt->getStencilBuffer();
583 if (NULL == stencilBuffer) { 583 if (NULL == stencilBuffer) {
584 return false; 584 return false;
585 } 585 }
586 int32_t genID = elements.tail()->getGenID(); 586 int32_t genID = elements.tail()->getGenID();
587 587
588 if (stencilBuffer->mustRenderClip(genID, clipSpaceIBounds, clipSpaceToStenci lOffset)) { 588 if (stencilBuffer->mustRenderClip(genID, clipSpaceIBounds, clipSpaceToStenci lOffset)) {
589 589
590 stencilBuffer->setLastClip(genID, clipSpaceIBounds, clipSpaceToStencilOf fset); 590 stencilBuffer->setLastClip(genID, clipSpaceIBounds, clipSpaceToStencilOf fset);
591 591
592 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ ASRInit); 592 // Set the matrix so that rendered clip elements are transformed from cl ip to stencil space.
593 SkVector translate = {
594 SkIntToScalar(clipSpaceToStencilOffset.fX),
595 SkIntToScalar(clipSpaceToStencilOffset.fY)
596 };
597 SkMatrix matrix;
598 matrix.setTranslate(translate);
599 GrDrawTarget::AutoGeometryAndStatePush agasp(fGpu, GrDrawTarget::kReset_ ASRInit, &matrix);
593 drawState = fGpu->drawState(); 600 drawState = fGpu->drawState();
601
594 drawState->setRenderTarget(rt); 602 drawState->setRenderTarget(rt);
595 603
596 // We set the current clip to the bounds so that our recursive draws are scissored to them. 604 // We set the current clip to the bounds so that our recursive draws are scissored to them.
597 SkIRect stencilSpaceIBounds(clipSpaceIBounds); 605 SkIRect stencilSpaceIBounds(clipSpaceIBounds);
598 stencilSpaceIBounds.offset(clipSpaceToStencilOffset); 606 stencilSpaceIBounds.offset(clipSpaceToStencilOffset);
599 GrDrawTarget::AutoClipRestore acr(fGpu, stencilSpaceIBounds); 607 GrDrawTarget::AutoClipRestore acr(fGpu, stencilSpaceIBounds);
600 drawState->enableState(GrDrawState::kClip_StateBit); 608 drawState->enableState(GrDrawState::kClip_StateBit);
601 609
602 // Set the matrix so that rendered clip elements are transformed from cl ip to stencil space.
603 SkVector translate = {
604 SkIntToScalar(clipSpaceToStencilOffset.fX),
605 SkIntToScalar(clipSpaceToStencilOffset.fY)
606 };
607 drawState->viewMatrix()->setTranslate(translate);
608
609 #if !VISUALIZE_COMPLEX_CLIP 610 #if !VISUALIZE_COMPLEX_CLIP
610 drawState->enableState(GrDrawState::kNoColorWrites_StateBit); 611 drawState->enableState(GrDrawState::kNoColorWrites_StateBit);
611 #endif 612 #endif
612 613
613 int clipBit = stencilBuffer->bits(); 614 int clipBit = stencilBuffer->bits();
614 SkASSERT((clipBit <= 16) && "Ganesh only handles 16b or smaller stencil buffers"); 615 SkASSERT((clipBit <= 16) && "Ganesh only handles 16b or smaller stencil buffers");
615 clipBit = (1 << (clipBit-1)); 616 clipBit = (1 << (clipBit-1));
616 617
617 fGpu->clearStencilClip(stencilSpaceIBounds, kAllIn_InitialState == initi alState); 618 fGpu->clearStencilClip(stencilSpaceIBounds, kAllIn_InitialState == initi alState);
618 619
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 1002
1002 //////////////////////////////////////////////////////////////////////////////// 1003 ////////////////////////////////////////////////////////////////////////////////
1003 void GrClipMaskManager::releaseResources() { 1004 void GrClipMaskManager::releaseResources() {
1004 fAACache.releaseResources(); 1005 fAACache.releaseResources();
1005 } 1006 }
1006 1007
1007 void GrClipMaskManager::setGpu(GrGpu* gpu) { 1008 void GrClipMaskManager::setGpu(GrGpu* gpu) {
1008 fGpu = gpu; 1009 fGpu = gpu;
1009 fAACache.setContext(gpu->getContext()); 1010 fAACache.setContext(gpu->getContext());
1010 } 1011 }
OLDNEW
« no previous file with comments | « src/gpu/GrAAHairLinePathRenderer.cpp ('k') | src/gpu/GrContext.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698