aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar tomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-05-14 19:58:06 +0000
committerGravatar tomhudson@google.com <tomhudson@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-05-14 19:58:06 +0000
commit9c639a406eec42c8f5169bd78ad93e58f00ea9f6 (patch)
tree630b1d83d5fab07c1c08f7fa4de0dfeed78964d4 /src
parentff17584e1c15f68ccc296be517e8a6776a9ddabd (diff)
Move coordDims, varyingDims onto GrGLShaderBuilder.
Diffstat (limited to 'src')
-rw-r--r--src/gpu/gl/GrGLProgram.cpp77
-rw-r--r--src/gpu/gl/GrGLProgramStage.cpp14
-rw-r--r--src/gpu/gl/GrGLProgramStage.h4
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.cpp6
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.h4
5 files changed, 50 insertions, 55 deletions
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 91167d6a66..5bd0440f3e 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -1258,8 +1258,7 @@ GrGLShaderVar* genRadialVS(int stageNum,
GrGLProgram::StageUniLocations* locations,
const char** radial2VaryingVSName,
const char** radial2VaryingFSName,
- const char* varyingVSName,
- int varyingDims, int coordDims) {
+ const char* varyingVSName) {
GrGLShaderVar* radial2FSParams = &segments->fFSUnis.push_back();
radial2FSParams->setType(kFloat_GrSLType);
@@ -1272,8 +1271,8 @@ GrGLShaderVar* genRadialVS(int stageNum,
// for radial grads without perspective we can pass the linear
// part of the quadratic as a varying.
- if (varyingDims == coordDims) {
- GrAssert(2 == coordDims);
+ if (segments->fVaryingDims == segments->fCoordDims) {
+ GrAssert(2 == segments->fCoordDims);
segments->appendVarying(kFloat_GrSLType,
"Radial2BCoeff",
stageNum,
@@ -1300,9 +1299,7 @@ bool genRadial2GradientCoordMapping(int stageNum,
const char* radial2VaryingFSName,
GrGLShaderVar* radial2Params,
GrStringBuilder& sampleCoords,
- GrStringBuilder& fsCoordName,
- int varyingDims,
- int coordDims) {
+ GrStringBuilder& fsCoordName) {
GrStringBuilder cName("c");
GrStringBuilder ac4Name("ac4");
GrStringBuilder rootName("root");
@@ -1327,11 +1324,11 @@ bool genRadial2GradientCoordMapping(int stageNum,
// if we were able to interpolate the linear component bVar is the varying
// otherwise compute it
GrStringBuilder bVar;
- if (coordDims == varyingDims) {
+ if (segments->fCoordDims == segments->fVaryingDims) {
bVar = radial2VaryingFSName;
- GrAssert(2 == varyingDims);
+ GrAssert(2 == segments->fVaryingDims);
} else {
- GrAssert(3 == varyingDims);
+ GrAssert(3 == segments->fVaryingDims);
bVar = "b";
bVar.appendS32(stageNum);
segments->fFSCode.appendf("\tfloat %s = 2.0 * (%s * %s.x - %s);\n",
@@ -1368,9 +1365,7 @@ bool genRadial2GradientDegenerateCoordMapping(int stageNum,
const char* radial2VaryingFSName,
GrGLShaderVar* radial2Params,
GrStringBuilder& sampleCoords,
- GrStringBuilder& fsCoordName,
- int varyingDims,
- int coordDims) {
+ GrStringBuilder& fsCoordName) {
GrStringBuilder cName("c");
cName.appendS32(stageNum);
@@ -1385,11 +1380,11 @@ bool genRadial2GradientDegenerateCoordMapping(int stageNum,
// if we were able to interpolate the linear component bVar is the varying
// otherwise compute it
GrStringBuilder bVar;
- if (coordDims == varyingDims) {
+ if (segments->fCoordDims == segments->fVaryingDims) {
bVar = radial2VaryingFSName;
- GrAssert(2 == varyingDims);
+ GrAssert(2 == segments->fVaryingDims);
} else {
- GrAssert(3 == varyingDims);
+ GrAssert(3 == segments->fVaryingDims);
bVar = "b";
bVar.appendS32(stageNum);
segments->fFSCode.appendf("\tfloat %s = 2.0 * (%s * %s.x - %s);\n",
@@ -1419,19 +1414,18 @@ void gen2x2FS(int stageNum,
const char* fsOutColor,
GrStringBuilder& texFunc,
GrStringBuilder& modulate,
- bool complexCoord,
- int coordDims) {
+ bool complexCoord) {
locations->fNormalizedTexelSizeUni = kUseUniform;
if (complexCoord) {
// assign the coord to a var rather than compute 4x.
GrStringBuilder coordVar("tCoord");
coordVar.appendS32(stageNum);
segments->fFSCode.appendf("\t%s %s = %s;\n",
- float_vector_type_str(coordDims),
+ float_vector_type_str(segments->fCoordDims),
coordVar.c_str(), sampleCoords->c_str());
*sampleCoords = coordVar;
}
- GrAssert(2 == coordDims);
+ GrAssert(2 == segments->fCoordDims);
GrStringBuilder accumVar("accum");
accumVar.appendS32(stageNum);
segments->fFSCode.appendf("\tvec4 %s = %s(%s, %s + vec2(-%s.x,-%s.y))%s;\n", accumVar.c_str(), texFunc.c_str(), samplerName, sampleCoords->c_str(), texelSizeName, texelSizeName, swizzle);
@@ -1520,12 +1514,6 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
GrAssert((desc.fInConfigFlags & StageDesc::kInConfigBitMask) ==
desc.fInConfigFlags);
- // First decide how many coords are needed to access the texture
- // Right now it's always 2 but we could start using 1D textures for
- // gradients.
- static const int coordDims = 2;
- int varyingDims;
-
/// Vertex Shader Stuff
if (NULL != customStage) {
@@ -1536,7 +1524,7 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
// and whether the varying needs a perspective coord.
const char* matName = NULL;
if (desc.fOptFlags & StageDesc::kIdentityMatrix_OptFlagBit) {
- varyingDims = coordDims;
+ segments->fVaryingDims = segments->fCoordDims;
} else {
GrGLShaderVar* mat;
mat = &segments->fVSUnis.push_back();
@@ -1548,11 +1536,12 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
matName = mat->getName().c_str();
if (desc.fOptFlags & StageDesc::kNoPerspective_OptFlagBit) {
- varyingDims = coordDims;
+ segments->fVaryingDims = segments->fCoordDims;
} else {
- varyingDims = coordDims + 1;
+ segments->fVaryingDims = segments->fCoordDims + 1;
}
}
+ GrAssert(segments->fVaryingDims > 0);
segments->fFSUnis.push_back().set(kSampler2D_GrSLType,
GrGLShaderVar::kUniform_TypeModifier, "");
@@ -1569,20 +1558,20 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
}
const char *varyingVSName, *varyingFSName;
- segments->appendVarying(GrSLFloatVectorType(varyingDims),
+ segments->appendVarying(GrSLFloatVectorType(segments->fVaryingDims),
"Stage",
stageNum,
&varyingVSName,
&varyingFSName);
if (!matName) {
- GrAssert(varyingDims == coordDims);
+ GrAssert(segments->fVaryingDims == segments->fCoordDims);
segments->fVSCode.appendf("\t%s = %s;\n", varyingVSName, vsInCoord);
} else {
// varying = texMatrix * texCoord
segments->fVSCode.appendf("\t%s = (%s * vec3(%s, 1))%s;\n",
varyingVSName, matName, vsInCoord,
- vector_all_coords(varyingDims));
+ vector_all_coords(segments->fVaryingDims));
}
GrGLShaderVar* radial2Params = NULL;
@@ -1594,8 +1583,7 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
locations,
&radial2VaryingVSName,
&radial2VaryingFSName,
- varyingVSName,
- varyingDims, coordDims);
+ varyingVSName);
}
GrGLShaderVar* kernel = NULL;
@@ -1626,7 +1614,7 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
GrStringBuilder texFunc("texture2D");
if (desc.fOptFlags & (StageDesc::kIdentityMatrix_OptFlagBit |
StageDesc::kNoPerspective_OptFlagBit)) {
- GrAssert(varyingDims == coordDims);
+ GrAssert(segments->fVaryingDims == segments->fCoordDims);
fsCoordName = varyingFSName;
} else {
// if we have to do some special op on the varyings to get
@@ -1640,12 +1628,12 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
fsCoordName = "inCoord";
fsCoordName.appendS32(stageNum);
segments->fFSCode.appendf("\t%s %s = %s%s / %s%s;\n",
- GrGLShaderVar::TypeString(GrSLFloatVectorType(coordDims)),
+ GrGLShaderVar::TypeString(GrSLFloatVectorType(segments->fCoordDims)),
fsCoordName.c_str(),
varyingFSName,
- GrGLSLVectorNonhomogCoords(varyingDims),
+ GrGLSLVectorNonhomogCoords(segments->fVaryingDims),
varyingFSName,
- GrGLSLVectorHomogCoord(varyingDims));
+ GrGLSLVectorHomogCoord(segments->fVaryingDims));
}
}
@@ -1667,16 +1655,13 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
complexCoord = genRadial2GradientCoordMapping(
stageNum, segments,
radial2VaryingFSName, radial2Params,
- sampleCoords, fsCoordName,
- varyingDims, coordDims);
-
+ sampleCoords, fsCoordName);
break;
case StageDesc::kRadial2GradientDegenerate_CoordMapping:
complexCoord = genRadial2GradientDegenerateCoordMapping(
stageNum, segments,
radial2VaryingFSName, radial2Params,
- sampleCoords, fsCoordName,
- varyingDims, coordDims);
+ sampleCoords, fsCoordName);
break;
};
@@ -1713,7 +1698,7 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
GrGLShaderVar::kUniform_TypeModifier, texDomainName);
GrStringBuilder coordVar("clampCoord");
segments->fFSCode.appendf("\t%s %s = clamp(%s, %s.xy, %s.zw);\n",
- float_vector_type_str(coordDims),
+ float_vector_type_str(segments->fCoordDims),
coordVar.c_str(),
sampleCoords.c_str(),
texDomainName.c_str(),
@@ -1727,7 +1712,7 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
gen2x2FS(stageNum, segments, locations, &sampleCoords,
samplerName, texelSizeName, swizzle, fsOutColor,
- texFunc, modulate, complexCoord, coordDims);
+ texFunc, modulate, complexCoord);
break;
case StageDesc::kConvolution_FetchMode:
GrAssert(!(desc.fInConfigFlags & kMulByAlphaMask));
@@ -1784,7 +1769,7 @@ void GrGLProgram::genStageCode(const GrGLContextInfo& gl,
GrStringBuilder fragmentShader;
fsCoordName = customStage->emitTextureSetup(
&fragmentShader, sampleCoords.c_str(),
- stageNum, coordDims, varyingDims);
+ stageNum, segments);
customStage->emitFS(&fragmentShader, fsOutColor, fsInColor,
samplerName, fsCoordName.c_str());
diff --git a/src/gpu/gl/GrGLProgramStage.cpp b/src/gpu/gl/GrGLProgramStage.cpp
index 66204384f7..07a6b33069 100644
--- a/src/gpu/gl/GrGLProgramStage.cpp
+++ b/src/gpu/gl/GrGLProgramStage.cpp
@@ -31,10 +31,9 @@ void GrGLProgramStage::setData(const GrGLInterface*, GrCustomStage*,
}
GrStringBuilder GrGLProgramStage::emitTextureSetup(GrStringBuilder* code,
- const char* coordName,
- int stageNum,
- int coordDims,
- int varyingDims) {
+ const char* coordName,
+ int stageNum,
+ GrGLShaderBuilder* segments) {
GrStringBuilder retval;
switch (fSamplerMode) {
@@ -48,12 +47,13 @@ GrStringBuilder GrGLProgramStage::emitTextureSetup(GrStringBuilder* code,
retval = "inCoord";
retval.appendS32(stageNum);
code->appendf("\t %s %s = %s%s / %s%s\n",
- GrGLShaderVar::TypeString(GrSLFloatVectorType(coordDims)),
+ GrGLShaderVar::TypeString
+ (GrSLFloatVectorType(segments->fCoordDims)),
fCoordName.c_str(),
coordName,
- GrGLSLVectorNonhomogCoords(varyingDims),
+ GrGLSLVectorNonhomogCoords(segments->fVaryingDims),
coordName,
- GrGLSLVectorHomogCoord(varyingDims));
+ GrGLSLVectorHomogCoord(segments->fVaryingDims));
break;
}
return retval;
diff --git a/src/gpu/gl/GrGLProgramStage.h b/src/gpu/gl/GrGLProgramStage.h
index 340c99fd39..4778e7e8a0 100644
--- a/src/gpu/gl/GrGLProgramStage.h
+++ b/src/gpu/gl/GrGLProgramStage.h
@@ -9,6 +9,7 @@
#define GrGLCustomStage_DEFINED
#include "GrAllocator.h"
+#include "GrGLShaderBuilder.h"
#include "GrGLShaderVar.h"
#include "GrGLSL.h"
#include "GrStringBuilder.h"
@@ -106,8 +107,7 @@ public:
GrStringBuilder emitTextureSetup(GrStringBuilder* code,
const char* coordName,
int stageNum,
- int coordDims,
- int varyingDims);
+ GrGLShaderBuilder* segments);
protected:
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
index 77ae42536c..244b286937 100644
--- a/src/gpu/gl/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -17,6 +17,11 @@ static const int sMaxFSOutputs = 2;
}
+// Architectural assumption: always 2-d input coords.
+// Likely to become non-constant and non-static, perhaps even
+// varying by stage, if we use 1D textures for gradients!
+//const int GrGLShaderBuilder::fCoordDims = 2;
+
GrGLShaderBuilder::GrGLShaderBuilder()
: fVSUnis(sVarsPerBlock)
, fVSAttrs(sVarsPerBlock)
@@ -26,6 +31,7 @@ GrGLShaderBuilder::GrGLShaderBuilder()
, fFSInputs(sVarsPerBlock)
, fFSUnis(sVarsPerBlock)
, fFSOutputs(sMaxFSOutputs)
+ , fVaryingDims(0)
, fUsesGS(false) {
}
diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
index 1f4c41fd65..19ec6e17a3 100644
--- a/src/gpu/gl/GrGLShaderBuilder.h
+++ b/src/gpu/gl/GrGLShaderBuilder.h
@@ -52,7 +52,11 @@ public:
GrStringBuilder fGSCode;
GrStringBuilder fFSCode;
+ int fVaryingDims;
+ static const int fCoordDims = 2;
+
bool fUsesGS;
+
};
#endif