| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 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 | 9 |
| 10 | 10 |
| 11 #include "GrDrawTarget.h" | 11 #include "GrDrawTarget.h" |
| 12 #include "GrContext.h" | 12 #include "GrContext.h" |
| 13 #include "GrDrawTargetCaps.h" | 13 #include "GrDrawTargetCaps.h" |
| 14 #include "GrPath.h" |
| 14 #include "GrRenderTarget.h" | 15 #include "GrRenderTarget.h" |
| 15 #include "GrTexture.h" | 16 #include "GrTexture.h" |
| 16 #include "GrVertexBuffer.h" | 17 #include "GrVertexBuffer.h" |
| 17 | 18 |
| 18 #include "SkStrokeRec.h" | 19 #include "SkStrokeRec.h" |
| 19 | 20 |
| 20 SK_DEFINE_INST_COUNT(GrDrawTarget) | 21 SK_DEFINE_INST_COUNT(GrDrawTarget) |
| 21 | 22 |
| 22 //////////////////////////////////////////////////////////////////////////////// | 23 //////////////////////////////////////////////////////////////////////////////// |
| 23 | 24 |
| (...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 } | 407 } |
| 407 | 408 |
| 408 SkASSERT(drawState.validateVertexAttribs()); | 409 SkASSERT(drawState.validateVertexAttribs()); |
| 409 #endif | 410 #endif |
| 410 if (NULL == drawState.getRenderTarget()) { | 411 if (NULL == drawState.getRenderTarget()) { |
| 411 return false; | 412 return false; |
| 412 } | 413 } |
| 413 return true; | 414 return true; |
| 414 } | 415 } |
| 415 | 416 |
| 416 bool GrDrawTarget::setupDstReadIfNecessary(DrawInfo* info) { | 417 bool GrDrawTarget::setupDstReadIfNecessary(GrDeviceCoordTexture* dstCopy, const
SkRect* drawBounds) { |
| 417 if (this->caps()->dstReadInShaderSupport() || !this->getDrawState().willEffe
ctReadDstColor()) { | 418 if (this->caps()->dstReadInShaderSupport() || !this->getDrawState().willEffe
ctReadDstColor()) { |
| 418 return true; | 419 return true; |
| 419 } | 420 } |
| 420 GrRenderTarget* rt = this->drawState()->getRenderTarget(); | 421 GrRenderTarget* rt = this->drawState()->getRenderTarget(); |
| 421 | 422 |
| 422 const GrClipData* clip = this->getClip(); | |
| 423 SkIRect copyRect; | 423 SkIRect copyRect; |
| 424 clip->getConservativeBounds(this->getDrawState().getRenderTarget(), ©Rec
t); | 424 |
| 425 SkIRect drawIBounds; | 425 if (this->drawState()->isClipState()) { |
| 426 if (info->getDevIBounds(&drawIBounds)) { | 426 const GrClipData* clip = this->getClip(); |
| 427 clip->getConservativeBounds(rt, ©Rect); |
| 428 } else { |
| 429 copyRect = SkIRect::MakeWH(rt->width(), rt->height()); |
| 430 } |
| 431 |
| 432 if (NULL != drawBounds) { |
| 433 SkIRect drawIBounds; |
| 434 drawBounds->roundOut(&drawIBounds); |
| 427 if (!copyRect.intersect(drawIBounds)) { | 435 if (!copyRect.intersect(drawIBounds)) { |
| 428 #ifdef SK_DEBUG | 436 #ifdef SK_DEBUG |
| 429 GrPrintf("Missed an early reject. Bailing on draw from setupDstReadI
fNecessary.\n"); | 437 GrPrintf("Missed an early reject. Bailing on draw from setupDstReadI
fNecessary.\n"); |
| 430 #endif | 438 #endif |
| 431 return false; | 439 return false; |
| 432 } | 440 } |
| 433 } else { | 441 } else { |
| 434 #ifdef SK_DEBUG | 442 #ifdef SK_DEBUG |
| 435 //GrPrintf("No dev bounds when dst copy is made.\n"); | 443 //GrPrintf("No dev bounds when dst copy is made.\n"); |
| 436 #endif | 444 #endif |
| 437 } | 445 } |
| 438 | 446 |
| 439 // MSAA consideration: When there is support for reading MSAA samples in the
shader we could | 447 // MSAA consideration: When there is support for reading MSAA samples in the
shader we could |
| 440 // have per-sample dst values by making the copy multisampled. | 448 // have per-sample dst values by making the copy multisampled. |
| 441 GrTextureDesc desc; | 449 GrTextureDesc desc; |
| 442 this->initCopySurfaceDstDesc(rt, &desc); | 450 this->initCopySurfaceDstDesc(rt, &desc); |
| 443 desc.fWidth = copyRect.width(); | 451 desc.fWidth = copyRect.width(); |
| 444 desc.fHeight = copyRect.height(); | 452 desc.fHeight = copyRect.height(); |
| 445 | 453 |
| 446 GrAutoScratchTexture ast(fContext, desc, GrContext::kApprox_ScratchTexMatch)
; | 454 GrAutoScratchTexture ast(fContext, desc, GrContext::kApprox_ScratchTexMatch)
; |
| 447 | 455 |
| 448 if (NULL == ast.texture()) { | 456 if (NULL == ast.texture()) { |
| 449 GrPrintf("Failed to create temporary copy of destination texture.\n"); | 457 GrPrintf("Failed to create temporary copy of destination texture.\n"); |
| 450 return false; | 458 return false; |
| 451 } | 459 } |
| 452 SkIPoint dstPoint = {0, 0}; | 460 SkIPoint dstPoint = {0, 0}; |
| 453 if (this->copySurface(ast.texture(), rt, copyRect, dstPoint)) { | 461 if (this->copySurface(ast.texture(), rt, copyRect, dstPoint)) { |
| 454 info->fDstCopy.setTexture(ast.texture()); | 462 dstCopy->setTexture(ast.texture()); |
| 455 info->fDstCopy.setOffset(copyRect.fLeft, copyRect.fTop); | 463 dstCopy->setOffset(copyRect.fLeft, copyRect.fTop); |
| 456 return true; | 464 return true; |
| 457 } else { | 465 } else { |
| 458 return false; | 466 return false; |
| 459 } | 467 } |
| 460 } | 468 } |
| 461 | 469 |
| 462 void GrDrawTarget::drawIndexed(GrPrimitiveType type, | 470 void GrDrawTarget::drawIndexed(GrPrimitiveType type, |
| 463 int startVertex, | 471 int startVertex, |
| 464 int startIndex, | 472 int startIndex, |
| 465 int vertexCount, | 473 int vertexCount, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 if (!this->setupDstReadIfNecessary(&info)) { | 519 if (!this->setupDstReadIfNecessary(&info)) { |
| 512 return; | 520 return; |
| 513 } | 521 } |
| 514 this->onDraw(info); | 522 this->onDraw(info); |
| 515 } | 523 } |
| 516 } | 524 } |
| 517 | 525 |
| 518 void GrDrawTarget::stencilPath(const GrPath* path, const SkStrokeRec& stroke, Sk
Path::FillType fill) { | 526 void GrDrawTarget::stencilPath(const GrPath* path, const SkStrokeRec& stroke, Sk
Path::FillType fill) { |
| 519 // TODO: extract portions of checkDraw that are relevant to path stenciling. | 527 // TODO: extract portions of checkDraw that are relevant to path stenciling. |
| 520 SkASSERT(NULL != path); | 528 SkASSERT(NULL != path); |
| 521 SkASSERT(this->caps()->pathStencilingSupport()); | 529 SkASSERT(this->caps()->pathRenderingSupport()); |
| 522 SkASSERT(!stroke.isHairlineStyle()); | 530 SkASSERT(!stroke.isHairlineStyle()); |
| 523 SkASSERT(!SkPath::IsInverseFillType(fill)); | 531 SkASSERT(!SkPath::IsInverseFillType(fill)); |
| 524 this->onStencilPath(path, stroke, fill); | 532 this->onStencilPath(path, stroke, fill); |
| 525 } | 533 } |
| 526 | 534 |
| 535 void GrDrawTarget::fillPath(const GrPath* path, const SkStrokeRec& stroke, SkPat
h::FillType fill) { |
| 536 // TODO: extract portions of checkDraw that are relevant to path rendering. |
| 537 SkASSERT(NULL != path); |
| 538 SkASSERT(this->caps()->pathRenderingSupport()); |
| 539 SkASSERT(!stroke.isHairlineStyle()); |
| 540 const GrDrawState* drawState = &getDrawState(); |
| 541 |
| 542 SkRect devBounds; |
| 543 if (SkPath::IsInverseFillType(fill)) { |
| 544 devBounds = SkRect::MakeWH(SkIntToScalar(drawState->getRenderTarget()->w
idth()), |
| 545 SkIntToScalar(drawState->getRenderTarget()->h
eight())); |
| 546 } else { |
| 547 devBounds = path->getBounds(); |
| 548 } |
| 549 SkMatrix viewM = drawState->getViewMatrix(); |
| 550 viewM.mapRect(&devBounds); |
| 551 |
| 552 GrDeviceCoordTexture dstCopy; |
| 553 if (!this->setupDstReadIfNecessary(&dstCopy, &devBounds)) { |
| 554 return; |
| 555 } |
| 556 |
| 557 this->onFillPath(path, stroke, fill, dstCopy.texture() ? &dstCopy : NULL); |
| 558 } |
| 559 |
| 527 //////////////////////////////////////////////////////////////////////////////// | 560 //////////////////////////////////////////////////////////////////////////////// |
| 528 | 561 |
| 529 bool GrDrawTarget::willUseHWAALines() const { | 562 bool GrDrawTarget::willUseHWAALines() const { |
| 530 // There is a conflict between using smooth lines and our use of premultipli
ed alpha. Smooth | 563 // There is a conflict between using smooth lines and our use of premultipli
ed alpha. Smooth |
| 531 // lines tweak the incoming alpha value but not in a premul-alpha way. So we
only use them when | 564 // lines tweak the incoming alpha value but not in a premul-alpha way. So we
only use them when |
| 532 // our alpha is 0xff and tweaking the color for partial coverage is OK | 565 // our alpha is 0xff and tweaking the color for partial coverage is OK |
| 533 if (!this->caps()->hwAALineSupport() || | 566 if (!this->caps()->hwAALineSupport() || |
| 534 !this->getDrawState().isHWAntialiasState()) { | 567 !this->getDrawState().isHWAntialiasState()) { |
| 535 return false; | 568 return false; |
| 536 } | 569 } |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 942 void GrDrawTargetCaps::reset() { | 975 void GrDrawTargetCaps::reset() { |
| 943 f8BitPaletteSupport = false; | 976 f8BitPaletteSupport = false; |
| 944 fNPOTTextureTileSupport = false; | 977 fNPOTTextureTileSupport = false; |
| 945 fTwoSidedStencilSupport = false; | 978 fTwoSidedStencilSupport = false; |
| 946 fStencilWrapOpsSupport = false; | 979 fStencilWrapOpsSupport = false; |
| 947 fHWAALineSupport = false; | 980 fHWAALineSupport = false; |
| 948 fShaderDerivativeSupport = false; | 981 fShaderDerivativeSupport = false; |
| 949 fGeometryShaderSupport = false; | 982 fGeometryShaderSupport = false; |
| 950 fDualSourceBlendingSupport = false; | 983 fDualSourceBlendingSupport = false; |
| 951 fBufferLockSupport = false; | 984 fBufferLockSupport = false; |
| 952 fPathStencilingSupport = false; | 985 fPathRenderingSupport = false; |
| 953 fDstReadInShaderSupport = false; | 986 fDstReadInShaderSupport = false; |
| 954 fReuseScratchTextures = true; | 987 fReuseScratchTextures = true; |
| 955 | 988 |
| 956 fMaxRenderTargetSize = 0; | 989 fMaxRenderTargetSize = 0; |
| 957 fMaxTextureSize = 0; | 990 fMaxTextureSize = 0; |
| 958 fMaxSampleCount = 0; | 991 fMaxSampleCount = 0; |
| 959 } | 992 } |
| 960 | 993 |
| 961 GrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { | 994 GrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { |
| 962 f8BitPaletteSupport = other.f8BitPaletteSupport; | 995 f8BitPaletteSupport = other.f8BitPaletteSupport; |
| 963 fNPOTTextureTileSupport = other.fNPOTTextureTileSupport; | 996 fNPOTTextureTileSupport = other.fNPOTTextureTileSupport; |
| 964 fTwoSidedStencilSupport = other.fTwoSidedStencilSupport; | 997 fTwoSidedStencilSupport = other.fTwoSidedStencilSupport; |
| 965 fStencilWrapOpsSupport = other.fStencilWrapOpsSupport; | 998 fStencilWrapOpsSupport = other.fStencilWrapOpsSupport; |
| 966 fHWAALineSupport = other.fHWAALineSupport; | 999 fHWAALineSupport = other.fHWAALineSupport; |
| 967 fShaderDerivativeSupport = other.fShaderDerivativeSupport; | 1000 fShaderDerivativeSupport = other.fShaderDerivativeSupport; |
| 968 fGeometryShaderSupport = other.fGeometryShaderSupport; | 1001 fGeometryShaderSupport = other.fGeometryShaderSupport; |
| 969 fDualSourceBlendingSupport = other.fDualSourceBlendingSupport; | 1002 fDualSourceBlendingSupport = other.fDualSourceBlendingSupport; |
| 970 fBufferLockSupport = other.fBufferLockSupport; | 1003 fBufferLockSupport = other.fBufferLockSupport; |
| 971 fPathStencilingSupport = other.fPathStencilingSupport; | 1004 fPathRenderingSupport = other.fPathRenderingSupport; |
| 972 fDstReadInShaderSupport = other.fDstReadInShaderSupport; | 1005 fDstReadInShaderSupport = other.fDstReadInShaderSupport; |
| 973 fReuseScratchTextures = other.fReuseScratchTextures; | 1006 fReuseScratchTextures = other.fReuseScratchTextures; |
| 974 | 1007 |
| 975 fMaxRenderTargetSize = other.fMaxRenderTargetSize; | 1008 fMaxRenderTargetSize = other.fMaxRenderTargetSize; |
| 976 fMaxTextureSize = other.fMaxTextureSize; | 1009 fMaxTextureSize = other.fMaxTextureSize; |
| 977 fMaxSampleCount = other.fMaxSampleCount; | 1010 fMaxSampleCount = other.fMaxSampleCount; |
| 978 | 1011 |
| 979 return *this; | 1012 return *this; |
| 980 } | 1013 } |
| 981 | 1014 |
| 982 void GrDrawTargetCaps::print() const { | 1015 void GrDrawTargetCaps::print() const { |
| 983 static const char* gNY[] = {"NO", "YES"}; | 1016 static const char* gNY[] = {"NO", "YES"}; |
| 984 GrPrintf("8 Bit Palette Support : %s\n", gNY[f8BitPaletteSupport]); | 1017 GrPrintf("8 Bit Palette Support : %s\n", gNY[f8BitPaletteSupport]); |
| 985 GrPrintf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport])
; | 1018 GrPrintf("NPOT Texture Tile Support : %s\n", gNY[fNPOTTextureTileSupport])
; |
| 986 GrPrintf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport])
; | 1019 GrPrintf("Two Sided Stencil Support : %s\n", gNY[fTwoSidedStencilSupport])
; |
| 987 GrPrintf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]); | 1020 GrPrintf("Stencil Wrap Ops Support : %s\n", gNY[fStencilWrapOpsSupport]); |
| 988 GrPrintf("HW AA Lines Support : %s\n", gNY[fHWAALineSupport]); | 1021 GrPrintf("HW AA Lines Support : %s\n", gNY[fHWAALineSupport]); |
| 989 GrPrintf("Shader Derivative Support : %s\n", gNY[fShaderDerivativeSupport]
); | 1022 GrPrintf("Shader Derivative Support : %s\n", gNY[fShaderDerivativeSupport]
); |
| 990 GrPrintf("Geometry Shader Support : %s\n", gNY[fGeometryShaderSupport]); | 1023 GrPrintf("Geometry Shader Support : %s\n", gNY[fGeometryShaderSupport]); |
| 991 GrPrintf("Dual Source Blending Support: %s\n", gNY[fDualSourceBlendingSuppor
t]); | 1024 GrPrintf("Dual Source Blending Support: %s\n", gNY[fDualSourceBlendingSuppor
t]); |
| 992 GrPrintf("Buffer Lock Support : %s\n", gNY[fBufferLockSupport]); | 1025 GrPrintf("Buffer Lock Support : %s\n", gNY[fBufferLockSupport]); |
| 993 GrPrintf("Path Stenciling Support : %s\n", gNY[fPathStencilingSupport]); | 1026 GrPrintf("Path Rendering Support : %s\n", gNY[fPathRenderingSupport]); |
| 994 GrPrintf("Dst Read In Shader Support : %s\n", gNY[fDstReadInShaderSupport])
; | 1027 GrPrintf("Dst Read In Shader Support : %s\n", gNY[fDstReadInShaderSupport])
; |
| 995 GrPrintf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]); | 1028 GrPrintf("Reuse Scratch Textures : %s\n", gNY[fReuseScratchTextures]); |
| 996 GrPrintf("Max Texture Size : %d\n", fMaxTextureSize); | 1029 GrPrintf("Max Texture Size : %d\n", fMaxTextureSize); |
| 997 GrPrintf("Max Render Target Size : %d\n", fMaxRenderTargetSize); | 1030 GrPrintf("Max Render Target Size : %d\n", fMaxRenderTargetSize); |
| 998 GrPrintf("Max Sample Count : %d\n", fMaxSampleCount); | 1031 GrPrintf("Max Sample Count : %d\n", fMaxSampleCount); |
| 999 } | 1032 } |
| OLD | NEW |