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:
parent
01f010cffe
commit
9705596684
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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(),
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user