Express (GLSL expression, possibly known value) pairs as a class
Express (GLSL expression, possibly known value) pairs as a class
instead of two variables Introduces GrGLSLExpr<N> to encapsulate
the expression and possibly constant-folded value of the expression.
This simplifies passing of the expressions to functions.
Changes the shaders with following patterns:
{ // Stage 0: Linear Gradient
vec4 colorTemp = mix(uGradientStartColor_Stage0, uGradientEndColor_Stage0, clamp(vMatrixCoord_Stage0.x, 0.0, 1
colorTemp.rgb *= colorTemp.a;
- output_Stage0 = vec4((vColor) * (colorTemp));
+ output_Stage0 = (vColor * colorTemp);
+ }
Previously the vector cast was always added if constant folding was
effective, regardless of the term dimensions. Now the vector upcast is
not inserted in places where it is not needed, ie. when the binary
operator term is of the target dimension.
Also, some parentheses can be omitted. It is assumed that
GrGLSLExpr<N>("string") constructors construct a simple expression or
parenthesized expression.
Otherwise the shader code remains identical.
R=jvanverth@google.com, bsalomon@google.com, robertphillips@google.com
Author: kkinnunen@nvidia.com
Review URL: https://codereview.chromium.org/25048002
git-svn-id: http://skia.googlecode.com/svn/trunk@11690 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLSL.cpp b/src/gpu/gl/GrGLSL.cpp
index f48f038..3dfd5e5 100644
--- a/src/gpu/gl/GrGLSL.cpp
+++ b/src/gpu/gl/GrGLSL.cpp
@@ -63,26 +63,6 @@
}
}
-const char* GrGLSLVectorHomogCoord(int count) {
- static const char* HOMOGS[] = {"ERROR", "", ".y", ".z", ".w"};
- SkASSERT(count >= 1 && count < (int)GR_ARRAY_COUNT(HOMOGS));
- return HOMOGS[count];
-}
-
-const char* GrGLSLVectorHomogCoord(GrSLType type) {
- return GrGLSLVectorHomogCoord(GrSLTypeToVecLength(type));
-}
-
-const char* GrGLSLVectorNonhomogCoords(int count) {
- static const char* NONHOMOGS[] = {"ERROR", "", ".x", ".xy", ".xyz"};
- SkASSERT(count >= 1 && count < (int)GR_ARRAY_COUNT(NONHOMOGS));
- return NONHOMOGS[count];
-}
-
-const char* GrGLSLVectorNonhomogCoords(GrSLType type) {
- return GrGLSLVectorNonhomogCoords(GrSLTypeToVecLength(type));
-}
-
namespace {
void append_tabs(SkString* outAppend, int tabCnt) {
static const char kTabs[] = "\t\t\t\t\t\t\t\t";
@@ -94,50 +74,19 @@
}
}
-GrSLConstantVec GrGLSLMulVarBy4f(SkString* outAppend,
- int tabCnt,
- const char* vec4VarName,
- const char* mulFactor,
- GrSLConstantVec mulFactorDefault) {
- bool haveFactor = NULL != mulFactor && '\0' != *mulFactor;
-
- SkASSERT(NULL != outAppend);
- SkASSERT(NULL != vec4VarName);
- SkASSERT(kNone_GrSLConstantVec != mulFactorDefault || haveFactor);
-
- if (!haveFactor) {
- if (kOnes_GrSLConstantVec == mulFactorDefault) {
- return kNone_GrSLConstantVec;
- } else {
- SkASSERT(kZeros_GrSLConstantVec == mulFactorDefault);
- append_tabs(outAppend, tabCnt);
- outAppend->appendf("%s = vec4(0, 0, 0, 0);\n", vec4VarName);
- return kZeros_GrSLConstantVec;
- }
+void GrGLSLMulVarBy4f(SkString* outAppend,
+ unsigned tabCnt,
+ const char* vec4VarName,
+ const GrGLSLExpr<4>& mulFactor) {
+ if (mulFactor.isOnes()) {
+ *outAppend = SkString();
}
+
append_tabs(outAppend, tabCnt);
- outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor);
- return kNone_GrSLConstantVec;
+
+ if (mulFactor.isZeros()) {
+ outAppend->appendf("%s = vec4(0);\n", vec4VarName);
+ }
+ outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor.c_str());
}
-GrSLConstantVec GrGLSLGetComponent4f(SkString* outAppend,
- const char* expr,
- GrColorComponentFlags component,
- GrSLConstantVec defaultExpr,
- bool omitIfConst) {
- if (NULL == expr || '\0' == *expr) {
- SkASSERT(defaultExpr != kNone_GrSLConstantVec);
- if (!omitIfConst) {
- if (kOnes_GrSLConstantVec == defaultExpr) {
- outAppend->append("1.0");
- } else {
- SkASSERT(kZeros_GrSLConstantVec == defaultExpr);
- outAppend->append("0.0");
- }
- }
- return defaultExpr;
- } else {
- outAppend->appendf("(%s).%c", expr, GrColorComponentFlagToChar(component));
- return kNone_GrSLConstantVec;
- }
-}