aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/GLProgramsTest.cpp101
1 files changed, 61 insertions, 40 deletions
diff --git a/tests/GLProgramsTest.cpp b/tests/GLProgramsTest.cpp
index 6ee48907e4..dd0f80f42f 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,