Allow derivative functions if derivative extension is enabled. I still need to add validation for "#extension GL_OES_standard_derivatives : enable".
BUG=25
Review URL: http://codereview.appspot.com/1965045
git-svn-id: https://angleproject.googlecode.com/svn/trunk@403 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/Initialize.cpp b/src/compiler/Initialize.cpp
index 6bfcf4f..aef230c 100644
--- a/src/compiler/Initialize.cpp
+++ b/src/compiler/Initialize.cpp
@@ -377,7 +377,7 @@
// Prototypes for built-in functions seen by fragment shaders only.
//
//============================================================================
-static TString BuiltInFunctionsFragment()
+static TString BuiltInFunctionsFragment(const TBuiltInResource& resources)
{
TString s;
@@ -389,20 +389,22 @@
s.append(TString("vec4 texture2DProj(sampler2D sampler, vec4 coord, float bias);"));
s.append(TString("vec4 textureCube(samplerCube sampler, vec3 coord, float bias);"));
- //s.append(TString("float dFdx(float p);"));
- //s.append(TString("vec2 dFdx(vec2 p);"));
- //s.append(TString("vec3 dFdx(vec3 p);"));
- //s.append(TString("vec4 dFdx(vec4 p);"));
+ if (resources.OES_standard_derivatives) {
+ s.append(TString("float dFdx(float p);"));
+ s.append(TString("vec2 dFdx(vec2 p);"));
+ s.append(TString("vec3 dFdx(vec3 p);"));
+ s.append(TString("vec4 dFdx(vec4 p);"));
- //s.append(TString("float dFdy(float p);"));
- //s.append(TString("vec2 dFdy(vec2 p);"));
- //s.append(TString("vec3 dFdy(vec3 p);"));
- //s.append(TString("vec4 dFdy(vec4 p);"));
+ s.append(TString("float dFdy(float p);"));
+ s.append(TString("vec2 dFdy(vec2 p);"));
+ s.append(TString("vec3 dFdy(vec3 p);"));
+ s.append(TString("vec4 dFdy(vec4 p);"));
- s.append(TString("float fwidth(float p);"));
- s.append(TString("vec2 fwidth(vec2 p);"));
- s.append(TString("vec3 fwidth(vec3 p);"));
- s.append(TString("vec4 fwidth(vec4 p);"));
+ s.append(TString("float fwidth(float p);"));
+ s.append(TString("vec2 fwidth(vec2 p);"));
+ s.append(TString("vec3 fwidth(vec3 p);"));
+ s.append(TString("vec4 fwidth(vec4 p);"));
+ }
s.append(TString("\n"));
return s;
@@ -491,7 +493,7 @@
case EShLangFragment:
builtInStrings.push_back(DefaultPrecisionFragment());
builtInStrings.push_back(BuiltInFunctionsCommon());
- builtInStrings.push_back(BuiltInFunctionsFragment());
+ builtInStrings.push_back(BuiltInFunctionsFragment(resources));
builtInStrings.push_back(StandardUniforms());
break;
@@ -595,9 +597,11 @@
case EShLangVertex:
break;
case EShLangFragment:
- //symbolTable.relateToOperator("dFdx", EOpDPdx); // OES_standard_derivatives extension
- //symbolTable.relateToOperator("dFdy", EOpDPdy); // OES_standard_derivatives extension
- //symbolTable.relateToOperator("fwidth", EOpFwidth); // OES_standard_derivatives extension
+ if (resources.OES_standard_derivatives) {
+ symbolTable.relateToOperator("dFdx", EOpDFdx);
+ symbolTable.relateToOperator("dFdy", EOpDFdy);
+ symbolTable.relateToOperator("fwidth", EOpFwidth);
+ }
break;
default: break;
}
diff --git a/src/compiler/OutputGLSL.cpp b/src/compiler/OutputGLSL.cpp
index fd263b6..b0ab7a7 100644
--- a/src/compiler/OutputGLSL.cpp
+++ b/src/compiler/OutputGLSL.cpp
@@ -374,6 +374,10 @@
case EOpLength: writeTriplet(visit, "length(", NULL, ")"); break;
case EOpNormalize: writeTriplet(visit, "normalize(", NULL, ")"); break;
+ case EOpDFdx: writeTriplet(visit, "dFdx(", NULL, ")"); break;
+ case EOpDFdy: writeTriplet(visit, "dFdy(", NULL, ")"); break;
+ case EOpFwidth: writeTriplet(visit, "fwidth(", NULL, ")"); break;
+
case EOpAny: writeTriplet(visit, "any(", NULL, ")"); break;
case EOpAll: writeTriplet(visit, "all(", NULL, ")"); break;
diff --git a/src/compiler/OutputHLSL.cpp b/src/compiler/OutputHLSL.cpp
index 8b8a4e6..0bb73d4 100644
--- a/src/compiler/OutputHLSL.cpp
+++ b/src/compiler/OutputHLSL.cpp
@@ -933,9 +933,9 @@
case EOpFract: outputTriplet(visit, "frac(", "", ")"); break;
case EOpLength: outputTriplet(visit, "length(", "", ")"); break;
case EOpNormalize: outputTriplet(visit, "normalize(", "", ")"); break;
-// case EOpDPdx: outputTriplet(visit, "ddx(", "", ")"); break;
-// case EOpDPdy: outputTriplet(visit, "ddy(", "", ")"); break;
-// case EOpFwidth: outputTriplet(visit, "fwidth(", "", ")"); break;
+ case EOpDFdx: outputTriplet(visit, "ddx(", "", ")"); break;
+ case EOpDFdy: outputTriplet(visit, "ddy(", "", ")"); break;
+ case EOpFwidth: outputTriplet(visit, "fwidth(", "", ")"); break;
case EOpAny: outputTriplet(visit, "any(", "", ")"); break;
case EOpAll: outputTriplet(visit, "all(", "", ")"); break;
default: UNREACHABLE();
diff --git a/src/compiler/intermediate.h b/src/compiler/intermediate.h
index d262905..973f403 100644
--- a/src/compiler/intermediate.h
+++ b/src/compiler/intermediate.h
@@ -129,9 +129,9 @@
EOpReflect,
EOpRefract,
- //EOpDPdx, // Fragment only, OES_standard_derivatives extension
- //EOpDPdy, // Fragment only, OES_standard_derivatives extension
- //EOpFwidth, // Fragment only, OES_standard_derivatives extension
+ EOpDFdx, // Fragment only, OES_standard_derivatives extension
+ EOpDFdy, // Fragment only, OES_standard_derivatives extension
+ EOpFwidth, // Fragment only, OES_standard_derivatives extension
EOpMatrixTimesMatrix,