aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/GLProgramsTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/GLProgramsTest.cpp')
-rw-r--r--tests/GLProgramsTest.cpp63
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];