aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/GrGLProgram.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-08-29 12:59:57 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-08-29 12:59:57 +0000
commit4af0af612f8cfb6951feb10ffe3091821866bd44 (patch)
tree53682cd4bf4f3d0db27768493da80577b497d310 /src/gpu/gl/GrGLProgram.cpp
parent1fcc1b80994f7bfa60bbc74e924484da09b47e3b (diff)
Add helpers to add/modulate glsl vec4s.
Review URL: https://codereview.appspot.com/6497046/ git-svn-id: http://skia.googlecode.com/svn/trunk@5332 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/gpu/gl/GrGLProgram.cpp')
-rw-r--r--src/gpu/gl/GrGLProgram.cpp102
1 files changed, 16 insertions, 86 deletions
diff --git a/src/gpu/gl/GrGLProgram.cpp b/src/gpu/gl/GrGLProgram.cpp
index 9613697678..50e839b77c 100644
--- a/src/gpu/gl/GrGLProgram.cpp
+++ b/src/gpu/gl/GrGLProgram.cpp
@@ -46,20 +46,6 @@ inline const char* vector_all_coords(int count) {
return ALL[count];
}
-inline const char* all_ones_vec(int count) {
- static const char* ONESVEC[] = {"ERROR", "1.0", "vec2(1,1)",
- "vec3(1,1,1)", "vec4(1,1,1,1)"};
- GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(ONESVEC));
- return ONESVEC[count];
-}
-
-inline const char* all_zeros_vec(int count) {
- static const char* ZEROSVEC[] = {"ERROR", "0.0", "vec2(0,0)",
- "vec3(0,0,0)", "vec4(0,0,0,0)"};
- GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(ZEROSVEC));
- return ZEROSVEC[count];
-}
-
inline const char* declared_color_output_name() { return "fsColorOut"; }
inline const char* dual_source_output_name() { return "dualSourceOut"; }
@@ -146,62 +132,6 @@ void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff,
}
}
-// assigns modulation of two vars to an output var
-// vars can be vec4s or floats (or one of each)
-// result is always vec4
-// if either var is "" then assign to the other var
-// if both are "" then assign all ones
-static inline void modulate_helper(const char* outputVar,
- const char* var0,
- const char* var1,
- SkString* code) {
- GrAssert(NULL != outputVar);
- GrAssert(NULL != var0);
- GrAssert(NULL != var1);
- GrAssert(NULL != code);
-
- bool has0 = '\0' != *var0;
- bool has1 = '\0' != *var1;
-
- if (!has0 && !has1) {
- code->appendf("\t%s = %s;\n", outputVar, all_ones_vec(4));
- } else if (!has0) {
- code->appendf("\t%s = vec4(%s);\n", outputVar, var1);
- } else if (!has1) {
- code->appendf("\t%s = vec4(%s);\n", outputVar, var0);
- } else {
- code->appendf("\t%s = vec4(%s * %s);\n", outputVar, var0, var1);
- }
-}
-
-// assigns addition of two vars to an output var
-// vars can be vec4s or floats (or one of each)
-// result is always vec4
-// if either var is "" then assign to the other var
-// if both are "" then assign all zeros
-static inline void add_helper(const char* outputVar,
- const char* var0,
- const char* var1,
- SkString* code) {
- GrAssert(NULL != outputVar);
- GrAssert(NULL != var0);
- GrAssert(NULL != var1);
- GrAssert(NULL != code);
-
- bool has0 = '\0' != *var0;
- bool has1 = '\0' != *var1;
-
- if (!has0 && !has1) {
- code->appendf("\t%s = %s;\n", outputVar, all_zeros_vec(4));
- } else if (!has0) {
- code->appendf("\t%s = vec4(%s);\n", outputVar, var1);
- } else if (!has1) {
- code->appendf("\t%s = vec4(%s);\n", outputVar, var0);
- } else {
- code->appendf("\t%s = vec4(%s + %s);\n", outputVar, var0, var1);
- }
-}
-
// given two blend coeffecients determine whether the src
// and/or dst computation can be omitted.
static inline void needBlendInputs(SkXfermode::Coeff srcCoeff,
@@ -260,13 +190,13 @@ static void blendTermString(SkString* str, SkXfermode::Coeff coeff,
str->printf("(%s * %s)", src, value);
break;
case SkXfermode::kISC_Coeff:
- str->printf("((%s - %s) * %s)", all_ones_vec(4), src, value);
+ str->printf("((%s - %s) * %s)", GrGLSLOnesVecf(4), src, value);
break;
case SkXfermode::kDC_Coeff:
str->printf("(%s * %s)", dst, value);
break;
case SkXfermode::kIDC_Coeff:
- str->printf("((%s - %s) * %s)", all_ones_vec(4), dst, value);
+ str->printf("((%s - %s) * %s)", GrGLSLOnesVecf(4), dst, value);
break;
case SkXfermode::kSA_Coeff: /** src alpha */
str->printf("(%s.a * %s)", src, value);
@@ -298,7 +228,9 @@ static void addColorFilter(SkString* fsCode, const char * outputVar,
blendTermString(&colorStr, colorCoeff, filterColor, inColor, inColor);
blendTermString(&constStr, uniformCoeff, filterColor, inColor, filterColor);
- add_helper(outputVar, colorStr.c_str(), constStr.c_str(), fsCode);
+ fsCode->appendf("\t%s = ", outputVar);
+ GrGLSLAdd4f(fsCode, colorStr.c_str(), constStr.c_str());
+ fsCode->append(";\n");
}
bool GrGLProgram::genEdgeCoverage(SkString* coverageVar,
@@ -458,9 +390,9 @@ const char* GrGLProgram::adjustInColor(const SkString& inColor) const {
return inColor.c_str();
} else {
if (Desc::kSolidWhite_ColorInput == fDesc.fColorInput) {
- return all_ones_vec(4);
+ return GrGLSLOnesVecf(4);
} else {
- return all_zeros_vec(4);
+ return GrGLSLZerosVecf(4);
}
}
}
@@ -736,7 +668,7 @@ bool GrGLProgram::genProgram(const GrCustomStage** customStages) {
!applyColorMatrix) {
builder.fFSCode.appendf("\t%s = %s;\n",
colorOutput.getName().c_str(),
- all_zeros_vec(4));
+ GrGLSLZerosVecf(4));
wroteFragColorZero = true;
} else if (SkXfermode::kDst_Mode != fDesc.fColorFilterXfermode) {
builder.fFSCode.append("\tvec4 filteredColor;\n");
@@ -854,12 +786,11 @@ bool GrGLProgram::genProgram(const GrCustomStage** customStages) {
if (outputIsZero) {
builder.fFSCode.appendf("\t%s = %s;\n",
dual_source_output_name(),
- all_zeros_vec(4));
+ GrGLSLZerosVecf(4));
} else {
- modulate_helper(dual_source_output_name(),
- coeff.c_str(),
- inCoverage.c_str(),
- &builder.fFSCode);
+ builder.fFSCode.appendf("\t%s =", dual_source_output_name());
+ GrGLSLModulate4f(&builder.fFSCode, coeff.c_str(), inCoverage.c_str());
+ builder.fFSCode.append(";\n");
}
dualSourceOutputWritten = true;
}
@@ -872,12 +803,11 @@ bool GrGLProgram::genProgram(const GrCustomStage** customStages) {
if (coverageIsZero) {
builder.fFSCode.appendf("\t%s = %s;\n",
colorOutput.getName().c_str(),
- all_zeros_vec(4));
+ GrGLSLZerosVecf(4));
} else {
- modulate_helper(colorOutput.getName().c_str(),
- inColor.c_str(),
- inCoverage.c_str(),
- &builder.fFSCode);
+ builder.fFSCode.appendf("\t%s = ", colorOutput.getName().c_str());
+ GrGLSLModulate4f(&builder.fFSCode, inColor.c_str(), inCoverage.c_str());
+ builder.fFSCode.append(";\n");
}
}