Make program unit test run clean and add it to tests program
Review URL: http://codereview.appspot.com/4898049/
git-svn-id: http://skia.googlecode.com/svn/trunk@2121 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGLProgram.cpp b/gpu/src/GrGLProgram.cpp
index fe42855..4699851 100644
--- a/gpu/src/GrGLProgram.cpp
+++ b/gpu/src/GrGLProgram.cpp
@@ -1091,7 +1091,7 @@
segments->fVSCode.appendf("\t%s -= vec2(%g, %g) * %s;\n",
varyingName.c_str(), scale, scale,
imageIncrementName.c_str());
-}
+ }
/// Fragment Shader Stuff
GrStringBuilder fsCoordName;
@@ -1265,17 +1265,32 @@
segments->fFSCode.appendf("\t%s += %s(%s, %s + vec2(+%s.x,+%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName.c_str(), sampleCoords.c_str(), texelSizeName.c_str(), texelSizeName.c_str(), smear);
segments->fFSCode.appendf("\t%s = .25 * %s%s;\n", fsOutColor, accumVar.c_str(), modulate.c_str());
} else if (ProgramDesc::StageDesc::kConvolution_FetchMode == desc.fFetchMode) {
- segments->fFSCode.append("\tvec4 sum = vec4(0, 0, 0, 0);\n");
- segments->fFSCode.appendf("\tvec2 coord = %s;\n", sampleCoords.c_str());
- segments->fFSCode.appendf("\tfor (int i = 0; i < %d; i++) {\n", desc.fKernelWidth);
- segments->fFSCode.appendf("\t\tsum += %s(%s, coord)%s * %s[i];\n",
- texFunc.c_str(), samplerName.c_str(),
- smear, kernelName.c_str());
- segments->fFSCode.appendf("\t\tcoord += %s;\n",
+ GrStringBuilder sumVar("sum");
+ sumVar.appendS32(stageNum);
+ GrStringBuilder coordVar("coord");
+ coordVar.appendS32(stageNum);
+
+ segments->fFSCode.appendf("\tvec4 %s = vec4(0, 0, 0, 0);\n",
+ sumVar.c_str());
+ segments->fFSCode.appendf("\tvec2 %s = %s;\n",
+ coordVar.c_str(),
+ sampleCoords.c_str());
+ segments->fFSCode.appendf("\tfor (int i = 0; i < %d; i++) {\n",
+ desc.fKernelWidth);
+ segments->fFSCode.appendf("\t\t%s += %s(%s, %s)%s * %s[i];\n",
+ sumVar.c_str(), texFunc.c_str(),
+ samplerName.c_str(), coordVar.c_str(), smear,
+ kernelName.c_str());
+ segments->fFSCode.appendf("\t\t%s += %s;\n",
+ coordVar.c_str(),
imageIncrementName.c_str());
segments->fFSCode.appendf("\t}\n");
- segments->fFSCode.appendf("\t%s = sum%s;\n", fsOutColor, modulate.c_str());
+ segments->fFSCode.appendf("\t%s = %s%s;\n", fsOutColor,
+ sumVar.c_str(), modulate.c_str());
} else {
- segments->fFSCode.appendf("\t%s = %s(%s, %s)%s%s;\n", fsOutColor, texFunc.c_str(), samplerName.c_str(), sampleCoords.c_str(), smear, modulate.c_str());
+ segments->fFSCode.appendf("\t%s = %s(%s, %s)%s%s;\n",
+ fsOutColor, texFunc.c_str(),
+ samplerName.c_str(), sampleCoords.c_str(),
+ smear, modulate.c_str());
}
}
diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp
index adac9b0..5afd77e 100644
--- a/gpu/src/GrGpuGLShaders.cpp
+++ b/gpu/src/GrGpuGLShaders.cpp
@@ -143,7 +143,7 @@
}
};
-void GrGpuGLShaders::ProgramUnitTest() {
+bool GrGpuGLShaders::programUnitTest() {
static const int STAGE_OPTS[] = {
0,
@@ -185,8 +185,13 @@
idx = (int)(random.nextF() * (kNumStages+1));
pdesc.fFirstCoverageStage = idx;
- pdesc.fEdgeAANumEdges = (random.nextF() * (getMaxEdges() + 1));
- pdesc.fEdgeAAConcave = random.nextF() > .5f;
+ bool edgeAA = random.nextF() > .5f;
+ if (edgeAA) {
+ pdesc.fEdgeAANumEdges = random.nextF() * this->getMaxEdges() + 1;
+ pdesc.fEdgeAAConcave = random.nextF() > .5f;
+ } else {
+ pdesc.fEdgeAANumEdges = 0;
+ }
if (fDualSourceBlendingSupport) {
pdesc.fDualSrcOutput =
@@ -217,10 +222,17 @@
stage.fModulation = random_val(&random, StageDesc::kModulationCnt);
stage.fCoordMapping = random_val(&random, StageDesc::kCoordMappingCnt);
stage.fFetchMode = random_val(&random, StageDesc::kFetchModeCnt);
+ // convolution shaders don't work with persp tex matrix
+ if (stage.fFetchMode == StageDesc::kConvolution_FetchMode) {
+ stage.fOptFlags |= StageDesc::kNoPerspective_OptFlagBit;
+ }
stage.setEnabled(VertexUsesStage(s, pdesc.fVertexLayout));
+ stage.fKernelWidth = 4 * random.nextF() + 2;
}
CachedData cachedData;
- program.genProgram(&cachedData);
+ if (!program.genProgram(&cachedData)) {
+ return false;
+ }
DeleteProgram(&cachedData);
bool again = false;
if (again) {
@@ -228,6 +240,7 @@
DeleteProgram(&cachedData);
}
}
+ return true;
}
GrGpuGLShaders::GrGpuGLShaders() {
@@ -247,7 +260,7 @@
fProgramCache = new ProgramCache();
#if 0
- ProgramUnitTest();
+ this->programUnitTest();
#endif
}
diff --git a/gpu/src/GrGpuGLShaders.h b/gpu/src/GrGpuGLShaders.h
index eb3ee37..be6f64e 100644
--- a/gpu/src/GrGpuGLShaders.h
+++ b/gpu/src/GrGpuGLShaders.h
@@ -26,6 +26,8 @@
virtual void abandonResources();
+ bool programUnitTest();
+
protected:
// overrides from GrGpu
virtual bool flushGraphicsState(GrPrimitiveType type);
@@ -74,8 +76,6 @@
static void DeleteProgram(CachedData* programData);
- void ProgramUnitTest();
-
void buildProgram(GrPrimitiveType type);
ProgramCache* fProgramCache;