Index: tests/GLProgramsTest.cpp |
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp |
index af280466ae12d2aad060e24fa74473b53711a9d3..6efd7d5b5b3835bb40b7b711e55fd9d1eca1c371 100644 |
--- a/tests/GLProgramsTest.cpp |
+++ b/tests/GLProgramsTest.cpp |
@@ -26,6 +26,7 @@ bool GrGLProgramDesc::setRandom(SkRandom* random, |
const GrGpuGL* gpu, |
const GrRenderTarget* dstRenderTarget, |
const GrTexture* dstCopyTexture, |
+ const GrEffectStage* geometryProcessor, |
const GrEffectStage* stages[], |
int numColorStages, |
int numCoverageStages, |
@@ -38,24 +39,50 @@ bool GrGLProgramDesc::setRandom(SkRandom* random, |
GR_STATIC_ASSERT(0 == kEffectKeyOffsetsAndLengthOffset % sizeof(uint32_t)); |
// Make room for everything up to and including the array of offsets to effect keys. |
- fKey.push_back_n(kEffectKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_t) * numStages); |
+ fKey.push_back_n(kEffectKeyOffsetsAndLengthOffset + 2 * sizeof(uint16_t) * (numStages + |
+ (geometryProcessor ? 1 : 0))); |
bool dstRead = false; |
bool fragPos = false; |
- bool vertexShader = false; |
- for (int s = 0; s < numStages; ++s) { |
+ bool vertexShader = (NULL != geometryProcessor); |
+ int offset = 0; |
+ if (NULL != geometryProcessor) { |
+ const GrEffectStage* stage = geometryProcessor; |
uint16_t* offsetAndSize = reinterpret_cast<uint16_t*>(fKey.begin() + |
kEffectKeyOffsetsAndLengthOffset + |
- s * 2 * sizeof(uint16_t)); |
+ offset * 2 * sizeof(uint16_t)); |
uint32_t effectKeyOffset = fKey.count(); |
if (effectKeyOffset > SK_MaxU16) { |
fKey.reset(); |
return false; |
} |
- GrDrawEffect drawEffect(*stages[s], useLocalCoords); |
+ GrDrawEffect drawEffect(*stage, useLocalCoords); |
GrEffectKeyBuilder b(&fKey); |
uint16_t effectKeySize; |
- if (!GetEffectKeyAndUpdateStats(*stages[s], gpu->glCaps(), useLocalCoords, &b, |
+ if (!GetEffectKeyAndUpdateStats(*stage, gpu->glCaps(), useLocalCoords, &b, |
+ &effectKeySize, &dstRead, &fragPos, &vertexShader)) { |
+ fKey.reset(); |
+ return false; |
+ } |
+ offsetAndSize[0] = effectKeyOffset; |
+ offsetAndSize[1] = effectKeySize; |
+ offset++; |
+ } |
+ |
+ for (int s = 0; s < numStages; ++s, ++offset) { |
+ const GrEffectStage* stage = stages[s]; |
+ uint16_t* offsetAndSize = reinterpret_cast<uint16_t*>(fKey.begin() + |
+ kEffectKeyOffsetsAndLengthOffset + |
+ offset * 2 * sizeof(uint16_t)); |
+ uint32_t effectKeyOffset = fKey.count(); |
+ if (effectKeyOffset > SK_MaxU16) { |
+ fKey.reset(); |
+ return false; |
+ } |
+ GrDrawEffect drawEffect(*stage, useLocalCoords); |
+ GrEffectKeyBuilder b(&fKey); |
+ uint16_t effectKeySize; |
+ if (!GetEffectKeyAndUpdateStats(*stage, gpu->glCaps(), useLocalCoords, &b, |
&effectKeySize, &dstRead, &fragPos, &vertexShader)) { |
fKey.reset(); |
return false; |
@@ -118,6 +145,7 @@ bool GrGLProgramDesc::setRandom(SkRandom* random, |
useLocalCoords || |
kAttribute_ColorInput == header->fColorInput || |
kAttribute_ColorInput == header->fCoverageInput; |
+ header->fHasGeometryProcessor = vertexShader; |
CoverageOutput coverageOutput; |
bool illegalCoverageOutput; |
@@ -179,8 +207,35 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
SkAutoSTMalloc<8, const GrEffectStage*> stages(numStages); |
bool useFixedFunctionPathRendering = this->glCaps().pathRenderingSupport() && |
- this->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunction_TexturingMode; |
+ this->glPathRendering()->texturingMode() == GrGLPathRendering::FixedFunction_TexturingMode && |
+ random.nextBool(); |
+ |
+ SkAutoTDelete<GrEffectStage> geometryProcessor; |
+ bool hasGeometryProcessor = useFixedFunctionPathRendering ? false : random.nextBool(); |
+ if (hasGeometryProcessor) { |
+ while (true) { |
+ SkAutoTUnref<const GrEffect> effect(GrEffectTestFactory::CreateStage( |
+ &random, |
+ this->getContext(), |
+ *this->caps(), |
+ dummyTextures)); |
+ SkASSERT(effect); |
+ |
+ // Only geometryProcessor can use vertex shader |
+ if (!effect->requiresVertexShader()) { |
+ continue; |
+ } |
+ int numAttribs = effect->numVertexAttribs(); |
+ for (int i = 0; i < numAttribs; ++i) { |
+ attribIndices[i] = currAttribIndex++; |
+ } |
+ GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, |
+ (effect.get(), attribIndices[0], attribIndices[1])); |
+ geometryProcessor.reset(stage); |
+ break; |
+ } |
+ } |
for (int s = 0; s < numStages;) { |
SkAutoTUnref<const GrEffect> effect(GrEffectTestFactory::CreateStage( |
&random, |
@@ -188,32 +243,24 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
*this->caps(), |
dummyTextures)); |
SkASSERT(effect); |
- int numAttribs = effect->numVertexAttribs(); |
- // If adding this effect would exceed the max attrib count then generate a |
- // new random effect. |
- if (currAttribIndex + numAttribs > GrDrawState::kMaxVertexAttribCnt) { |
+ // Only geometryProcessor can use vertex shader |
+ if (effect->requiresVertexShader()) { |
continue; |
} |
- |
// If adding this effect would exceed the max texture coord set count then generate a |
// new random effect. |
- if (useFixedFunctionPathRendering && !effect->requiresVertexShader()) { |
+ if (useFixedFunctionPathRendering) { |
int numTransforms = effect->numTransforms(); |
if (currTextureCoordSet + numTransforms > this->glCaps().maxFixedFunctionTextureCoords()) { |
continue; |
} |
currTextureCoordSet += numTransforms; |
} |
- |
- useFixedFunctionPathRendering = useFixedFunctionPathRendering && !effect->requiresVertexShader(); |
- |
- for (int i = 0; i < numAttribs; ++i) { |
- attribIndices[i] = currAttribIndex++; |
- } |
GrEffectStage* stage = SkNEW_ARGS(GrEffectStage, |
(effect.get(), attribIndices[0], attribIndices[1])); |
+ |
stages[s] = stage; |
++s; |
} |
@@ -222,6 +269,7 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
this, |
dummyTextures[0]->asRenderTarget(), |
dstTexture, |
+ geometryProcessor.get(), |
stages.get(), |
numColorStages, |
numCoverageStages, |
@@ -231,6 +279,7 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this, |
pdesc, |
+ geometryProcessor.get(), |
stages, |
stages + numColorStages)); |
for (int s = 0; s < numStages; ++s) { |