| Index: src/gpu/gl/builders/GrGLProgramBuilder.h
|
| diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.h b/src/gpu/gl/builders/GrGLProgramBuilder.h
|
| index 3a1a50e45320d2bedb10e9b1106c67fad652aaae..c524f59e01910ac9bd0e78ded54872609a5528a3 100644
|
| --- a/src/gpu/gl/builders/GrGLProgramBuilder.h
|
| +++ b/src/gpu/gl/builders/GrGLProgramBuilder.h
|
| @@ -8,10 +8,8 @@
|
| #ifndef GrGLProgramBuilder_DEFINED
|
| #define GrGLProgramBuilder_DEFINED
|
|
|
| -#include "GrGLFragmentShaderBuilder.h"
|
| -#include "GrGLGeometryShaderBuilder.h"
|
| -#include "GrGLVertexShaderBuilder.h"
|
| #include "gl/GrGLProgramDataManager.h"
|
| +#include "glsl/GrGLSLProgramBuilder.h"
|
| #include "glsl/GrGLSLProgramDataManager.h"
|
| #include "glsl/GrGLSLTextureSampler.h"
|
| #include "../GrGLPrimitiveProcessor.h"
|
| @@ -20,199 +18,12 @@
|
|
|
| class GrFragmentProcessor;
|
| class GrGLContextInfo;
|
| +class GrGLShaderBuilder;
|
| class GrGLSLCaps;
|
|
|
| // Enough precision to represent 1 / 2048 accurately in printf
|
| #define GR_SIGNIFICANT_POW2_DECIMAL_DIG 11
|
|
|
| -/*
|
| - * This is the base class for a series of interfaces. This base class *MUST* remain abstract with
|
| - * NO data members because it is used in multiple interface inheritance.
|
| - * Heirarchy:
|
| - * GrGLUniformBuilder
|
| - * / \
|
| - * GrGLFPBuilder GrGLGPBuilder
|
| - * \ /
|
| - * GrGLProgramBuilder(internal use only)
|
| - */
|
| -class GrGLUniformBuilder {
|
| -public:
|
| - enum ShaderVisibility {
|
| - kVertex_Visibility = 1 << kVertex_GrShaderType,
|
| - kGeometry_Visibility = 1 << kGeometry_GrShaderType,
|
| - kFragment_Visibility = 1 << kFragment_GrShaderType,
|
| - };
|
| -
|
| - virtual ~GrGLUniformBuilder() {}
|
| -
|
| - typedef GrGLSLProgramDataManager::UniformHandle UniformHandle;
|
| - typedef GrGLSLProgramDataManager::SeparableVaryingHandle SeparableVaryingHandle;
|
| -
|
| - /** Add a uniform variable to the current program, that has visibility in one or more shaders.
|
| - visibility is a bitfield of ShaderVisibility values indicating from which shaders the
|
| - uniform should be accessible. At least one bit must be set. Geometry shader uniforms are not
|
| - supported at this time. The actual uniform name will be mangled. If outName is not nullptr then
|
| - it will refer to the final uniform name after return. Use the addUniformArray variant to add
|
| - an array of uniforms. */
|
| - UniformHandle addUniform(uint32_t visibility,
|
| - GrSLType type,
|
| - GrSLPrecision precision,
|
| - const char* name,
|
| - const char** outName = nullptr) {
|
| - return this->addUniformArray(visibility, type, precision, name, 0, outName);
|
| - }
|
| -
|
| - virtual UniformHandle addUniformArray(
|
| - uint32_t visibility,
|
| - GrSLType type,
|
| - GrSLPrecision precision,
|
| - const char* name,
|
| - int arrayCount,
|
| - const char** outName = nullptr) {
|
| - return this->internalAddUniformArray(visibility, type, precision, name, true, arrayCount,
|
| - outName);
|
| - }
|
| -
|
| -
|
| - virtual const GrGLSLShaderVar& getUniformVariable(UniformHandle u) const = 0;
|
| -
|
| - /**
|
| - * Shortcut for getUniformVariable(u).c_str()
|
| - */
|
| - virtual const char* getUniformCStr(UniformHandle u) const = 0;
|
| -
|
| - virtual const GrGLContextInfo& ctxInfo() const = 0;
|
| -
|
| - virtual const GrGLSLCaps* glslCaps() const = 0;
|
| -
|
| - virtual GrGLGpu* gpu() const = 0;
|
| -
|
| - /*
|
| - * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
|
| - */
|
| -private:
|
| - virtual UniformHandle internalAddUniformArray(
|
| - uint32_t visibility,
|
| - GrSLType type,
|
| - GrSLPrecision precision,
|
| - const char* name,
|
| - bool mangleName,
|
| - int arrayCount,
|
| - const char** outName) = 0;
|
| -};
|
| -
|
| -// TODO move this into GrGLGPBuilder and move them both out of this file
|
| -class GrGLVarying {
|
| -public:
|
| - bool vsVarying() const { return kVertToFrag_Varying == fVarying ||
|
| - kVertToGeo_Varying == fVarying; }
|
| - bool fsVarying() const { return kVertToFrag_Varying == fVarying ||
|
| - kGeoToFrag_Varying == fVarying; }
|
| - const char* vsOut() const { return fVsOut; }
|
| - const char* gsIn() const { return fGsIn; }
|
| - const char* gsOut() const { return fGsOut; }
|
| - const char* fsIn() const { return fFsIn; }
|
| - GrSLType type() const { return fType; }
|
| -
|
| -protected:
|
| - enum Varying {
|
| - kVertToFrag_Varying,
|
| - kVertToGeo_Varying,
|
| - kGeoToFrag_Varying,
|
| - };
|
| -
|
| - GrGLVarying(GrSLType type, Varying varying)
|
| - : fVarying(varying), fType(type), fVsOut(nullptr), fGsIn(nullptr), fGsOut(nullptr),
|
| - fFsIn(nullptr) {}
|
| -
|
| - Varying fVarying;
|
| -
|
| -private:
|
| - GrSLType fType;
|
| - const char* fVsOut;
|
| - const char* fGsIn;
|
| - const char* fGsOut;
|
| - const char* fFsIn;
|
| -
|
| - friend class GrGLVertexBuilder;
|
| - friend class GrGLGeometryBuilder;
|
| - friend class GrGLXferBuilder;
|
| - friend class GrGLFragmentShaderBuilder;
|
| -};
|
| -
|
| -struct GrGLVertToFrag : public GrGLVarying {
|
| - GrGLVertToFrag(GrSLType type)
|
| - : GrGLVarying(type, kVertToFrag_Varying) {}
|
| -};
|
| -
|
| -struct GrGLVertToGeo : public GrGLVarying {
|
| - GrGLVertToGeo(GrSLType type)
|
| - : GrGLVarying(type, kVertToGeo_Varying) {}
|
| -};
|
| -
|
| -struct GrGLGeoToFrag : public GrGLVarying {
|
| - GrGLGeoToFrag(GrSLType type)
|
| - : GrGLVarying(type, kGeoToFrag_Varying) {}
|
| -};
|
| -
|
| -/* a specialization of the above for GPs. Lets the user add uniforms, varyings, and VS / FS code */
|
| -class GrGLGPBuilder : public virtual GrGLUniformBuilder {
|
| -public:
|
| - /*
|
| - * addVarying allows fine grained control for setting up varyings between stages. If you just
|
| - * need to take an attribute and pass it through to an output value in a fragment shader, use
|
| - * addPassThroughAttribute.
|
| - * TODO convert most uses of addVarying to addPassThroughAttribute
|
| - */
|
| - virtual void addVarying(const char* name,
|
| - GrGLVarying*,
|
| - GrSLPrecision precision = kDefault_GrSLPrecision) = 0;
|
| -
|
| - /*
|
| - * This call can be used by GP to pass an attribute through all shaders directly to 'output' in
|
| - * the fragment shader. Though this call effects both the vertex shader and fragment shader,
|
| - * it expects 'output' to be defined in the fragment shader before this call is made.
|
| - * TODO it might be nicer behavior to have a flag to declare output inside this call
|
| - */
|
| - virtual void addPassThroughAttribute(const GrGeometryProcessor::Attribute*,
|
| - const char* output) = 0;
|
| -
|
| - /*
|
| - * Creates a fragment shader varying that can be referred to.
|
| - * Comparable to GrGLUniformBuilder::addUniform().
|
| - */
|
| - virtual SeparableVaryingHandle addSeparableVarying(
|
| - const char* name, GrGLVertToFrag*, GrSLPrecision fsPrecision = kDefault_GrSLPrecision) = 0;
|
| -
|
| - // TODO rename getFragmentBuilder
|
| - virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
|
| - virtual GrGLVertexBuilder* getVertexShaderBuilder() = 0;
|
| -
|
| - /*
|
| - * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
|
| - */
|
| -};
|
| -
|
| -/* a specializations for FPs. Lets the user add uniforms and FS code */
|
| -class GrGLFPBuilder : public virtual GrGLUniformBuilder {
|
| -public:
|
| - virtual GrGLFragmentBuilder* getFragmentShaderBuilder() = 0;
|
| -
|
| - /*
|
| - * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
|
| - */
|
| -};
|
| -
|
| -/* a specializations for XPs. Lets the user add uniforms and FS code */
|
| -class GrGLXPBuilder : public virtual GrGLUniformBuilder {
|
| -public:
|
| - virtual GrGLXPFragmentBuilder* getFragmentShaderBuilder() = 0;
|
| -
|
| - /*
|
| - * *NOTE* NO MEMBERS ALLOWED, MULTIPLE INHERITANCE
|
| - */
|
| -};
|
| -
|
| /**
|
| * The below struct represent processors installed in programs.
|
| */
|
| @@ -238,11 +49,8 @@ struct GrGLInstalledFragProcs : public SkRefCnt {
|
| * each of the elements of the shader pipeline, ie vertex, fragment, geometry, etc, lives in those
|
| * respective builders
|
| */
|
| -class GrGLProgramBuilder : public GrGLGPBuilder,
|
| - public GrGLFPBuilder,
|
| - public GrGLXPBuilder {
|
| +class GrGLProgramBuilder : public GrGLSLProgramBuilder {
|
| public:
|
| - typedef GrGpu::DrawArgs DrawArgs;
|
| /** Generates a shader program.
|
| *
|
| * The program implements what is specified in the stages given as input.
|
| @@ -260,18 +68,13 @@ public:
|
| return this->getUniformVariable(u).c_str();
|
| }
|
|
|
| - const GrGLContextInfo& ctxInfo() const override;
|
| -
|
| const GrGLSLCaps* glslCaps() const override;
|
|
|
| - GrGLGpu* gpu() const override { return fGpu; }
|
| -
|
| - GrGLXPFragmentBuilder* getFragmentShaderBuilder() override { return &fFS; }
|
| - GrGLVertexBuilder* getVertexShaderBuilder() override { return &fVS; }
|
| + GrGLGpu* gpu() const { return fGpu; }
|
|
|
| void addVarying(
|
| const char* name,
|
| - GrGLVarying*,
|
| + GrGLSLVarying*,
|
| GrSLPrecision precision = kDefault_GrSLPrecision) override;
|
|
|
| void addPassThroughAttribute(const GrPrimitiveProcessor::Attribute*,
|
| @@ -279,19 +82,10 @@ public:
|
|
|
| SeparableVaryingHandle addSeparableVarying(
|
| const char* name,
|
| - GrGLVertToFrag*,
|
| + GrGLSLVertToFrag*,
|
| GrSLPrecision fsPrecision = kDefault_GrSLPrecision) override;
|
|
|
| - // Handles for program uniforms (other than per-effect uniforms)
|
| - struct BuiltinUniformHandles {
|
| - UniformHandle fRTAdjustmentUni;
|
| -
|
| - // We use the render target height to provide a y-down frag coord when specifying
|
| - // origin_upper_left is not supported.
|
| - UniformHandle fRTHeightUni;
|
| - };
|
| -
|
| -protected:
|
| +private:
|
| typedef GrGLProgramDataManager::UniformInfo UniformInfo;
|
| typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
|
| typedef GrGLProgramDataManager::SeparableVaryingInfo SeparableVaryingInfo;
|
| @@ -299,11 +93,6 @@ protected:
|
|
|
| GrGLProgramBuilder(GrGLGpu*, const DrawArgs&);
|
|
|
| - const GrPrimitiveProcessor& primitiveProcessor() const { return *fArgs.fPrimitiveProcessor; }
|
| - const GrPipeline& pipeline() const { return *fArgs.fPipeline; }
|
| - const GrProgramDesc& desc() const { return *fArgs.fDesc; }
|
| - const GrProgramDesc::KeyHeader& header() const { return fArgs.fDesc->header(); }
|
| -
|
| UniformHandle internalAddUniformArray(uint32_t visibility,
|
| GrSLType type,
|
| GrSLPrecision precision,
|
| @@ -312,20 +101,6 @@ protected:
|
| int arrayCount,
|
| const char** outName) override;
|
|
|
| - // Used to add a uniform for frag position without mangling the name of the uniform inside of a
|
| - // stage.
|
| - UniformHandle addFragPosUniform(uint32_t visibility,
|
| - GrSLType type,
|
| - GrSLPrecision precision,
|
| - const char* name,
|
| - const char** outName) {
|
| - return this->internalAddUniformArray(visibility, type, precision, name, false, 0, outName);
|
| - }
|
| -
|
| - // Generates a name for a variable. The generated string will be name prefixed by the prefix
|
| - // char (unless the prefix is '\0'). It also will mangle the name to be stage-specific unless
|
| - // explicitly asked not to.
|
| - void nameVariable(SkString* out, char prefix, const char* name, bool mangle = true);
|
| // Generates a possibly mangled name for a stage variable and writes it to the fragment shader.
|
| // If GrGLSLExpr4 has a valid name then it will use that instead
|
| void nameExpression(GrGLSLExpr4*, const char* baseName);
|
| @@ -365,16 +140,16 @@ protected:
|
| GrGLenum type,
|
| SkTDArray<GrGLuint>* shaderIds);
|
| GrGLProgram* finalize();
|
| - virtual void bindProgramResourceLocations(GrGLuint programID);
|
| + void bindProgramResourceLocations(GrGLuint programID);
|
| bool checkLinkStatus(GrGLuint programID);
|
| - virtual void resolveProgramResourceLocations(GrGLuint programID);
|
| + void resolveProgramResourceLocations(GrGLuint programID);
|
| void cleanupProgram(GrGLuint programID, const SkTDArray<GrGLuint>& shaderIDs);
|
| void cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs);
|
|
|
| // Subclasses create different programs
|
| - virtual GrGLProgram* createProgram(GrGLuint programID);
|
| + GrGLProgram* createProgram(GrGLuint programID);
|
|
|
| - void appendUniformDecls(ShaderVisibility, SkString*) const;
|
| + void onAppendUniformDecls(ShaderVisibility visibility, SkString* out) const override;
|
|
|
| // reset is called by program creator between each processor's emit code. It increments the
|
| // stage offset for variable name mangling, and also ensures verfication variables in the
|
| @@ -397,24 +172,11 @@ protected:
|
| private:
|
| GrGLProgramBuilder* fPB;
|
| };
|
| - int stageIndex() const { return fStageIndex; }
|
| -
|
| - const char* rtAdjustment() const { return "rtAdjustment"; }
|
| -
|
| - // number of each input/output type in a single allocation block, used by many builders
|
| - static const int kVarsPerBlock;
|
| -
|
| - BuiltinUniformHandles fUniformHandles;
|
| - GrGLVertexBuilder fVS;
|
| - GrGLGeometryBuilder fGS;
|
| - GrGLFragmentShaderBuilder fFS;
|
| - int fStageIndex;
|
|
|
| GrGLInstalledGeoProc* fGeometryProcessor;
|
| GrGLInstalledXferProc* fXferProcessor;
|
| SkAutoTUnref<GrGLInstalledFragProcs> fFragmentProcessors;
|
|
|
| - const DrawArgs& fArgs;
|
| GrGLGpu* fGpu;
|
| UniformInfoArray fUniforms;
|
| GrGLPrimitiveProcessor::TransformsIn fCoordTransforms;
|
| @@ -426,5 +188,7 @@ protected:
|
| friend class GrGLVertexBuilder;
|
| friend class GrGLFragmentShaderBuilder;
|
| friend class GrGLGeometryBuilder;
|
| +
|
| + typedef GrGLSLProgramBuilder INHERITED;
|
| };
|
| #endif
|
|
|