aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/glsl
diff options
context:
space:
mode:
authorGravatar cdalton <cdalton@nvidia.com>2016-04-11 11:30:50 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-11 11:30:50 -0700
commit1f50acff0dc09e50cc207846508d8e6459334b2a (patch)
tree0d2aa98915e50223a84c771dce0f42b9c2ea04b6 /src/gpu/glsl
parentfef28606d2c51be627be3a656581882e31945c03 (diff)
Add appendPrecisionModifier method to GrGLSLShaderBuilder
Diffstat (limited to 'src/gpu/glsl')
-rw-r--r--src/gpu/glsl/GrGLSL.h17
-rw-r--r--src/gpu/glsl/GrGLSLShaderBuilder.cpp6
-rw-r--r--src/gpu/glsl/GrGLSLShaderBuilder.h5
-rw-r--r--src/gpu/glsl/GrGLSLShaderVar.h22
4 files changed, 31 insertions, 19 deletions
diff --git a/src/gpu/glsl/GrGLSL.h b/src/gpu/glsl/GrGLSL.h
index 12c1f1fcc6..9f5f2b05b4 100644
--- a/src/gpu/glsl/GrGLSL.h
+++ b/src/gpu/glsl/GrGLSL.h
@@ -84,6 +84,23 @@ void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision,
SkString* out);
/**
+ * Converts a GrSLPrecision to its corresponding GLSL precision qualifier.
+ */
+static inline const char* GrGLSLPrecisionString(GrSLPrecision p) {
+ switch (p) {
+ case kLow_GrSLPrecision:
+ return "lowp";
+ case kMedium_GrSLPrecision:
+ return "mediump";
+ case kHigh_GrSLPrecision:
+ return "highp";
+ default:
+ SkFAIL("Unexpected precision type.");
+ return "";
+ }
+}
+
+/**
* Converts a GrSLType to a string containing the name of the equivalent GLSL type.
*/
static inline const char* GrGLSLTypeString(GrSLType t) {
diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.cpp b/src/gpu/glsl/GrGLSLShaderBuilder.cpp
index 93b9f8a57a..795e5cb585 100644
--- a/src/gpu/glsl/GrGLSLShaderBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLShaderBuilder.cpp
@@ -35,6 +35,12 @@ void GrGLSLShaderBuilder::declAppend(const GrGLSLShaderVar& var) {
this->codeAppendf("%s;", tempDecl.c_str());
}
+void GrGLSLShaderBuilder::appendPrecisionModifier(GrSLPrecision precision) {
+ if (fProgramBuilder->glslCaps()->usesPrecisionModifiers()) {
+ this->codeAppendf("%s ", GrGLSLPrecisionString(precision));
+ }
+}
+
void GrGLSLShaderBuilder::emitFunction(GrSLType returnType,
const char* name,
int argCnt,
diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.h b/src/gpu/glsl/GrGLSLShaderBuilder.h
index 5b3a01f3e9..cddf7b2db4 100644
--- a/src/gpu/glsl/GrGLSLShaderBuilder.h
+++ b/src/gpu/glsl/GrGLSLShaderBuilder.h
@@ -93,6 +93,11 @@ public:
*/
void declAppend(const GrGLSLShaderVar& var);
+ /**
+ * Appends a precision qualifier followed by a space, if relevant for the GLSL version.
+ */
+ void appendPrecisionModifier(GrSLPrecision);
+
/** Emits a helper function outside of main() in the fragment shader. */
void emitFunction(GrSLType returnType,
const char* name,
diff --git a/src/gpu/glsl/GrGLSLShaderVar.h b/src/gpu/glsl/GrGLSLShaderVar.h
index a7d7479d39..9d162ecaa4 100644
--- a/src/gpu/glsl/GrGLSLShaderVar.h
+++ b/src/gpu/glsl/GrGLSLShaderVar.h
@@ -174,8 +174,9 @@ public:
out->append(" ");
}
GrSLType effectiveType = this->getType();
- if (GrSLTypeAcceptsPrecision(effectiveType)) {
- out->append(PrecisionString(glslCaps, fPrecision));
+ if (glslCaps->usesPrecisionModifiers() && GrSLTypeAcceptsPrecision(effectiveType)) {
+ // Desktop GLSL has added precision qualifiers but they don't do anything.
+ out->appendf("%s ", GrGLSLPrecisionString(fPrecision));
}
if (this->isArray()) {
if (this->isUnsizedArray()) {
@@ -210,23 +211,6 @@ public:
fUseUniformFloatArrays ? "" : ".x");
}
- static const char* PrecisionString(const GrGLSLCaps* glslCaps, GrSLPrecision p) {
- // Desktop GLSL has added precision qualifiers but they don't do anything.
- if (glslCaps->usesPrecisionModifiers()) {
- switch (p) {
- case kLow_GrSLPrecision:
- return "lowp ";
- case kMedium_GrSLPrecision:
- return "mediump ";
- case kHigh_GrSLPrecision:
- return "highp ";
- default:
- SkFAIL("Unexpected precision type.");
- }
- }
- return "";
- }
-
private:
static const char* TypeModifierString(const GrGLSLCaps* glslCaps, TypeModifier t) {
GrGLSLGeneration gen = glslCaps->generation();