| Index: src/gpu/gl/GrGLShaderBuilder.cpp
|
| diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
|
| index c33f04ba30e40eb04563aec7c7e50e5cbfdf7446..089ece7c0712b116828ccbaece594883f0733c10 100644
|
| --- a/src/gpu/gl/GrGLShaderBuilder.cpp
|
| +++ b/src/gpu/gl/GrGLShaderBuilder.cpp
|
| @@ -15,8 +15,8 @@
|
| #include "SkRTConf.h"
|
| #include "SkTrace.h"
|
|
|
| -#define GL_CALL(X) GR_GL_CALL(fGpu->glInterface(), X)
|
| -#define GL_CALL_RET(R, X) GR_GL_CALL_RET(fGpu->glInterface(), R, X)
|
| +#define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X)
|
| +#define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X)
|
|
|
| // number of each input/output type in a single allocation block
|
| static const int kVarsPerBlock = 8;
|
| @@ -91,27 +91,22 @@ static const char kDstCopyColorName[] = "_dstColor";
|
|
|
| GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu,
|
| GrGLUniformManager& uniformManager,
|
| - const GrGLProgramDesc& desc,
|
| - bool needsVertexShader)
|
| - : fUniforms(kVarsPerBlock)
|
| - , fGpu(gpu)
|
| + const GrGLProgramDesc& desc)
|
| + : fGpu(gpu)
|
| , fUniformManager(uniformManager)
|
| , fFSFeaturesAddedMask(0)
|
| , fFSInputs(kVarsPerBlock)
|
| , fFSOutputs(kMaxFSOutputs)
|
| + , fUniforms(kVarsPerBlock)
|
| , fSetupFragPosition(false)
|
| - , fKnownColorValue(kNone_GrSLConstantVec)
|
| - , fKnownCoverageValue(kNone_GrSLConstantVec)
|
| + , fKnownColorValue(GrGLProgramDesc::KnownColorInputValue(desc.getHeader().fColorInput))
|
| + , fKnownCoverageValue(GrGLProgramDesc::KnownColorInputValue(desc.getHeader().fCoverageInput))
|
| , fHasCustomColorOutput(false)
|
| , fHasSecondaryOutput(false)
|
| , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey) {
|
|
|
| const GrGLProgramDesc::KeyHeader& header = desc.getHeader();
|
|
|
| - if (needsVertexShader) {
|
| - fVertexBuilder.reset(SkNEW_ARGS(VertexBuilder, (this, fGpu, desc)));
|
| - }
|
| -
|
| // Emit code to read the dst copy textue if necessary.
|
| if (kNoDstRead_DstReadKey != header.fDstReadKey &&
|
| GrGLCaps::kNone_FBFetchType == fGpu->glCaps().fbFetchType()) {
|
| @@ -152,58 +147,18 @@ GrGLShaderBuilder::GrGLShaderBuilder(GrGpuGL* gpu,
|
| this->fsCodeAppend(";\n\n");
|
| }
|
|
|
| - switch (header.fColorInput) {
|
| - case GrGLProgramDesc::kAttribute_ColorInput: {
|
| - SkASSERT(NULL != fVertexBuilder.get());
|
| - fVertexBuilder->addAttribute(kVec4f_GrSLType, color_attribute_name());
|
| - const char *vsName, *fsName;
|
| - fVertexBuilder->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName);
|
| - fVertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsName, color_attribute_name());
|
| - fInputColor = fsName;
|
| - break;
|
| - }
|
| - case GrGLProgramDesc::kUniform_ColorInput: {
|
| - const char* name;
|
| - fColorUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, "Color", &name);
|
| - fInputColor = name;
|
| - break;
|
| - }
|
| - case GrGLProgramDesc::kTransBlack_ColorInput:
|
| - fKnownColorValue = kZeros_GrSLConstantVec;
|
| - break;
|
| - case GrGLProgramDesc::kSolidWhite_ColorInput:
|
| - fKnownColorValue = kOnes_GrSLConstantVec;
|
| - break;
|
| - default:
|
| - GrCrash("Unknown color type.");
|
| - }
|
| -
|
| - switch (header.fCoverageInput) {
|
| - case GrGLProgramDesc::kAttribute_ColorInput: {
|
| - SkASSERT(NULL != fVertexBuilder.get());
|
| - fVertexBuilder->addAttribute(kVec4f_GrSLType, coverage_attribute_name());
|
| - const char *vsName, *fsName;
|
| - fVertexBuilder->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fsName);
|
| - fVertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attribute_name());
|
| - fInputCoverage = fsName;
|
| - break;
|
| - }
|
| - case GrGLProgramDesc::kUniform_ColorInput: {
|
| - const char* name;
|
| - fCoverageUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| - kVec4f_GrSLType, "Coverage", &name);
|
| - fInputCoverage = name;
|
| - break;
|
| - }
|
| - case GrGLProgramDesc::kTransBlack_ColorInput:
|
| - fKnownCoverageValue = kZeros_GrSLConstantVec;
|
| - break;
|
| - case GrGLProgramDesc::kSolidWhite_ColorInput:
|
| - fKnownCoverageValue = kOnes_GrSLConstantVec;
|
| - break;
|
| - default:
|
| - GrCrash("Unknown coverage type.");
|
| + if (GrGLProgramDesc::kUniform_ColorInput == header.fColorInput) {
|
| + const char* name;
|
| + fColorUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| + kVec4f_GrSLType, "Color", &name);
|
| + fInputColor = name;
|
| + }
|
| +
|
| + if (GrGLProgramDesc::kUniform_ColorInput == header.fCoverageInput) {
|
| + const char* name;
|
| + fCoverageUniform = this->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| + kVec4f_GrSLType, "Coverage", &name);
|
| + fInputCoverage = name;
|
| }
|
|
|
| if (k110_GrGLSLGeneration != fGpu->glslGeneration()) {
|
| @@ -551,14 +506,12 @@ void GrGLShaderBuilder::appendUniformDecls(ShaderVisibility visibility,
|
| }
|
| }
|
|
|
| -GrGLProgramEffects* GrGLShaderBuilder::createAndEmitEffects(
|
| - const GrEffectStage* effectStages[],
|
| - const EffectKey effectKeys[],
|
| - int effectCnt,
|
| - SkString* fsInOutColor,
|
| - GrSLConstantVec* fsInOutColorKnownValue) {
|
| -
|
| - GrGLProgramEffectsBuilder programEffectsBuilder(this, effectCnt);
|
| +void GrGLShaderBuilder::createAndEmitEffects(GrGLProgramEffectsBuilder* programEffectsBuilder,
|
| + const GrEffectStage* effectStages[],
|
| + const EffectKey effectKeys[],
|
| + int effectCnt,
|
| + SkString* fsInOutColor,
|
| + GrSLConstantVec* fsInOutColorKnownValue) {
|
| bool effectEmitted = false;
|
|
|
| SkString inColor = *fsInOutColor;
|
| @@ -580,11 +533,11 @@ GrGLProgramEffects* GrGLShaderBuilder::createAndEmitEffects(
|
| this->nameVariable(&outColor, '\0', "output");
|
| this->fsCodeAppendf("\tvec4 %s;\n", outColor.c_str());
|
|
|
| - programEffectsBuilder.emitEffect(stage,
|
| - effectKeys[e],
|
| - outColor.c_str(),
|
| - inColor.isEmpty() ? NULL : inColor.c_str(),
|
| - fCodeStage.stageIndex());
|
| + programEffectsBuilder->emitEffect(stage,
|
| + effectKeys[e],
|
| + outColor.c_str(),
|
| + inColor.isEmpty() ? NULL : inColor.c_str(),
|
| + fCodeStage.stageIndex());
|
|
|
| inColor = outColor;
|
| *fsInOutColorKnownValue = kNone_GrSLConstantVec;
|
| @@ -594,8 +547,6 @@ GrGLProgramEffects* GrGLShaderBuilder::createAndEmitEffects(
|
| if (effectEmitted) {
|
| *fsInOutColor = outColor;
|
| }
|
| -
|
| - return programEffectsBuilder.finish();
|
| }
|
|
|
| const char* GrGLShaderBuilder::getColorOutputName() const {
|
| @@ -706,10 +657,6 @@ bool attach_shader(const GrGLInterface* gli,
|
| }
|
|
|
| bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId) const {
|
| - if (NULL != fVertexBuilder.get() && !fVertexBuilder->compileAndAttachShaders(programId)) {
|
| - return false;
|
| - }
|
| -
|
| SkString fragShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo()));
|
| fragShaderSrc.append(fFSExtensions);
|
| append_default_precision_qualifier(kDefaultFragmentPrecision,
|
| @@ -732,10 +679,6 @@ bool GrGLShaderBuilder::compileAndAttachShaders(GrGLuint programId) const {
|
| }
|
|
|
| void GrGLShaderBuilder::bindProgramLocations(GrGLuint programId) const {
|
| - if (NULL != fVertexBuilder.get()) {
|
| - fVertexBuilder->bindProgramLocations(programId);
|
| - }
|
| -
|
| if (fHasCustomColorOutput) {
|
| GL_CALL(BindFragDataLocation(programId, 0, declared_color_output_name()));
|
| }
|
| @@ -748,13 +691,12 @@ const GrGLContextInfo& GrGLShaderBuilder::ctxInfo() const {
|
| return fGpu->ctxInfo();
|
| }
|
|
|
| -////////////////////////////////////////////////////////////////////////////
|
| +////////////////////////////////////////////////////////////////////////////////
|
|
|
| -GrGLShaderBuilder::VertexBuilder::VertexBuilder(GrGLShaderBuilder* parent,
|
| - GrGpuGL* gpu,
|
| - const GrGLProgramDesc& desc)
|
| - : fParent(parent)
|
| - , fGpu(gpu)
|
| +GrGLFullShaderBuilder::GrGLFullShaderBuilder(GrGpuGL* gpu,
|
| + GrGLUniformManager& uniformManager,
|
| + const GrGLProgramDesc& desc)
|
| + : INHERITED(gpu, uniformManager, desc)
|
| , fDesc(desc)
|
| , fVSAttrs(kVarsPerBlock)
|
| , fVSOutputs(kVarsPerBlock)
|
| @@ -775,8 +717,8 @@ GrGLShaderBuilder::VertexBuilder::VertexBuilder(GrGLShaderBuilder* parent,
|
| }
|
|
|
| const char* viewMName;
|
| - fViewMatrixUniform = fParent->addUniform(GrGLShaderBuilder::kVertex_Visibility,
|
| - kMat33f_GrSLType, "ViewM", &viewMName);
|
| + fViewMatrixUniform = this->addUniform(GrGLShaderBuilder::kVertex_Visibility,
|
| + kMat33f_GrSLType, "ViewM", &viewMName);
|
|
|
| this->vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n"
|
| "\tgl_Position = vec4(pos3.xy, 0, pos3.z);\n",
|
| @@ -790,10 +732,25 @@ GrGLShaderBuilder::VertexBuilder::VertexBuilder(GrGLShaderBuilder* parent,
|
| ) {
|
| this->vsCodeAppend("\tgl_PointSize = 1.0;\n");
|
| }
|
| +
|
| + if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) {
|
| + this->addAttribute(kVec4f_GrSLType, color_attribute_name());
|
| + const char *vsName, *fsName;
|
| + this->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName);
|
| + this->vsCodeAppendf("\t%s = %s;\n", vsName, color_attribute_name());
|
| + this->setInputColor(fsName);
|
| + }
|
| +
|
| + if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) {
|
| + this->addAttribute(kVec4f_GrSLType, coverage_attribute_name());
|
| + const char *vsName, *fsName;
|
| + this->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fsName);
|
| + this->vsCodeAppendf("\t%s = %s;\n", vsName, coverage_attribute_name());
|
| + this->setInputCoverage(fsName);
|
| + }
|
| }
|
|
|
| -bool GrGLShaderBuilder::VertexBuilder::addAttribute(GrSLType type,
|
| - const char* name) {
|
| +bool GrGLFullShaderBuilder::addAttribute(GrSLType type, const char* name) {
|
| for (int i = 0; i < fVSAttrs.count(); ++i) {
|
| const GrGLShaderVar& attr = fVSAttrs[i];
|
| // if attribute already added, don't add it again
|
| @@ -808,9 +765,9 @@ bool GrGLShaderBuilder::VertexBuilder::addAttribute(GrSLType type,
|
| return true;
|
| }
|
|
|
| -bool GrGLShaderBuilder::VertexBuilder::addEffectAttribute(int attributeIndex,
|
| - GrSLType type,
|
| - const SkString& name) {
|
| +bool GrGLFullShaderBuilder::addEffectAttribute(int attributeIndex,
|
| + GrSLType type,
|
| + const SkString& name) {
|
| if (!this->addAttribute(type, name.c_str())) {
|
| return false;
|
| }
|
| @@ -819,14 +776,14 @@ bool GrGLShaderBuilder::VertexBuilder::addEffectAttribute(int attributeIndex,
|
| return true;
|
| }
|
|
|
| -void GrGLShaderBuilder::VertexBuilder::addVarying(GrSLType type,
|
| - const char* name,
|
| - const char** vsOutName,
|
| - const char** fsInName) {
|
| +void GrGLFullShaderBuilder::addVarying(GrSLType type,
|
| + const char* name,
|
| + const char** vsOutName,
|
| + const char** fsInName) {
|
| fVSOutputs.push_back();
|
| fVSOutputs.back().setType(type);
|
| fVSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier);
|
| - fParent->nameVariable(fVSOutputs.back().accessName(), 'v', name);
|
| + this->nameVariable(fVSOutputs.back().accessName(), 'v', name);
|
|
|
| if (vsOutName) {
|
| *vsOutName = fVSOutputs.back().getName().c_str();
|
| @@ -845,22 +802,20 @@ void GrGLShaderBuilder::VertexBuilder::addVarying(GrSLType type,
|
| fGSOutputs.push_back();
|
| fGSOutputs.back().setType(type);
|
| fGSOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier);
|
| - fParent->nameVariable(fGSOutputs.back().accessName(), 'g', name);
|
| + this->nameVariable(fGSOutputs.back().accessName(), 'g', name);
|
| fsName = fGSOutputs.back().accessName();
|
| } else
|
| #endif
|
| {
|
| fsName = fVSOutputs.back().accessName();
|
| }
|
| - fParent->fsInputAppend().set(type,
|
| - GrGLShaderVar::kVaryingIn_TypeModifier,
|
| - *fsName);
|
| + this->fsInputAppend().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, *fsName);
|
| if (fsInName) {
|
| *fsInName = fsName->c_str();
|
| }
|
| }
|
|
|
| -const SkString* GrGLShaderBuilder::VertexBuilder::getEffectAttributeName(int attributeIndex) const {
|
| +const SkString* GrGLFullShaderBuilder::getEffectAttributeName(int attributeIndex) const {
|
| const AttributePair* attribEnd = fEffectAttributes.end();
|
| for (const AttributePair* attrib = fEffectAttributes.begin(); attrib != attribEnd; ++attrib) {
|
| if (attrib->fIndex == attributeIndex) {
|
| @@ -871,26 +826,44 @@ const SkString* GrGLShaderBuilder::VertexBuilder::getEffectAttributeName(int att
|
| return NULL;
|
| }
|
|
|
| -bool GrGLShaderBuilder::VertexBuilder::compileAndAttachShaders(GrGLuint programId) const {
|
| - SkString vertShaderSrc(GrGetGLSLVersionDecl(fParent->ctxInfo()));
|
| - fParent->appendUniformDecls(kVertex_Visibility, &vertShaderSrc);
|
| - fParent->appendDecls(fVSAttrs, &vertShaderSrc);
|
| - fParent->appendDecls(fVSOutputs, &vertShaderSrc);
|
| +GrGLProgramEffects* GrGLFullShaderBuilder::createAndEmitEffects(
|
| + const GrEffectStage* effectStages[],
|
| + const EffectKey effectKeys[],
|
| + int effectCnt,
|
| + SkString* inOutFSColor,
|
| + GrSLConstantVec* fsInOutColorKnownValue) {
|
| +
|
| + GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt);
|
| + this->INHERITED::createAndEmitEffects(&programEffectsBuilder,
|
| + effectStages,
|
| + effectKeys,
|
| + effectCnt,
|
| + inOutFSColor,
|
| + fsInOutColorKnownValue);
|
| + return programEffectsBuilder.finish();
|
| +}
|
| +
|
| +bool GrGLFullShaderBuilder::compileAndAttachShaders(GrGLuint programId) const {
|
| + const GrGLInterface* glInterface = this->gpu()->glInterface();
|
| + SkString vertShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo()));
|
| + this->appendUniformDecls(kVertex_Visibility, &vertShaderSrc);
|
| + this->appendDecls(fVSAttrs, &vertShaderSrc);
|
| + this->appendDecls(fVSOutputs, &vertShaderSrc);
|
| vertShaderSrc.append("void main() {\n");
|
| vertShaderSrc.append(fVSCode);
|
| vertShaderSrc.append("}\n");
|
| - if (!attach_shader(fGpu->glInterface(), programId, GR_GL_VERTEX_SHADER, vertShaderSrc)) {
|
| + if (!attach_shader(glInterface, programId, GR_GL_VERTEX_SHADER, vertShaderSrc)) {
|
| return false;
|
| }
|
|
|
| #if GR_GL_EXPERIMENTAL_GS
|
| if (fDesc.getHeader().fExperimentalGS) {
|
| - SkASSERT(fGpu->glslGeneration() >= k150_GrGLSLGeneration);
|
| - SkString geomShaderSrc(GrGetGLSLVersionDecl(fParent->ctxInfo()));
|
| + SkASSERT(this->ctxInfo().glslGeneration() >= k150_GrGLSLGeneration);
|
| + SkString geomShaderSrc(GrGetGLSLVersionDecl(this->ctxInfo()));
|
| geomShaderSrc.append("layout(triangles) in;\n"
|
| "layout(triangle_strip, max_vertices = 6) out;\n");
|
| - fParent->appendDecls(fGSInputs, &geomShaderSrc);
|
| - fParent->appendDecls(fGSOutputs, &geomShaderSrc);
|
| + this->appendDecls(fGSInputs, &geomShaderSrc);
|
| + this->appendDecls(fGSOutputs, &geomShaderSrc);
|
| geomShaderSrc.append("void main() {\n");
|
| geomShaderSrc.append("\tfor (int i = 0; i < 3; ++i) {\n"
|
| "\t\tgl_Position = gl_in[i].gl_Position;\n");
|
| @@ -907,16 +880,18 @@ bool GrGLShaderBuilder::VertexBuilder::compileAndAttachShaders(GrGLuint programI
|
| "\t}\n"
|
| "\tEndPrimitive();\n");
|
| geomShaderSrc.append("}\n");
|
| - if (!attach_shader(fGpu->glInterface(), programId, GR_GL_GEOMETRY_SHADER, geomShaderSrc)) {
|
| + if (!attach_shader(glInterface, programId, GR_GL_GEOMETRY_SHADER, geomShaderSrc)) {
|
| return false;
|
| }
|
| }
|
| #endif
|
|
|
| - return true;
|
| + return this->INHERITED::compileAndAttachShaders(programId);
|
| }
|
|
|
| -void GrGLShaderBuilder::VertexBuilder::bindProgramLocations(GrGLuint programId) const {
|
| +void GrGLFullShaderBuilder::bindProgramLocations(GrGLuint programId) const {
|
| + this->INHERITED::bindProgramLocations(programId);
|
| +
|
| const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
|
|
|
| // Bind the attrib locations to same values for all shaders
|
|
|