| Index: tests/GLProgramsTest.cpp
|
| diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
|
| index 73d6db2f46f484d51678ff8a5f6a07e15601d4a6..2cf21c51981d4ddd864652ebf8f7ca83619bba13 100644
|
| --- a/tests/GLProgramsTest.cpp
|
| +++ b/tests/GLProgramsTest.cpp
|
| @@ -18,59 +18,86 @@
|
| #include "GrDrawEffect.h"
|
| #include "effects/GrConfigConversionEffect.h"
|
|
|
| +#include "SkChecksum.h"
|
| #include "SkRandom.h"
|
| #include "Test.h"
|
|
|
| void GrGLProgramDesc::setRandom(SkMWCRandom* random,
|
| const GrGpuGL* gpu,
|
| - const GrTexture* dstTexture,
|
| - const GrEffectStage* stages[GrDrawState::kNumStages],
|
| + const GrRenderTarget* dstRenderTarget,
|
| + const GrTexture* dstCopyTexture,
|
| + const GrEffectStage* stages[],
|
| + int numColorStages,
|
| + int numCoverageStages,
|
| int currAttribIndex) {
|
| - fEmitsPointSize = random->nextBool();
|
| + int numEffects = numColorStages + numCoverageStages;
|
| + size_t keyLength = KeyLength(numEffects);
|
| + fKey.reset(keyLength);
|
| + *this->atOffset<uint32_t, kLengthOffset>() = static_cast<uint32_t>(keyLength);
|
| + memset(this->header(), 0, kHeaderSize);
|
|
|
| - fPositionAttributeIndex = 0;
|
| + KeyHeader* header = this->header();
|
| + header->fEmitsPointSize = random->nextBool();
|
| +
|
| + header->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);
|
| + header->fColorInput = random->nextULessThan(kColorInputCnt);
|
| } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex &&
|
| - kAttribute_ColorInput == fColorInput);
|
| - fColorAttributeIndex = (fColorInput == kAttribute_ColorInput) ? currAttribIndex++ : -1;
|
| + kAttribute_ColorInput == header->fColorInput);
|
| + header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput) ?
|
| + currAttribIndex++ :
|
| + -1;
|
|
|
| do {
|
| - fCoverageInput = random->nextULessThan(kColorInputCnt);
|
| + header->fCoverageInput = random->nextULessThan(kColorInputCnt);
|
| } while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex &&
|
| - kAttribute_ColorInput == fCoverageInput);
|
| - fCoverageAttributeIndex = (fCoverageInput == kAttribute_ColorInput) ? currAttribIndex++ : -1;
|
| -
|
| - fColorFilterXfermode = random->nextULessThan(SkXfermode::kLastCoeffMode + 1);
|
| + kAttribute_ColorInput == header->fCoverageInput);
|
| + header->fCoverageAttributeIndex = (header->fCoverageInput == kAttribute_ColorInput) ?
|
| + currAttribIndex++ :
|
| + -1;
|
|
|
| - fFirstCoverageStage = random->nextULessThan(GrDrawState::kNumStages);
|
| + header->fColorFilterXfermode = random->nextULessThan(SkXfermode::kLastCoeffMode + 1);
|
|
|
| #if GR_GL_EXPERIMENTAL_GS
|
| - fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool();
|
| + header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool();
|
| #endif
|
|
|
| - fDiscardIfZeroCoverage = random->nextBool();
|
| + header->fDiscardIfZeroCoverage = random->nextBool();
|
|
|
| bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt;
|
| - fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1;
|
| + header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1;
|
| +
|
| + header->fColorEffectCnt = numColorStages;
|
| + header->fCoverageEffectCnt = numCoverageStages;
|
|
|
| bool dstRead = false;
|
| - for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
| - if (NULL != stages[s]) {
|
| - const GrBackendEffectFactory& factory = (*stages[s]->getEffect())->getFactory();
|
| - GrDrawEffect drawEffect(*stages[s], useLocalCoords);
|
| - fEffectKeys[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
|
| - if ((*stages[s]->getEffect())->willReadDstColor()) {
|
| - dstRead = true;
|
| - }
|
| + bool fragPos = false;
|
| + int numStages = numColorStages + numCoverageStages;
|
| + for (int s = 0; s < numStages; ++s) {
|
| + const GrBackendEffectFactory& factory = (*stages[s]->getEffect())->getFactory();
|
| + GrDrawEffect drawEffect(*stages[s], useLocalCoords);
|
| + this->effectKeys()[s] = factory.glEffectKey(drawEffect, gpu->glCaps());
|
| + if ((*stages[s]->getEffect())->willReadDstColor()) {
|
| + dstRead = true;
|
| + }
|
| + if ((*stages[s]->getEffect())->willReadFragmentPosition()) {
|
| + fragPos = true;
|
| }
|
| }
|
|
|
| if (dstRead) {
|
| - this->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstTexture, gpu->glCaps());
|
| + header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, gpu->glCaps());
|
| + } else {
|
| + header->fDstReadKey = 0;
|
| + }
|
| + if (fragPos) {
|
| + header->fFragPosKey = GrGLShaderBuilder::KeyForFragmentPosition(dstRenderTarget,
|
| + gpu->glCaps());
|
| + } else {
|
| + header->fFragPosKey = 0;
|
| }
|
|
|
| CoverageOutput coverageOutput;
|
| @@ -82,7 +109,11 @@ void GrGLProgramDesc::setRandom(SkMWCRandom* random,
|
| (!dstRead && kCombineWithDst_CoverageOutput == coverageOutput);
|
| } while (illegalCoverageOutput);
|
|
|
| - fCoverageOutput = coverageOutput;
|
| + header->fCoverageOutput = coverageOutput;
|
| +
|
| + *this->checksum() = 0;
|
| + *this->checksum() = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.get()), keyLength);
|
| + fInitialized = true;
|
| }
|
|
|
| bool GrGpuGL::programUnitTest(int maxStages) {
|
| @@ -90,10 +121,12 @@ bool GrGpuGL::programUnitTest(int maxStages) {
|
| maxStages = GrMin(maxStages, (int)GrDrawState::kNumStages);
|
|
|
| GrTextureDesc dummyDesc;
|
| + dummyDesc.fFlags = kRenderTarget_GrTextureFlagBit;
|
| dummyDesc.fConfig = kSkia8888_GrPixelConfig;
|
| dummyDesc.fWidth = 34;
|
| dummyDesc.fHeight = 18;
|
| SkAutoTUnref<GrTexture> dummyTexture1(this->createTexture(dummyDesc, NULL, 0));
|
| + dummyDesc.fFlags = kNone_GrTextureFlags;
|
| dummyDesc.fConfig = kAlpha_8_GrPixelConfig;
|
| dummyDesc.fWidth = 16;
|
| dummyDesc.fHeight = 22;
|
| @@ -113,43 +146,52 @@ bool GrGpuGL::programUnitTest(int maxStages) {
|
| #endif
|
|
|
| GrGLProgramDesc pdesc;
|
| - const GrEffectStage* stages[GrDrawState::kNumStages];
|
| - memset(stages, 0, sizeof(stages));
|
|
|
| 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) {
|
| - // enable the stage?
|
| - if (random.nextBool()) {
|
| - SkAutoTUnref<const GrEffectRef> effect(GrEffectTestFactory::CreateStage(
|
| - &random,
|
| - this->getContext(),
|
| - *this->caps(),
|
| - dummyTextures));
|
| - 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) {
|
| - --s;
|
| - continue;
|
| - }
|
| - for (int i = 0; i < numAttribs; ++i) {
|
| - attribIndices[i] = currAttribIndex++;
|
| - }
|
| - GrEffectStage* stage = SkNEW(GrEffectStage);
|
| - stage->setEffect(effect.get(), attribIndices[0], attribIndices[1]);
|
| - stages[s] = stage;
|
| +
|
| + int numStages = random.nextULessThan(maxStages + 1);
|
| + int numColorStages = random.nextULessThan(numStages + 1);
|
| + int numCoverageStages = numStages - numColorStages;
|
| +
|
| + SkAutoSTMalloc<8, const GrEffectStage*> stages(numStages);
|
| +
|
| + for (int s = 0; s < numStages; ++s) {
|
| + SkAutoTUnref<const GrEffectRef> effect(GrEffectTestFactory::CreateStage(
|
| + &random,
|
| + this->getContext(),
|
| + *this->caps(),
|
| + dummyTextures));
|
| + 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) {
|
| + --s;
|
| + continue;
|
| + }
|
| + for (int i = 0; i < numAttribs; ++i) {
|
| + attribIndices[i] = currAttribIndex++;
|
| }
|
| + GrEffectStage* stage = SkNEW(GrEffectStage);
|
| + stage->setEffect(effect.get(), attribIndices[0], attribIndices[1]);
|
| + stages[s] = stage;
|
| }
|
| const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1];
|
| - pdesc.setRandom(&random, this, dstTexture, stages, currAttribIndex);
|
| + pdesc.setRandom(&random,
|
| + this,
|
| + dummyTextures[0]->asRenderTarget(),
|
| + dstTexture,
|
| + stages.get(),
|
| + numColorStages,
|
| + numCoverageStages,
|
| + currAttribIndex);
|
|
|
| SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this->glContext(),
|
| pdesc,
|
| - stages));
|
| - for (int s = 0; s < maxStages; ++s) {
|
| + stages.get()));
|
| + for (int s = 0; s < numStages; ++s) {
|
| SkDELETE(stages[s]);
|
| }
|
| if (NULL == program.get()) {
|
|
|