GrXferBarrierType GrXferProcessor::xferBarrierType(const GrRenderTarget* rt, const GrCaps& caps) const { SkASSERT(rt); if (static_cast<const GrSurface*>(rt) == this->getDstTexture()) { // Texture barriers are required when a shader reads and renders to the same texture. SkASSERT(caps.textureBarrierSupport()); return kTexture_GrXferBarrierType; } return this->onXferBarrier(rt, caps); }
GrXPFactory::AnalysisProperties GrXPFactory::GetAnalysisProperties( const GrXPFactory* factory, const GrProcessorAnalysisColor& color, const GrProcessorAnalysisCoverage& coverage, const GrCaps& caps) { AnalysisProperties result; if (factory) { result = factory->analysisProperties(color, coverage, caps); } else { result = GrPorterDuffXPFactory::SrcOverAnalysisProperties(color, coverage, caps); } SkASSERT(!(result & AnalysisProperties::kRequiresDstTexture)); if ((result & AnalysisProperties::kReadsDstInShader) && !caps.shaderCaps()->dstReadInShaderSupport()) { result |= AnalysisProperties::kRequiresDstTexture; if (caps.textureBarrierSupport()) { result |= AnalysisProperties::kRequiresBarrierBetweenOverlappingDraws; } } return result; }