| Index: tests/GLProgramsTest.cpp
|
| ===================================================================
|
| --- tests/GLProgramsTest.cpp (revision 8436)
|
| +++ tests/GLProgramsTest.cpp (working copy)
|
| @@ -23,18 +23,30 @@
|
|
|
| void GrGLProgramDesc::setRandom(SkMWCRandom* random,
|
| const GrGpuGL* gpu,
|
| - const GrEffectStage stages[GrDrawState::kNumStages]) {
|
| - fAttribBindings = 0;
|
| + const GrEffectStage stages[GrDrawState::kNumStages],
|
| + int currAttribIndex) {
|
| fEmitsPointSize = random->nextBool();
|
| - fColorInput = random->nextULessThan(kColorInputCnt);
|
| - fCoverageInput = random->nextULessThan(kColorInputCnt);
|
|
|
| + fPositionAttributeIndex = 0;
|
| +
|
| + // if the effects have used up all off the available attributes,
|
| + // don't try to use color or coverage attributes as input
|
| + do {
|
| + fColorInput = random->nextULessThan(kColorInputCnt);
|
| + } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex &&
|
| + kAttribute_ColorInput == fColorInput);
|
| + fColorAttributeIndex = (fColorInput == kAttribute_ColorInput) ? currAttribIndex++ : -1;
|
| +
|
| + do {
|
| + fCoverageInput = random->nextULessThan(kColorInputCnt);
|
| + } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex &&
|
| + kAttribute_ColorInput == fCoverageInput);
|
| + fCoverageAttributeIndex = (fCoverageInput == kAttribute_ColorInput) ? currAttribIndex++ : -1;
|
| +
|
| fColorFilterXfermode = random->nextULessThan(SkXfermode::kCoeffModesCnt);
|
|
|
| fFirstCoverageStage = random->nextULessThan(GrDrawState::kNumStages);
|
|
|
| - fAttribBindings |= random->nextBool() ? GrDrawState::kCoverage_AttribBindingsBit : 0;
|
| -
|
| #if GR_GL_EXPERIMENTAL_GS
|
| fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool();
|
| #endif
|
| @@ -47,36 +59,16 @@
|
| fDualSrcOutput = kNone_DualSrcOutput;
|
| }
|
|
|
| - // use separate tex coords?
|
| - if (random->nextBool()) {
|
| - fAttribBindings |= GrDrawState::kLocalCoords_AttribBindingsBit;
|
| - }
|
| + bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt;
|
| + fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1;
|
|
|
| for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
| if (NULL != stages[s].getEffect()) {
|
| const GrBackendEffectFactory& factory = (*stages[s].getEffect())->getFactory();
|
| - bool explicitLocalCoords = (fAttribBindings &
|
| - GrDrawState::kLocalCoords_AttribBindingsBit);
|
| - GrDrawEffect drawEffect(stages[s], explicitLocalCoords);
|
| + GrDrawEffect drawEffect(stages[s], useLocalCoords);
|
| fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
|
| }
|
| }
|
| -
|
| - int attributeIndex = 0;
|
| - fPositionAttributeIndex = attributeIndex;
|
| - ++attributeIndex;
|
| - if (fColorInput || (fAttribBindings & GrDrawState::kColor_AttribBindingsBit)) {
|
| - fColorAttributeIndex = attributeIndex;
|
| - ++attributeIndex;
|
| - }
|
| - if (fCoverageInput || (fAttribBindings & GrDrawState::kCoverage_AttribBindingsBit)) {
|
| - fCoverageAttributeIndex = attributeIndex;
|
| - ++attributeIndex;
|
| - }
|
| - if (fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) {
|
| - fLocalCoordsAttributeIndex = attributeIndex;
|
| - ++attributeIndex;
|
| - }
|
| }
|
|
|
| bool GrGpuGL::programUnitTest(int maxStages) {
|
| @@ -109,7 +101,7 @@
|
| GrGLProgramDesc pdesc;
|
| GrEffectStage stages[GrDrawState::kNumStages];
|
|
|
| - int currAttribIndex = GrDrawState::kAttribIndexCount;
|
| + int currAttribIndex = 1; // we need to always leave room for position
|
| int attribIndices[2];
|
| for (int s = 0; s < maxStages; ++s) {
|
| // enable the stage?
|
| @@ -122,10 +114,9 @@
|
| dummyTextures));
|
| int numAttribs = (*effect)->numVertexAttribs();
|
|
|
| - // If adding this effect would cause to exceed the max attrib count then generate a
|
| - // new random effect. The explanation for why this check is correct is a bit
|
| - // convoluted and this code will be removed soon.
|
| - if (currAttribIndex + numAttribs > GrDrawState::kCoverageOverrideAttribIndexValue) {
|
| + // If adding this effect would exceed the max attrib count then generate a
|
| + // new random effect.
|
| + if (currAttribIndex + numAttribs > GrDrawState::kMaxVertexAttribCnt) {
|
| --s;
|
| continue;
|
| }
|
| @@ -135,7 +126,7 @@
|
| stages[s].setEffect(effect.get(), attribIndices[0], attribIndices[1]);
|
| }
|
| }
|
| - pdesc.setRandom(&random, this, stages);
|
| + pdesc.setRandom(&random, this, stages, currAttribIndex);
|
|
|
| const GrEffectStage* stagePtrs[GrDrawState::kNumStages];
|
| for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
|
|