| Index: src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
|
| diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0f700bd94d3fc10d6dc1163c71f1a087765c43de
|
| --- /dev/null
|
| +++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
|
| @@ -0,0 +1,118 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrGLFragmentShaderBuilder_DEFINED
|
| +#define GrGLFragmentShaderBuilder_DEFINED
|
| +#include "GrGLShaderBuilder.h"
|
| +
|
| +class GrGLProgramBuilder;
|
| +
|
| +class GrGLFragmentShaderBuilder : public GrGLShaderBuilder {
|
| +public:
|
| + typedef uint8_t DstReadKey;
|
| + typedef uint8_t FragPosKey;
|
| +
|
| + /** Returns a key for adding code to read the copy-of-dst color in service of effects that
|
| + require reading the dst. It must not return 0 because 0 indicates that there is no dst
|
| + copy read at all (in which case this function should not be called). */
|
| + static DstReadKey KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps&);
|
| +
|
| + /** Returns a key for reading the fragment location. This should only be called if there is an
|
| + effect that will requires the fragment position. If the fragment position is not required,
|
| + the key is 0. */
|
| + static FragPosKey KeyForFragmentPosition(const GrRenderTarget* dst, const GrGLCaps&);
|
| +
|
| + GrGLFragmentShaderBuilder(GrGLProgramBuilder* program, const GrGLProgramDesc& desc);
|
| +
|
| + /** Returns the variable name that holds the color of the destination pixel. This may be NULL if
|
| + no effect advertised that it will read the destination. */
|
| + const char* dstColor();
|
| +
|
| + /**
|
| + * 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);
|
| +
|
| + /**
|
| + * This returns a variable name to access the 2D, perspective correct version of the coords in
|
| + * the fragment shader. If the coordinates at index are 3-dimensional, it immediately emits a
|
| + * perspective divide into the fragment shader (xy / z) to convert them to 2D.
|
| + */
|
| + SkString ensureFSCoords2D(const TransformedCoordsArray& coords, int index);
|
| +
|
| +
|
| + /** Returns a variable name that represents the position of the fragment in the FS. The position
|
| + is in device space (e.g. 0,0 is the top left and pixel centers are at half-integers). */
|
| + const char* fragmentPosition();
|
| +
|
| +private:
|
| + /*
|
| + * An internal call for GrGLFullProgramBuilder to use to add varyings to the vertex shader
|
| + */
|
| + void addVarying(GrSLType type,
|
| + const char* name,
|
| + const char** fsInName);
|
| +
|
| + /*
|
| + * Private functions used by GrGLProgramBuilder for compilation
|
| + */
|
| + void bindProgramLocations(GrGLuint programId);
|
| + bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) const;
|
| + void emitCodeBeforeEffects();
|
| + void emitCodeAfterEffects(const GrGLSLExpr4& inputColor, const GrGLSLExpr4& inputCoverage);
|
| +
|
| + /** Enables using the secondary color output and returns the name of the var in which it is
|
| + to be stored */
|
| + const char* enableSecondaryOutput();
|
| +
|
| + /** Gets the name of the primary color output. */
|
| + const char* getColorOutputName() const;
|
| +
|
| + /**
|
| + * Features that should only be enabled by GrGLFragmentShaderBuilder itself.
|
| + */
|
| + enum GLSLPrivateFeature {
|
| + kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1,
|
| + kLastGLSLPrivateFeature = kFragCoordConventions_GLSLPrivateFeature
|
| + };
|
| +
|
| + // Interpretation of DstReadKey when generating code
|
| + enum {
|
| + kNoDstRead_DstReadKey = 0,
|
| + kYesDstRead_DstReadKeyBit = 0x1, // Set if we do a dst-copy-read.
|
| + kUseAlphaConfig_DstReadKeyBit = 0x2, // Set if dst-copy config is alpha only.
|
| + kTopLeftOrigin_DstReadKeyBit = 0x4, // Set if dst-copy origin is top-left.
|
| + };
|
| +
|
| + enum {
|
| + kNoFragPosRead_FragPosKey = 0, // The fragment positition will not be needed.
|
| + kTopLeftFragPosRead_FragPosKey = 0x1,// Read frag pos relative to top-left.
|
| + kBottomLeftFragPosRead_FragPosKey = 0x2,// Read frag pos relative to bottom-left.
|
| + };
|
| +
|
| + bool fHasCustomColorOutput;
|
| + bool fHasSecondaryOutput;
|
| + bool fSetupFragPosition;
|
| + bool fTopLeftFragPosRead;
|
| +
|
| + friend class GrGLProgramBuilder;
|
| + friend class GrGLFullProgramBuilder;
|
| +
|
| + typedef GrGLShaderBuilder INHERITED;
|
| +};
|
| +
|
| +#endif
|
|
|