separate coverage stages from color stages.
Review URL: http://codereview.appspot.com/4538064/
git-svn-id: http://skia.googlecode.com/svn/trunk@1339 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp
index 125b820..bcf29ae 100644
--- a/gpu/src/GrGpuGLShaders.cpp
+++ b/gpu/src/GrGpuGLShaders.cpp
@@ -169,6 +169,14 @@
GrRandom random;
for (int t = 0; t < NUM_TESTS; ++t) {
+#if 0
+ GrPrintf("\nTest Program %d\n-------------\n", t);
+ static const int stop = -1;
+ if (t == stop) {
+ int breakpointhere = 9;
+ }
+#endif
+
pdesc.fVertexLayout = 0;
pdesc.fEmitsPointSize = random.nextF() > .5f;
float colorType = random.nextF();
@@ -179,6 +187,15 @@
} else {
pdesc.fColorType = GrGLProgram::ProgramDesc::kNone_ColorType;
}
+
+ int idx = (int)(random.nextF() * (SkXfermode::kCoeffModesCnt));
+ pdesc.fColorFilterXfermode = (SkXfermode::Mode)idx;
+
+ idx = (int)(random.nextF() * (kNumStages+1));
+ pdesc.fFirstCoverageStage = idx;
+
+ pdesc.fUsesEdgeAA = (random.nextF() > .5f);
+
for (int s = 0; s < kNumStages; ++s) {
// enable the stage?
if (random.nextF() > .5f) {
@@ -194,19 +211,15 @@
if (random.nextF() > .5f) {
pdesc.fVertexLayout |= kTextFormat_VertexLayoutBit;
}
- }
-
- for (int s = 0; s < kNumStages; ++s) {
- int x;
pdesc.fStages[s].fEnabled = VertexUsesStage(s, pdesc.fVertexLayout);
- x = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_OPTS));
- pdesc.fStages[s].fOptFlags = STAGE_OPTS[x];
- x = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_MODULATES));
- pdesc.fStages[s].fModulation = STAGE_MODULATES[x];
- x = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_COORD_MAPPINGS));
- pdesc.fStages[s].fCoordMapping = STAGE_COORD_MAPPINGS[x];
- x = (int)(random.nextF() * GR_ARRAY_COUNT(FETCH_MODES));
- pdesc.fStages[s].fFetchMode = FETCH_MODES[x];
+ idx = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_OPTS));
+ pdesc.fStages[s].fOptFlags = STAGE_OPTS[idx];
+ idx = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_MODULATES));
+ pdesc.fStages[s].fModulation = STAGE_MODULATES[idx];
+ idx = (int)(random.nextF() * GR_ARRAY_COUNT(STAGE_COORD_MAPPINGS));
+ pdesc.fStages[s].fCoordMapping = STAGE_COORD_MAPPINGS[idx];
+ idx = (int)(random.nextF() * GR_ARRAY_COUNT(FETCH_MODES));
+ pdesc.fStages[s].fFetchMode = FETCH_MODES[idx];
}
GrGLProgram::CachedData cachedData;
program.genProgram(&cachedData);
@@ -219,7 +232,6 @@
}
}
-
GrGpuGLShaders::GrGpuGLShaders() {
resetContext();
@@ -668,6 +680,18 @@
// existing program in the cache.
desc.fVertexLayout &= ~(kColor_VertexLayoutBit);
+ desc.fColorFilterXfermode = fCurrDrawState.fColorFilterXfermode;
+
+ // coverage vs. color only applies when there is a color filter
+ // (currently)
+ if (SkXfermode::kDst_Mode != desc.fColorFilterXfermode) {
+ desc.fFirstCoverageStage = fCurrDrawState.fFirstCoverageStage;
+ } else {
+ // use canonical value when this won't affect generated
+ // code to prevent duplicate programs.
+ desc.fFirstCoverageStage = kNumStages;
+ }
+
#if GR_AGGRESSIVE_SHADER_OPTS
if (!requiresAttributeColors && (0xffffffff == fCurrDrawState.fColor)) {
desc.fColorType = GrGLProgram::ProgramDesc::kNone_ColorType;
@@ -764,7 +788,6 @@
fCurrentProgram.fStageEffects[s] = NULL;
}
}
- desc.fColorFilterXfermode = fCurrDrawState.fColorFilterXfermode;
}