| Index: src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
|
| diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
|
| deleted file mode 100644
|
| index c464ffd3b1f1fe9153d89d25d3c1ebfe81861884..0000000000000000000000000000000000000000
|
| --- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
|
| +++ /dev/null
|
| @@ -1,268 +0,0 @@
|
| -/*
|
| - * Copyright 2014 Google Inc.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -#include "GrGLFragmentShaderBuilder.h"
|
| -#include "GrRenderTarget.h"
|
| -#include "glsl/GrGLSL.h"
|
| -#include "glsl/GrGLSLCaps.h"
|
| -#include "glsl/GrGLSLProgramBuilder.h"
|
| -
|
| -const char* GrGLFragmentShaderBuilder::kDstTextureColorName = "_dstColor";
|
| -
|
| -static const char* specific_layout_qualifier_name(GrBlendEquation equation) {
|
| - SkASSERT(GrBlendEquationIsAdvanced(equation));
|
| -
|
| - static const char* kLayoutQualifierNames[] = {
|
| - "blend_support_screen",
|
| - "blend_support_overlay",
|
| - "blend_support_darken",
|
| - "blend_support_lighten",
|
| - "blend_support_colordodge",
|
| - "blend_support_colorburn",
|
| - "blend_support_hardlight",
|
| - "blend_support_softlight",
|
| - "blend_support_difference",
|
| - "blend_support_exclusion",
|
| - "blend_support_multiply",
|
| - "blend_support_hsl_hue",
|
| - "blend_support_hsl_saturation",
|
| - "blend_support_hsl_color",
|
| - "blend_support_hsl_luminosity"
|
| - };
|
| - return kLayoutQualifierNames[equation - kFirstAdvancedGrBlendEquation];
|
| -
|
| - GR_STATIC_ASSERT(0 == kScreen_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(1 == kOverlay_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(2 == kDarken_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(3 == kLighten_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(4 == kColorDodge_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(5 == kColorBurn_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(6 == kHardLight_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(7 == kSoftLight_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(8 == kDifference_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(9 == kExclusion_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(10 == kMultiply_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(11 == kHSLHue_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(12 == kHSLSaturation_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(13 == kHSLColor_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(14 == kHSLLuminosity_GrBlendEquation - kFirstAdvancedGrBlendEquation);
|
| - GR_STATIC_ASSERT(SK_ARRAY_COUNT(kLayoutQualifierNames) ==
|
| - kGrBlendEquationCnt - kFirstAdvancedGrBlendEquation);
|
| -}
|
| -
|
| -GrGLFragmentShaderBuilder::FragPosKey
|
| -GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst) {
|
| - if (kTopLeft_GrSurfaceOrigin == dst->origin()) {
|
| - return kTopLeftFragPosRead_FragPosKey;
|
| - } else {
|
| - return kBottomLeftFragPosRead_FragPosKey;
|
| - }
|
| -}
|
| -
|
| -GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLSLProgramBuilder* program,
|
| - uint8_t fragPosKey)
|
| - : INHERITED(program)
|
| - , fSetupFragPosition(false)
|
| - , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == fragPosKey)
|
| - , fCustomColorOutputIndex(-1)
|
| - , fHasReadDstColor(false)
|
| - , fHasReadFragmentPosition(false) {
|
| -}
|
| -
|
| -bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) {
|
| - switch (feature) {
|
| - case kStandardDerivatives_GLSLFeature: {
|
| - if (!fProgramBuilder->glslCaps()->shaderDerivativeSupport()) {
|
| - return false;
|
| - }
|
| - const char* extension = fProgramBuilder->glslCaps()->shaderDerivativeExtensionString();
|
| - if (extension) {
|
| - this->addFeature(1 << kStandardDerivatives_GLSLFeature, extension);
|
| - }
|
| - return true;
|
| - }
|
| - default:
|
| - SkFAIL("Unexpected GLSLFeature requested.");
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -SkString GrGLFragmentShaderBuilder::ensureFSCoords2D(const GrGLSLTransformedCoordsArray& coords,
|
| - int index) {
|
| - if (kVec3f_GrSLType != coords[index].getType()) {
|
| - SkASSERT(kVec2f_GrSLType == coords[index].getType());
|
| - return coords[index].getName();
|
| - }
|
| -
|
| - SkString coords2D("coords2D");
|
| - if (0 != index) {
|
| - coords2D.appendf("_%i", index);
|
| - }
|
| - this->codeAppendf("\tvec2 %s = %s.xy / %s.z;",
|
| - coords2D.c_str(), coords[index].c_str(), coords[index].c_str());
|
| - return coords2D;
|
| -}
|
| -
|
| -const char* GrGLFragmentShaderBuilder::fragmentPosition() {
|
| - fHasReadFragmentPosition = true;
|
| -
|
| - const GrGLSLCaps* glslCaps = fProgramBuilder->glslCaps();
|
| - // We only declare "gl_FragCoord" when we're in the case where we want to use layout qualifiers
|
| - // to reverse y. Otherwise it isn't necessary and whether the "in" qualifier appears in the
|
| - // declaration varies in earlier GLSL specs. So it is simpler to omit it.
|
| - if (fTopLeftFragPosRead) {
|
| - fSetupFragPosition = true;
|
| - return "gl_FragCoord";
|
| - } else if (const char* extension = glslCaps->fragCoordConventionsExtensionString()) {
|
| - if (!fSetupFragPosition) {
|
| - if (glslCaps->generation() < k150_GrGLSLGeneration) {
|
| - this->addFeature(1 << kFragCoordConventions_GLSLPrivateFeature,
|
| - extension);
|
| - }
|
| - fInputs.push_back().set(kVec4f_GrSLType,
|
| - GrGLSLShaderVar::kIn_TypeModifier,
|
| - "gl_FragCoord",
|
| - kDefault_GrSLPrecision,
|
| - GrGLSLShaderVar::kUpperLeft_Origin);
|
| - fSetupFragPosition = true;
|
| - }
|
| - return "gl_FragCoord";
|
| - } else {
|
| - static const char* kTempName = "tmpXYFragCoord";
|
| - static const char* kCoordName = "fragCoordYDown";
|
| - if (!fSetupFragPosition) {
|
| - SkASSERT(!fProgramBuilder->fUniformHandles.fRTHeightUni.isValid());
|
| - const char* rtHeightName;
|
| -
|
| - fProgramBuilder->fUniformHandles.fRTHeightUni =
|
| - fProgramBuilder->addFragPosUniform(GrGLSLProgramBuilder::kFragment_Visibility,
|
| - kFloat_GrSLType,
|
| - kDefault_GrSLPrecision,
|
| - "RTHeight",
|
| - &rtHeightName);
|
| -
|
| - // The Adreno compiler seems to be very touchy about access to "gl_FragCoord".
|
| - // Accessing glFragCoord.zw can cause a program to fail to link. Additionally,
|
| - // depending on the surrounding code, accessing .xy with a uniform involved can
|
| - // do the same thing. Copying gl_FragCoord.xy into a temp vec2 beforehand
|
| - // (and only accessing .xy) seems to "fix" things.
|
| - this->codePrependf("\tvec4 %s = vec4(%s.x, %s - %s.y, 1.0, 1.0);\n",
|
| - kCoordName, kTempName, rtHeightName, kTempName);
|
| - this->codePrependf("vec2 %s = gl_FragCoord.xy;", kTempName);
|
| - fSetupFragPosition = true;
|
| - }
|
| - SkASSERT(fProgramBuilder->fUniformHandles.fRTHeightUni.isValid());
|
| - return kCoordName;
|
| - }
|
| -}
|
| -
|
| -const char* GrGLFragmentShaderBuilder::dstColor() {
|
| - fHasReadDstColor = true;
|
| -
|
| - const GrGLSLCaps* glslCaps = fProgramBuilder->glslCaps();
|
| - if (glslCaps->fbFetchSupport()) {
|
| - this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeature + 1),
|
| - glslCaps->fbFetchExtensionString());
|
| -
|
| - // Some versions of this extension string require declaring custom color output on ES 3.0+
|
| - const char* fbFetchColorName = glslCaps->fbFetchColorName();
|
| - if (glslCaps->fbFetchNeedsCustomOutput()) {
|
| - this->enableCustomOutput();
|
| - fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOut_TypeModifier);
|
| - fbFetchColorName = DeclaredColorOutputName();
|
| - }
|
| - return fbFetchColorName;
|
| - } else {
|
| - return kDstTextureColorName;
|
| - }
|
| -}
|
| -
|
| -void GrGLFragmentShaderBuilder::enableAdvancedBlendEquationIfNeeded(GrBlendEquation equation) {
|
| - SkASSERT(GrBlendEquationIsAdvanced(equation));
|
| -
|
| - const GrGLSLCaps& caps = *fProgramBuilder->glslCaps();
|
| - if (!caps.mustEnableAdvBlendEqs()) {
|
| - return;
|
| - }
|
| -
|
| - this->addFeature(1 << kBlendEquationAdvanced_GLSLPrivateFeature,
|
| - "GL_KHR_blend_equation_advanced");
|
| - if (caps.mustEnableSpecificAdvBlendEqs()) {
|
| - this->addLayoutQualifier(specific_layout_qualifier_name(equation), kOut_InterfaceQualifier);
|
| - } else {
|
| - this->addLayoutQualifier("blend_support_all_equations", kOut_InterfaceQualifier);
|
| - }
|
| -}
|
| -
|
| -void GrGLFragmentShaderBuilder::enableCustomOutput() {
|
| - if (!fHasCustomColorOutput) {
|
| - fHasCustomColorOutput = true;
|
| - fCustomColorOutputIndex = fOutputs.count();
|
| - fOutputs.push_back().set(kVec4f_GrSLType,
|
| - GrGLSLShaderVar::kOut_TypeModifier,
|
| - DeclaredColorOutputName());
|
| - }
|
| -}
|
| -
|
| -void GrGLFragmentShaderBuilder::enableSecondaryOutput() {
|
| - SkASSERT(!fHasSecondaryOutput);
|
| - fHasSecondaryOutput = true;
|
| - const GrGLSLCaps& caps = *fProgramBuilder->glslCaps();
|
| - if (const char* extension = caps.secondaryOutputExtensionString()) {
|
| - this->addFeature(1 << kBlendFuncExtended_GLSLPrivateFeature, extension);
|
| - }
|
| -
|
| - // If the primary output is declared, we must declare also the secondary output
|
| - // and vice versa, since it is not allowed to use a built-in gl_FragColor and a custom
|
| - // output. The condition also co-incides with the condition in whici GLES SL 2.0
|
| - // requires the built-in gl_SecondaryFragColorEXT, where as 3.0 requires a custom output.
|
| - if (caps.mustDeclareFragmentShaderOutput()) {
|
| - fOutputs.push_back().set(kVec4f_GrSLType, GrGLSLShaderVar::kOut_TypeModifier,
|
| - DeclaredSecondaryColorOutputName());
|
| - }
|
| -}
|
| -
|
| -const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const {
|
| - return fHasCustomColorOutput ? DeclaredColorOutputName() : "gl_FragColor";
|
| -}
|
| -
|
| -const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const {
|
| - const GrGLSLCaps& caps = *fProgramBuilder->glslCaps();
|
| - return caps.mustDeclareFragmentShaderOutput() ? DeclaredSecondaryColorOutputName()
|
| - : "gl_SecondaryFragColorEXT";
|
| -}
|
| -
|
| -void GrGLFragmentShaderBuilder::onFinalize() {
|
| - GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision,
|
| - *fProgramBuilder->glslCaps(),
|
| - &this->precisionQualifier());
|
| -}
|
| -
|
| -void GrGLFragmentShaderBuilder::addVarying(GrGLSLVarying* v, GrSLPrecision fsPrec) {
|
| - v->fFsIn = v->fVsOut;
|
| - if (v->fGsOut) {
|
| - v->fFsIn = v->fGsOut;
|
| - }
|
| - fInputs.push_back().set(v->fType, GrGLSLShaderVar::kVaryingIn_TypeModifier, v->fFsIn, fsPrec);
|
| -}
|
| -
|
| -void GrGLFragmentBuilder::onBeforeChildProcEmitCode() {
|
| - SkASSERT(fSubstageIndices.count() >= 1);
|
| - fSubstageIndices.push_back(0);
|
| - // second-to-last value in the fSubstageIndices stack is the index of the child proc
|
| - // at that level which is currently emitting code.
|
| - fMangleString.appendf("_c%d", fSubstageIndices[fSubstageIndices.count() - 2]);
|
| -}
|
| -
|
| -void GrGLFragmentBuilder::onAfterChildProcEmitCode() {
|
| - SkASSERT(fSubstageIndices.count() >= 2);
|
| - fSubstageIndices.pop_back();
|
| - fSubstageIndices.back()++;
|
| - int removeAt = fMangleString.findLastOf('_');
|
| - fMangleString.remove(removeAt, fMangleString.size() - removeAt);
|
| -}
|
| -
|
|
|