Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | List of all members
GrConicEffect::Impl Class Reference
Inheritance diagram for GrConicEffect::Impl:
GrGeometryProcessor::ProgramImpl

Public Member Functions

void setData (const GrGLSLProgramDataManager &pdman, const GrShaderCaps &shaderCaps, const GrGeometryProcessor &geomProc) override
 
- Public Member Functions inherited from GrGeometryProcessor::ProgramImpl
virtual ~ProgramImpl ()=default
 
std::tuple< FPCoordsMap, GrShaderVaremitCode (EmitArgs &, const GrPipeline &pipeline)
 
void emitTransformCode (GrGLSLVertexBuilder *vb, GrGLSLUniformHandler *uniformHandler)
 

Private Member Functions

void onEmitCode (EmitArgs &, GrGPArgs *) override
 

Additional Inherited Members

- Public Types inherited from GrGeometryProcessor::ProgramImpl
using UniformHandle = GrGLSLProgramDataManager::UniformHandle
 
using SamplerHandle = GrGLSLUniformHandler::SamplerHandle
 
using FPCoordsMap = std::unordered_map< const GrFragmentProcessor *, FPCoords >
 
- Static Public Member Functions inherited from GrGeometryProcessor::ProgramImpl
static uint32_t ComputeMatrixKey (const GrShaderCaps &caps, const SkMatrix &mat)
 
static uint32_t ComputeMatrixKeys (const GrShaderCaps &shaderCaps, const SkMatrix &viewMatrix, const SkMatrix &localMatrix)
 
static uint32_t AddMatrixKeys (const GrShaderCaps &shaderCaps, uint32_t flags, const SkMatrix &viewMatrix, const SkMatrix &localMatrix)
 
- Static Public Attributes inherited from GrGeometryProcessor::ProgramImpl
static constexpr int kMatrixKeyBits = 2
 
- Protected Member Functions inherited from GrGeometryProcessor::ProgramImpl
void setupUniformColor (GrGLSLFPFragmentBuilder *fragBuilder, GrGLSLUniformHandler *uniformHandler, const char *outputName, UniformHandle *colorUniform)
 
- Static Protected Member Functions inherited from GrGeometryProcessor::ProgramImpl
static void SetTransform (const GrGLSLProgramDataManager &, const GrShaderCaps &, const UniformHandle &uniform, const SkMatrix &matrix, SkMatrix *state=nullptr)
 
static void WriteOutputPosition (GrGLSLVertexBuilder *, GrGPArgs *, const char *posName)
 
static void WriteOutputPosition (GrGLSLVertexBuilder *, GrGLSLUniformHandler *, const GrShaderCaps &, GrGPArgs *, const char *posName, const SkMatrix &viewMatrix, UniformHandle *viewMatrixUniform)
 
static void WriteLocalCoord (GrGLSLVertexBuilder *, GrGLSLUniformHandler *, const GrShaderCaps &, GrGPArgs *, GrShaderVar localVar, const SkMatrix &localMatrix, UniformHandle *localMatrixUniform)
 

Detailed Description

Definition at line 24 of file GrBezierEffect.cpp.

Member Function Documentation

◆ onEmitCode()

void GrConicEffect::Impl::onEmitCode ( EmitArgs args,
GrGPArgs gpArgs 
)
overrideprivatevirtual

Implements GrGeometryProcessor::ProgramImpl.

Definition at line 59 of file GrBezierEffect.cpp.

59 {
60 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
61 const GrConicEffect& gp = args.fGeomProc.cast<GrConicEffect>();
62 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
63 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
64
65 // emit attributes
66 varyingHandler->emitAttributes(gp);
67
69 varyingHandler->addVarying("ConicCoeffs", &v);
70 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), gp.inConicCoeffs().name());
71
72 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
73 // Setup pass through color
74 fragBuilder->codeAppendf("half4 %s;", args.fOutputColor);
75 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor, &fColorUniform);
76
77 // Setup position
78 WriteOutputPosition(vertBuilder,
79 uniformHandler,
80 *args.fShaderCaps,
81 gpArgs,
82 gp.inPosition().name(),
83 gp.fViewMatrix,
84 &fViewMatrixUniform);
85 if (gp.fUsesLocalCoords) {
86 WriteLocalCoord(vertBuilder,
87 uniformHandler,
88 *args.fShaderCaps,
89 gpArgs,
90 gp.inPosition().asShaderVar(),
91 gp.fLocalMatrix,
92 &fLocalMatrixUniform);
93 }
94
95 // TODO: we should check on the number of bits float and half provide and use the smallest one
96 // that suffices. Additionally we should assert that the upstream code only lets us get here if
97 // either float or half provides the required number of bits.
98
99 GrShaderVar edgeAlpha("edgeAlpha", SkSLType::kHalf, 0);
100 GrShaderVar dklmdx("dklmdx", SkSLType::kFloat3, 0);
101 GrShaderVar dklmdy("dklmdy", SkSLType::kFloat3, 0);
102 GrShaderVar dfdx("dfdx", SkSLType::kFloat, 0);
103 GrShaderVar dfdy("dfdy", SkSLType::kFloat, 0);
104 GrShaderVar gF("gF", SkSLType::kFloat2, 0);
105 GrShaderVar gFM("gFM", SkSLType::kFloat, 0);
106 GrShaderVar func("func", SkSLType::kFloat, 0);
107
108 fragBuilder->declAppend(edgeAlpha);
109 fragBuilder->declAppend(dklmdx);
110 fragBuilder->declAppend(dklmdy);
111 fragBuilder->declAppend(dfdx);
112 fragBuilder->declAppend(dfdy);
113 fragBuilder->declAppend(gF);
114 fragBuilder->declAppend(gFM);
115 fragBuilder->declAppend(func);
116
117 fragBuilder->codeAppendf("%s = dFdx(%s.xyz);", dklmdx.c_str(), v.fsIn());
118 fragBuilder->codeAppendf("%s = dFdy(%s.xyz);", dklmdy.c_str(), v.fsIn());
119 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
120 dfdx.c_str(),
121 v.fsIn(), dklmdx.c_str(),
122 v.fsIn(), dklmdx.c_str(),
123 v.fsIn(), dklmdx.c_str());
124 fragBuilder->codeAppendf("%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
125 dfdy.c_str(),
126 v.fsIn(), dklmdy.c_str(),
127 v.fsIn(), dklmdy.c_str(),
128 v.fsIn(), dklmdy.c_str());
129 fragBuilder->codeAppendf("%s = float2(%s, %s);", gF.c_str(), dfdx.c_str(),
130 dfdy.c_str());
131 fragBuilder->codeAppendf("%s = sqrt(dot(%s, %s));",
132 gFM.c_str(), gF.c_str(), gF.c_str());
133 fragBuilder->codeAppendf("%s = %s.x*%s.x - %s.y*%s.z;",
134 func.c_str(), v.fsIn(), v.fsIn(), v.fsIn(), v.fsIn());
135 fragBuilder->codeAppendf("%s = abs(%s);", func.c_str(), func.c_str());
136 fragBuilder->codeAppendf("%s = half(%s / %s);",
137 edgeAlpha.c_str(), func.c_str(), gFM.c_str());
138 fragBuilder->codeAppendf("%s = max(1.0 - %s, 0.0);",
139 edgeAlpha.c_str(), edgeAlpha.c_str());
140 // Add line below for smooth cubic ramp
141 // fragBuilder->codeAppend("edgeAlpha = edgeAlpha*edgeAlpha*(3.0-2.0*edgeAlpha);");
142
143 // TODO should we really be doing this?
144 if (gp.fCoverageScale != 0xff) {
145 const char* coverageScale;
146 fCoverageScaleUniform = uniformHandler->addUniform(nullptr,
149 "Coverage",
150 &coverageScale);
151 fragBuilder->codeAppendf("half4 %s = half4(half(%s) * %s);",
152 args.fOutputCoverage, coverageScale, edgeAlpha.c_str());
153 } else {
154 fragBuilder->codeAppendf("half4 %s = half4(%s);", args.fOutputCoverage, edgeAlpha.c_str());
155 }
156}
@ kFragment_GrShaderFlag
void declAppend(const GrShaderVar &var)
void codeAppendf(const char format[],...) SK_PRINTF_LIKE(2
UniformHandle addUniform(const GrProcessor *owner, uint32_t visibility, SkSLType type, const char *name, const char **outName=nullptr)
constexpr const char * name() const
void setupUniformColor(GrGLSLFPFragmentBuilder *fragBuilder, GrGLSLUniformHandler *uniformHandler, const char *outputName, UniformHandle *colorUniform)
static void WriteOutputPosition(GrGLSLVertexBuilder *, GrGPArgs *, const char *posName)
static void WriteLocalCoord(GrGLSLVertexBuilder *, GrGLSLUniformHandler *, const GrShaderCaps &, GrGPArgs *, GrShaderVar localVar, const SkMatrix &localMatrix, UniformHandle *localMatrixUniform)
const T & cast() const
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args

◆ setData()

void GrConicEffect::Impl::setData ( const GrGLSLProgramDataManager ,
const GrShaderCaps ,
const GrGeometryProcessor  
)
inlineoverridevirtual

A ProgramImpl instance can be reused with any GrGeometryProcessor that produces the same key. This function reads data from a GrGeometryProcessor and updates any uniform variables required by the shaders created in emitCode(). The GrGeometryProcessor parameter is guaranteed to be of the same type and to have an identical processor key as the GrGeometryProcessor that created this ProgramImpl.

Implements GrGeometryProcessor::ProgramImpl.

Definition at line 26 of file GrBezierEffect.cpp.

28 {
29 const GrConicEffect& ce = geomProc.cast<GrConicEffect>();
30
31 SetTransform(pdman, shaderCaps, fViewMatrixUniform, ce.fViewMatrix, &fViewMatrix);
32 SetTransform(pdman, shaderCaps, fLocalMatrixUniform, ce.fLocalMatrix, &fLocalMatrix);
33
34 if (fColor != ce.fColor) {
35 pdman.set4fv(fColorUniform, 1, ce.fColor.vec());
36 fColor = ce.fColor;
37 }
38
39 if (ce.fCoverageScale != 0xff && ce.fCoverageScale != fCoverageScale) {
40 pdman.set1f(fCoverageScaleUniform, GrNormalizeByteToFloat(ce.fCoverageScale));
41 fCoverageScale = ce.fCoverageScale;
42 }
43 }
static float GrNormalizeByteToFloat(uint8_t value)
Definition GrColor.h:71
static void SetTransform(const GrGLSLProgramDataManager &, const GrShaderCaps &, const UniformHandle &uniform, const SkMatrix &matrix, SkMatrix *state=nullptr)
const float * vec() const
Definition SkColor.h:308

The documentation for this class was generated from the following file: