Add option to add precision to varyings in shader
Also use highp varying on bezier cubics to fix numerical issues for n10 and n4.
BUG=skia:2860
R=bsalomon@google.com
Author: egdaniel@google.com
Review URL: https://codereview.chromium.org/522303004
diff --git a/src/gpu/effects/GrBezierEffect.cpp b/src/gpu/effects/GrBezierEffect.cpp
index 92a11ef..488af15 100644
--- a/src/gpu/effects/GrBezierEffect.cpp
+++ b/src/gpu/effects/GrBezierEffect.cpp
@@ -342,7 +342,7 @@
const char *vsName, *fsName;
builder->addVarying(kVec4f_GrSLType, "CubicCoeffs",
- &vsName, &fsName);
+ &vsName, &fsName, GrGLShaderVar::kHigh_Precision);
GrGLVertexShaderBuilder* vsBuilder = builder->getVertexShaderBuilder();
const SkString* attr0Name =
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
index d216a18..fef3691 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
@@ -195,8 +195,9 @@
void GrGLFragmentShaderBuilder::addVarying(GrSLType type,
const char* name,
- const char** fsInName) {
- fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name);
+ const char** fsInName,
+ GrGLShaderVar::Precision fsPrecision) {
+ fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name, fsPrecision);
if (fsInName) {
*fsInName = name;
}
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
index 0f700bd..b3e0ab0 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
@@ -65,7 +65,8 @@
*/
void addVarying(GrSLType type,
const char* name,
- const char** fsInName);
+ const char** fsInName,
+ GrGLShaderVar::Precision fsPrecision = GrGLShaderVar::kDefault_Precision);
/*
* Private functions used by GrGLProgramBuilder for compilation
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index 41b84d8..141442d 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -343,7 +343,8 @@
void GrGLFullProgramBuilder::addVarying(GrSLType type,
const char* name,
const char** vsOutName,
- const char** fsInName) {
+ const char** fsInName,
+ GrGLShaderVar::Precision fsPrecision) {
fVS.addVarying(type, name, vsOutName);
SkString* fsInputName = fVS.fOutputs.back().accessName();
@@ -355,7 +356,7 @@
fsInputName = fGS.fOutputs.back().accessName();
}
#endif
- fFS.addVarying(type, fsInputName->c_str(), fsInName);
+ fFS.addVarying(type, fsInputName->c_str(), fsInName, fsPrecision);
}
GrGLFullProgramBuilder::VaryingHandle
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
index d1af63f..00193ef 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.h
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
@@ -280,7 +280,8 @@
void addVarying(GrSLType type,
const char* name,
const char** vsOutName = NULL,
- const char** fsInName = NULL);
+ const char** fsInName = NULL,
+ GrGLShaderVar::Precision fsPrecision=GrGLShaderVar::kDefault_Precision);
/** Add a separable varying input variable to the current program.
* A separable varying (fragment shader input) is a varying that can be used also when vertex