diff options
Diffstat (limited to 'tests/GLProgramsTest.cpp')
-rw-r--r-- | tests/GLProgramsTest.cpp | 63 |
1 files changed, 27 insertions, 36 deletions
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp index 512f89ecf2..675d0c1cb4 100644 --- a/tests/GLProgramsTest.cpp +++ b/tests/GLProgramsTest.cpp @@ -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 @@ void GrGLProgramDesc::setRandom(SkMWCRandom* random, 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 @@ void GrGLProgramDesc::setRandom(SkMWCRandom* random, 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 @@ bool GrGpuGL::programUnitTest(int maxStages) { 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 @@ bool GrGpuGL::programUnitTest(int maxStages) { 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 @@ bool GrGpuGL::programUnitTest(int maxStages) { } } 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]; |