Reverting r8459 due to shader error on Nexus 10

git-svn-id: http://skia.googlecode.com/svn/trunk@8474 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
robertphillips@google.com 2013-04-01 22:20:59 +00:00
parent 01f010cffe
commit 9705596684
5 changed files with 24 additions and 82 deletions

View File

@ -38,7 +38,7 @@ public:
builder->fsCodeAppendf("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"); builder->fsCodeAppendf("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
break; break;
case GrEdgeEffect::kQuad_EdgeType: case GrEdgeEffect::kQuad_EdgeType:
SkAssertResult(builder->enableFeature(GrGLShaderBuilder::kStandardDerivatives_GLSLFeature)); GrAssert(builder->ctxInfo().caps()->shaderDerivativeSupport());
builder->addVarying(kVec4f_GrSLType, "QuadEdge", &vsName, &fsName); builder->addVarying(kVec4f_GrSLType, "QuadEdge", &vsName, &fsName);
// keep the derivative instructions outside the conditional // keep the derivative instructions outside the conditional
@ -56,9 +56,12 @@ public:
fsName); fsName);
builder->fsCodeAppendf("\t\t\tedgeAlpha = " builder->fsCodeAppendf("\t\t\tedgeAlpha = "
"clamp(0.5 - edgeAlpha / length(gF), 0.0, 1.0);\n\t\t}\n"); "clamp(0.5 - edgeAlpha / length(gF), 0.0, 1.0);\n\t\t}\n");
if (kES2_GrGLBinding == builder->ctxInfo().binding()) {
builder->fHeader.append("#extension GL_OES_standard_derivatives: enable\n");
}
break; break;
case GrEdgeEffect::kHairQuad_EdgeType: case GrEdgeEffect::kHairQuad_EdgeType:
SkAssertResult(builder->enableFeature(GrGLShaderBuilder::kStandardDerivatives_GLSLFeature)); GrAssert(builder->ctxInfo().caps()->shaderDerivativeSupport());
builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName); builder->addVarying(kVec4f_GrSLType, "HairQuadEdge", &vsName, &fsName);
builder->fsCodeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName); builder->fsCodeAppendf("\t\tvec2 duvdx = dFdx(%s.xy);\n", fsName);
@ -70,6 +73,9 @@ public:
fsName); fsName);
builder->fsCodeAppend("\t\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n"); builder->fsCodeAppend("\t\tedgeAlpha = sqrt(edgeAlpha*edgeAlpha / dot(gF, gF));\n");
builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n"); builder->fsCodeAppend("\t\tedgeAlpha = max(1.0 - edgeAlpha, 0.0);\n");
if (kES2_GrGLBinding == builder->ctxInfo().binding()) {
builder->fHeader.append("#extension GL_OES_standard_derivatives: enable\n");
}
break; break;
}; };

View File

@ -462,6 +462,8 @@ bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
// the dual source output has no canonical var name, have to // the dual source output has no canonical var name, have to
// declare an output, which is incompatible with gl_FragColor/gl_FragData. // declare an output, which is incompatible with gl_FragColor/gl_FragData.
bool dualSourceOutputWritten = false; bool dualSourceOutputWritten = false;
builder.fHeader.append(GrGetGLSLVersionDecl(fContext.info().binding(),
fContext.info().glslGeneration()));
GrGLShaderVar colorOutput; GrGLShaderVar colorOutput;
bool isColorDeclared = GrGLSLSetupFSColorOuput(fContext.info().glslGeneration(), bool isColorDeclared = GrGLSLSetupFSColorOuput(fContext.info().glslGeneration(),

View File

@ -9,7 +9,8 @@
#include "GrGLShaderVar.h" #include "GrGLShaderVar.h"
#include "SkString.h" #include "SkString.h"
GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, const GrGLInterface* gl) { GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding,
const GrGLInterface* gl) {
GrGLSLVersion ver = GrGLGetGLSLVersion(gl); GrGLSLVersion ver = GrGLGetGLSLVersion(gl);
switch (binding) { switch (binding) {
case kDesktop_GrGLBinding: case kDesktop_GrGLBinding:
@ -33,7 +34,8 @@ GrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, const GrGLInterface* g
} }
} }
const char* GrGetGLSLVersionDecl(GrGLBinding binding, GrGLSLGeneration gen) { const char* GrGetGLSLVersionDecl(GrGLBinding binding,
GrGLSLGeneration gen) {
switch (gen) { switch (gen) {
case k110_GrGLSLGeneration: case k110_GrGLSLGeneration:
if (kES2_GrGLBinding == binding) { if (kES2_GrGLBinding == binding) {
@ -59,7 +61,9 @@ const char* GrGetGLSLVersionDecl(GrGLBinding binding, GrGLSLGeneration gen) {
} }
} }
bool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen, const char* nameIfDeclared, GrGLShaderVar* var) { bool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen,
const char* nameIfDeclared,
GrGLShaderVar* var) {
bool declaredOutput = k110_GrGLSLGeneration != gen; bool declaredOutput = k110_GrGLSLGeneration != gen;
var->set(kVec4f_GrSLType, var->set(kVec4f_GrSLType,
GrGLShaderVar::kOut_TypeModifier, GrGLShaderVar::kOut_TypeModifier,

View File

@ -104,7 +104,6 @@ GrGLShaderBuilder::GrGLShaderBuilder(const GrGLContextInfo& ctxInfo,
, fCtxInfo(ctxInfo) , fCtxInfo(ctxInfo)
, fUniformManager(uniformManager) , fUniformManager(uniformManager)
, fCurrentStageIdx(kNonStageIdx) , fCurrentStageIdx(kNonStageIdx)
, fFSFeaturesAddedMask(0)
#if GR_GL_EXPERIMENTAL_GS #if GR_GL_EXPERIMENTAL_GS
, fUsesGS(desc.fExperimentalGS) , fUsesGS(desc.fExperimentalGS)
#else #else
@ -158,47 +157,6 @@ GrGLShaderBuilder::GrGLShaderBuilder(const GrGLContextInfo& ctxInfo,
} }
} }
bool GrGLShaderBuilder::enableFeature(GLSLFeature feature) {
switch (feature) {
case kStandardDerivatives_GLSLFeature:
if (!fCtxInfo.caps()->shaderDerivativeSupport()) {
return false;
}
if (kES2_GrGLBinding == fCtxInfo.binding()) {
this->addFSFeature(1 << kStandardDerivatives_GLSLFeature,
"GL_OES_standard_derivatives");
}
return true;
default:
GrCrash("Unexpected GLSLFeature requested.");
return false;
}
}
bool GrGLShaderBuilder::enablePrivateFeature(GLSLPrivateFeature feature) {
switch (feature) {
case kFragCoordConventions_GLSLPrivateFeature:
if (!fCtxInfo.caps()->fragCoordConventionsSupport()) {
return false;
}
if (fCtxInfo.glslGeneration() < k150_GrGLSLGeneration) {
this->addFSFeature(1 << kFragCoordConventions_GLSLPrivateFeature,
"GL_ARB_fragment_coord_conventions");
}
return true;
default:
GrCrash("Unexpected GLSLPrivateFeature requested.");
return false;
}
}
void GrGLShaderBuilder::addFSFeature(uint32_t featureBit, const char* extensionName) {
if (!(featureBit & fFSFeaturesAddedMask)) {
fFSHeader.appendf("#extension %s: require\n", extensionName);
fFSFeaturesAddedMask |= featureBit;
}
}
const char* GrGLShaderBuilder::dstColor() const { const char* GrGLShaderBuilder::dstColor() const {
if (fDstCopySampler.isInitialized()) { if (fDstCopySampler.isInitialized()) {
return kDstColorName; return kDstColorName;
@ -430,7 +388,9 @@ const char* GrGLShaderBuilder::fragmentPosition() {
#if 1 #if 1
if (fCtxInfo.caps()->fragCoordConventionsSupport()) { if (fCtxInfo.caps()->fragCoordConventionsSupport()) {
if (!fSetupFragPosition) { if (!fSetupFragPosition) {
SkAssertResult(this->enablePrivateFeature(kFragCoordConventions_GLSLPrivateFeature)); if (fCtxInfo.glslGeneration() < k150_GrGLSLGeneration) {
fFSHeader.append("#extension GL_ARB_fragment_coord_conventions: require\n");
}
fFSInputs.push_back().set(kVec4f_GrSLType, fFSInputs.push_back().set(kVec4f_GrSLType,
GrGLShaderVar::kIn_TypeModifier, GrGLShaderVar::kIn_TypeModifier,
"gl_FragCoord", "gl_FragCoord",
@ -547,11 +507,9 @@ void GrGLShaderBuilder::appendUniformDecls(ShaderType stype, SkString* out) cons
} }
void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const { void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const {
const char* version = GrGetGLSLVersionDecl(fCtxInfo.binding(), fCtxInfo.glslGeneration());
switch (type) { switch (type) {
case kVertex_ShaderType: case kVertex_ShaderType:
*shaderStr = version; *shaderStr = fHeader;
this->appendUniformDecls(kVertex_ShaderType, shaderStr); this->appendUniformDecls(kVertex_ShaderType, shaderStr);
this->appendDecls(fVSAttrs, shaderStr); this->appendDecls(fVSAttrs, shaderStr);
this->appendDecls(fVSOutputs, shaderStr); this->appendDecls(fVSOutputs, shaderStr);
@ -561,7 +519,7 @@ void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const {
break; break;
case kGeometry_ShaderType: case kGeometry_ShaderType:
if (fUsesGS) { if (fUsesGS) {
*shaderStr = version; *shaderStr = fHeader;
shaderStr->append(fGSHeader); shaderStr->append(fGSHeader);
this->appendDecls(fGSInputs, shaderStr); this->appendDecls(fGSInputs, shaderStr);
this->appendDecls(fGSOutputs, shaderStr); this->appendDecls(fGSOutputs, shaderStr);
@ -573,7 +531,7 @@ void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const {
} }
break; break;
case kFragment_ShaderType: case kFragment_ShaderType:
*shaderStr = version; *shaderStr = fHeader;
append_default_precision_qualifier(kDefaultFragmentPrecision, append_default_precision_qualifier(kDefaultFragmentPrecision,
fCtxInfo.binding(), fCtxInfo.binding(),
shaderStr); shaderStr);

View File

@ -106,22 +106,6 @@ public:
GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLProgramDesc&); GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLProgramDesc&);
/**
* Use of these features may require a GLSL extension to be enabled. Shaders may not compile
* if code is added that uses one of these features without calling enableFeature()
*/
enum GLSLFeature {
kStandardDerivatives_GLSLFeature = 0,
kLastGLSLFeature = kStandardDerivatives_GLSLFeature
};
/**
* If the feature is supported then true is returned and any necessary #extension declarations
* are added to the shaders. If the feature is not supported then false will be returned.
*/
bool enableFeature(GLSLFeature);
/** /**
* Called by GrGLEffects to add code to one of the shaders. * Called by GrGLEffects to add code to one of the shaders.
*/ */
@ -329,6 +313,7 @@ private:
// TODO: Everything below here private. // TODO: Everything below here private.
public: public:
SkString fHeader; // VS+FS, GLSL version, etc
VarArray fVSAttrs; VarArray fVSAttrs;
VarArray fVSOutputs; VarArray fVSOutputs;
VarArray fGSInputs; VarArray fGSInputs;
@ -342,18 +327,6 @@ private:
kNonStageIdx = -1, kNonStageIdx = -1,
}; };
/**
* Features that should only be enabled by GrGLShaderBuilder itself.
*/
enum GLSLPrivateFeature {
kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1
};
bool enablePrivateFeature(GLSLPrivateFeature);
// If we ever have VS/GS features we can expand this to take a bitmask of ShaderType and track
// the enables separately for each shader.
void addFSFeature(uint32_t featureBit, const char* extensionName);
// Interpretation of DstReadKey when generating code // Interpretation of DstReadKey when generating code
enum { enum {
kNoDstRead_DstReadKey = 0, kNoDstRead_DstReadKey = 0,
@ -365,7 +338,6 @@ private:
const GrGLContextInfo& fCtxInfo; const GrGLContextInfo& fCtxInfo;
GrGLUniformManager& fUniformManager; GrGLUniformManager& fUniformManager;
int fCurrentStageIdx; int fCurrentStageIdx;
uint32_t fFSFeaturesAddedMask;
SkString fFSFunctions; SkString fFSFunctions;
SkString fFSHeader; SkString fFSHeader;