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

Unified Diff: src/gpu/GrXferProcessor.cpp

Issue 1164973002: Add mixed samples support to XPs (Closed) Base URL: https://skia.googlesource.com/skia.git@upload2_reenablebea
Patch Set: Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: src/gpu/GrXferProcessor.cpp
diff --git a/src/gpu/GrXferProcessor.cpp b/src/gpu/GrXferProcessor.cpp
index e771f643c7fbfaa46f8348cd2846e6b1e1e29a9a..31ab60661186a2a6dc6f5463f3465138e2487b28 100644
--- a/src/gpu/GrXferProcessor.cpp
+++ b/src/gpu/GrXferProcessor.cpp
@@ -6,17 +6,25 @@
*/
#include "GrXferProcessor.h"
+#include "GrPipelineBuilder.h"
#include "gl/GrGLCaps.h"
GrXferProcessor::GrXferProcessor()
- : fWillReadDstColor(false), fReadsCoverage(true), fDstTextureOffset() {
+ : fWillReadDstColor(false)
+ , fDstReadUsesMixedSamples(false)
+ , fReadsCoverage(true)
+ , fDstTextureOffset() {
}
-GrXferProcessor::GrXferProcessor(const DstTexture* dstTexture, bool willReadDstColor)
+GrXferProcessor::GrXferProcessor(const GrPipelineBuilder& builder,
+ const DstTexture* dstTexture,
+ bool willReadDstColor)
: fWillReadDstColor(willReadDstColor)
+ , fDstReadUsesMixedSamples(willReadDstColor && builder.hasMixedSamples())
, fReadsCoverage(true)
, fDstTextureOffset() {
if (dstTexture && dstTexture->texture()) {
+ SkASSERT(willReadDstColor);
fDstTexture.reset(dstTexture->texture());
fDstTextureOffset = dstTexture->offset();
this->addTextureAccess(&fDstTexture);
@@ -41,12 +49,31 @@ GrXferProcessor::OptFlags GrXferProcessor::getOptimizations(const GrProcOptInfo&
return flags;
}
+bool GrXferProcessor::hasSecondaryOutput() const {
+ if (!this->willReadDstColor()) {
+ return this->onHasSecondaryOutput();
+ }
+ return this->dstReadUsesMixedSamples();
+}
+
+void GrXferProcessor::getBlendInfo(BlendInfo* blendInfo) const {
+ blendInfo->reset();
+ if (!this->willReadDstColor()) {
+ this->onGetBlendInfo(blendInfo);
+ } else if (this->dstReadUsesMixedSamples()) {
+ blendInfo->fDstBlend = kIS2A_GrBlendCoeff;
+ }
+}
+
void GrXferProcessor::getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) const {
uint32_t key = this->willReadDstColor() ? 0x1 : 0x0;
if (this->getDstTexture() &&
kTopLeft_GrSurfaceOrigin == this->getDstTexture()->origin()) {
key |= 0x2;
}
+ if (this->dstReadUsesMixedSamples()) {
+ key |= 0x4;
+ }
b->add32(key);
this->onGetGLProcessorKey(caps, b);
}
@@ -160,12 +187,13 @@ SkString GrXferProcessor::BlendInfo::dump() const {
///////////////////////////////////////////////////////////////////////////////
-GrXferProcessor* GrXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI,
+GrXferProcessor* GrXPFactory::createXferProcessor(const GrPipelineBuilder& builder,
+ const GrProcOptInfo& colorPOI,
const GrProcOptInfo& coveragePOI,
const DstTexture* dstTexture,
const GrCaps& caps) const {
#ifdef SK_DEBUG
- if (this->willReadDstColor(caps, colorPOI, coveragePOI)) {
+ if (this->willReadDstColor(caps, builder, colorPOI, coveragePOI)) {
if (!caps.shaderCaps()->dstReadInShaderSupport()) {
SkASSERT(dstTexture && dstTexture->texture());
} else {
@@ -174,12 +202,15 @@ GrXferProcessor* GrXPFactory::createXferProcessor(const GrProcOptInfo& colorPOI,
} else {
SkASSERT(!dstTexture || !dstTexture->texture());
}
+ SkASSERT(!builder.hasMixedSamples() || caps.shaderCaps()->dualSourceBlendingSupport());
#endif
- return this->onCreateXferProcessor(caps, colorPOI, coveragePOI, dstTexture);
+ return this->onCreateXferProcessor(caps, builder, colorPOI, coveragePOI, dstTexture);
}
-bool GrXPFactory::willNeedDstTexture(const GrCaps& caps, const GrProcOptInfo& colorPOI,
- const GrProcOptInfo& coveragePOI) const {
- return (this->willReadDstColor(caps, colorPOI, coveragePOI)
- && !caps.shaderCaps()->dstReadInShaderSupport());
+bool GrXPFactory::willNeedDstTexture(const GrCaps& caps,
+ const GrPipelineBuilder& builder,
+ const GrProcOptInfo& colorPOI,
+ const GrProcOptInfo& coveragePOI) const {
+ return (this->willReadDstColor(caps, builder, colorPOI, coveragePOI) &&
+ !caps.shaderCaps()->dstReadInShaderSupport());
}

Powered by Google App Engine
This is Rietveld 408576698