aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkXfermode.cpp21
-rw-r--r--src/gpu/gl/GrGLProgramDesc.h1
-rw-r--r--tests/GLProgramsTest.cpp14
3 files changed, 27 insertions, 9 deletions
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 705faf8e88..6f22aa43a6 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -984,13 +984,20 @@ public:
const TextureSamplerArray& samplers) SK_OVERRIDE {
const char* dstColorName = builder->dstColor();
GrAssert(NULL != dstColorName);
- builder->fsCodeAppendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.a);\n",
- outputColor, dstColorName, inputColor);
- builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb,"
- " (1.0 - %s.a) * %s.rgb + %s.rgb);\n",
- outputColor,
- inputColor, dstColorName, inputColor,
- dstColorName, inputColor, dstColorName);
+ if (NULL == inputColor) {
+ // the input color is solid white
+ builder->fsCodeAppendf("\t\t%s.a = 1.0;\n", outputColor);
+ builder->fsCodeAppendf("\t\t%s.rgb = vec3(1.0, 1.0, 1.0) - %s.aaa + %s.rgb;\n",
+ outputColor, dstColorName, dstColorName);
+ } else {
+ builder->fsCodeAppendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.a);\n",
+ outputColor, dstColorName, inputColor);
+ builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb,"
+ " (1.0 - %s.a) * %s.rgb + %s.rgb);\n",
+ outputColor,
+ inputColor, dstColorName, inputColor,
+ dstColorName, inputColor, dstColorName);
+ }
}
static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) { return 0; }
diff --git a/src/gpu/gl/GrGLProgramDesc.h b/src/gpu/gl/GrGLProgramDesc.h
index b1660d8585..df5729fb18 100644
--- a/src/gpu/gl/GrGLProgramDesc.h
+++ b/src/gpu/gl/GrGLProgramDesc.h
@@ -38,6 +38,7 @@ public:
// For unit testing.
void setRandom(SkMWCRandom*,
const GrGpuGL* gpu,
+ const GrTexture* dummyDstTexture,
const GrEffectStage stages[GrDrawState::kNumStages]);
/**
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
index 13cf85c81d..512f89ecf2 100644
--- a/tests/GLProgramsTest.cpp
+++ b/tests/GLProgramsTest.cpp
@@ -23,6 +23,7 @@
void GrGLProgramDesc::setRandom(SkMWCRandom* random,
const GrGpuGL* gpu,
+ const GrTexture* dstTexture,
const GrEffectStage stages[GrDrawState::kNumStages]) {
fAttribBindings = 0;
fEmitsPointSize = random->nextBool();
@@ -52,6 +53,7 @@ void GrGLProgramDesc::setRandom(SkMWCRandom* random,
fAttribBindings |= GrDrawState::kLocalCoords_AttribBindingsBit;
}
+ bool dstRead = false;
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
if (NULL != stages[s].getEffect()) {
const GrBackendEffectFactory& factory = (*stages[s].getEffect())->getFactory();
@@ -59,9 +61,16 @@ void GrGLProgramDesc::setRandom(SkMWCRandom* random,
GrDrawState::kLocalCoords_AttribBindingsBit);
GrDrawEffect drawEffect(stages[s], explicitLocalCoords);
fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
+ if ((*stages[s].getEffect())->willReadDst()) {
+ dstRead = true;
+ }
}
}
+ if (dstRead) {
+ this->fDstRead = GrGLShaderBuilder::KeyForDstRead(dstTexture, gpu->glCaps());
+ }
+
int attributeIndex = 0;
fPositionAttributeIndex = attributeIndex;
++attributeIndex;
@@ -111,10 +120,10 @@ bool GrGpuGL::programUnitTest(int maxStages) {
int currAttribIndex = GrDrawState::kAttribIndexCount;
int attribIndices[2];
+ GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
for (int s = 0; s < maxStages; ++s) {
// enable the stage?
if (random.nextBool()) {
- GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
SkAutoTUnref<const GrEffectRef> effect(GrEffectTestFactory::CreateStage(
&random,
this->getContext(),
@@ -135,7 +144,8 @@ bool GrGpuGL::programUnitTest(int maxStages) {
stages[s].setEffect(effect.get(), attribIndices[0], attribIndices[1]);
}
}
- pdesc.setRandom(&random, this, stages);
+ const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1];
+ pdesc.setRandom(&random, this, dstTexture, stages);
const GrEffectStage* stagePtrs[GrDrawState::kNumStages];
for (int s = 0; s < GrDrawState::kNumStages; ++s) {