Index: tests/GLProgramsTest.cpp |
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp |
index 6ee48907e42ad107ee2ec29da692b773212d44d1..dd0f80f42f0815aa8b7c7c91c5c9da01ced9cbda 100644 |
--- a/tests/GLProgramsTest.cpp |
+++ b/tests/GLProgramsTest.cpp |
@@ -22,7 +22,7 @@ |
#include "SkRandom.h" |
#include "Test.h" |
-void GrGLProgramDesc::setRandom(SkRandom* random, |
+bool GrGLProgramDesc::setRandom(SkRandom* random, |
const GrGpuGL* gpu, |
const GrRenderTarget* dstRenderTarget, |
const GrTexture* dstCopyTexture, |
@@ -30,13 +30,51 @@ void GrGLProgramDesc::setRandom(SkRandom* random, |
int numColorStages, |
int numCoverageStages, |
int currAttribIndex) { |
- 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); |
+ bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt; |
+ |
+ int numStages = numColorStages + numCoverageStages; |
+ fKey.reset(); |
+ |
+ GR_STATIC_ASSERT(0 == kEffectKeyLengthsOffset % sizeof(uint32_t)); |
+ |
+ // Make room for everything up to and including the array of offsets to effect keys. |
+ fKey.push_back_n(kEffectKeyLengthsOffset + sizeof(uint32_t) * numStages); |
+ |
+ size_t offset = fKey.count(); |
+ int offsetIndex = 0; |
+ |
+ bool dstRead = false; |
+ bool fragPos = false; |
+ bool vertexCode = false; |
+ for (int s = 0; s < numStages; ++s) { |
+ uint32_t* offsetLocation = reinterpret_cast<uint32_t*>(fKey.begin() + |
+ kEffectKeyLengthsOffset + |
+ offsetIndex * sizeof(uint32_t)); |
+ *offsetLocation = offset; |
+ ++offsetIndex; |
+ |
+ const GrBackendEffectFactory& factory = stages[s]->getEffect()->getFactory(); |
+ GrDrawEffect drawEffect(*stages[s], useLocalCoords); |
+ GrEffectKeyBuilder b(&fKey); |
+ if (!factory.getGLEffectKey(drawEffect, gpu->glCaps(), &b)) { |
+ fKey.reset(); |
+ return false; |
+ } |
+ if (stages[s]->getEffect()->willReadDstColor()) { |
+ dstRead = true; |
+ } |
+ if (stages[s]->getEffect()->willReadFragmentPosition()) { |
+ fragPos = true; |
+ } |
+ if (stages[s]->getEffect()->hasVertexCode()) { |
+ vertexCode = true; |
+ } |
+ |
+ offset += b.size(); |
+ } |
KeyHeader* header = this->header(); |
+ memset(header, 0, kHeaderSize); |
header->fEmitsPointSize = random->nextBool(); |
header->fPositionAttributeIndex = 0; |
@@ -48,6 +86,7 @@ void GrGLProgramDesc::setRandom(SkRandom* random, |
random->nextULessThan(kColorInputCnt)); |
} while (GrDrawState::kMaxVertexAttribCnt <= currAttribIndex && |
kAttribute_ColorInput == header->fColorInput); |
+ |
header->fColorAttributeIndex = (header->fColorInput == kAttribute_ColorInput) ? |
currAttribIndex++ : |
-1; |
@@ -65,39 +104,20 @@ void GrGLProgramDesc::setRandom(SkRandom* random, |
header->fExperimentalGS = gpu->caps()->geometryShaderSupport() && random->nextBool(); |
#endif |
- bool useLocalCoords = random->nextBool() && currAttribIndex < GrDrawState::kMaxVertexAttribCnt; |
header->fLocalCoordAttributeIndex = useLocalCoords ? currAttribIndex++ : -1; |
header->fColorEffectCnt = numColorStages; |
header->fCoverageEffectCnt = numCoverageStages; |
- bool dstRead = false; |
- bool fragPos = false; |
- bool vertexCode = 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 (stages[s]->getEffect()->hasVertexCode()) { |
- vertexCode = true; |
- } |
- } |
- |
if (dstRead) { |
- header->fDstReadKey = GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, gpu->glCaps()); |
+ header->fDstReadKey = SkToU8(GrGLShaderBuilder::KeyForDstRead(dstCopyTexture, |
+ gpu->glCaps())); |
} else { |
header->fDstReadKey = 0; |
} |
if (fragPos) { |
- header->fFragPosKey = GrGLShaderBuilder::KeyForFragmentPosition(dstRenderTarget, |
- gpu->glCaps()); |
+ header->fFragPosKey = SkToU8(GrGLShaderBuilder::KeyForFragmentPosition(dstRenderTarget, |
+ gpu->glCaps())); |
} else { |
header->fFragPosKey = 0; |
} |
@@ -118,9 +138,8 @@ void GrGLProgramDesc::setRandom(SkRandom* random, |
header->fCoverageOutput = coverageOutput; |
- *this->checksum() = 0; |
- *this->checksum() = SkChecksum::Compute(reinterpret_cast<uint32_t*>(fKey.get()), keyLength); |
- fInitialized = true; |
+ this->finalize(); |
+ return true; |
} |
bool GrGpuGL::programUnitTest(int maxStages) { |
@@ -202,14 +221,16 @@ bool GrGpuGL::programUnitTest(int maxStages) { |
++s; |
} |
const GrTexture* dstTexture = random.nextBool() ? dummyTextures[0] : dummyTextures[1]; |
- pdesc.setRandom(&random, |
- this, |
- dummyTextures[0]->asRenderTarget(), |
- dstTexture, |
- stages.get(), |
- numColorStages, |
- numCoverageStages, |
- currAttribIndex); |
+ if (!pdesc.setRandom(&random, |
+ this, |
+ dummyTextures[0]->asRenderTarget(), |
+ dstTexture, |
+ stages.get(), |
+ numColorStages, |
+ numCoverageStages, |
+ currAttribIndex)) { |
+ return false; |
+ } |
SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this, |
pdesc, |