| Index: tests/GLProgramsTest.cpp
|
| ===================================================================
|
| --- tests/GLProgramsTest.cpp (revision 8462)
|
| +++ tests/GLProgramsTest.cpp (working copy)
|
| @@ -24,18 +24,30 @@
|
| void GrGLProgramDesc::setRandom(SkMWCRandom* random,
|
| const GrGpuGL* gpu,
|
| const GrTexture* dstTexture,
|
| - 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
|
| @@ -48,18 +60,14 @@
|
| 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;
|
|
|
| bool dstRead = false;
|
| 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());
|
| if ((*stages[s].getEffect())->willReadDst()) {
|
| dstRead = true;
|
| @@ -70,22 +78,6 @@
|
| if (dstRead) {
|
| this->fDstRead = GrGLShaderBuilder::KeyForDstRead(dstTexture, 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) {
|
| @@ -118,7 +110,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];
|
| GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
|
| for (int s = 0; s < maxStages; ++s) {
|
| @@ -131,10 +123,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;
|
| }
|
| @@ -145,8 +136,8 @@
|
| }
|
| }
|
| const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1];
|
| - pdesc.setRandom(&random, this, dstTexture, stages);
|
| -
|
| + pdesc.setRandom(&random, this, dstTexture, stages, currAttribIndex);
|
| +
|
| const GrEffectStage* stagePtrs[GrDrawState::kNumStages];
|
| for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
| stagePtrs[s] = &stages[s];
|
|
|