Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(309)

Unified Diff: src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp

Issue 1438003003: Move all ShaderBuilder files to GLSL (Closed) Base URL: https://skia.googlesource.com/skia.git@glslProgBuild
Patch Set: nits Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/builders/GrGLFragmentShaderBuilder.h ('k') | src/gpu/gl/builders/GrGLGeometryShaderBuilder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
-}
-
« no previous file with comments | « src/gpu/gl/builders/GrGLFragmentShaderBuilder.h ('k') | src/gpu/gl/builders/GrGLGeometryShaderBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698