31 SetTransform(pdman, shaderCaps, fViewMatrixUniform, ce.fViewMatrix, &fViewMatrix);
32 SetTransform(pdman, shaderCaps, fLocalMatrixUniform, ce.fLocalMatrix, &fLocalMatrix);
34 if (fColor != ce.fColor) {
35 pdman.
set4fv(fColorUniform, 1, ce.fColor.
vec());
39 if (ce.fCoverageScale != 0xff && ce.fCoverageScale != fCoverageScale) {
41 fCoverageScale = ce.fCoverageScale;
46 void onEmitCode(EmitArgs&, GrGPArgs*)
override;
51 uint8_t fCoverageScale = 0xFF;
66 varyingHandler->emitAttributes(gp);
69 varyingHandler->addVarying(
"ConicCoeffs", &v);
82 gp.inPosition().
name(),
85 if (gp.fUsesLocalCoords) {
92 &fLocalMatrixUniform);
119 fragBuilder->
codeAppendf(
"%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
124 fragBuilder->
codeAppendf(
"%s = 2.0 * %s.x * %s.x - %s.y * %s.z - %s.z * %s.y;",
131 fragBuilder->
codeAppendf(
"%s = sqrt(dot(%s, %s));",
133 fragBuilder->
codeAppendf(
"%s = %s.x*%s.x - %s.y*%s.z;",
138 fragBuilder->
codeAppendf(
"%s = max(1.0 - %s, 0.0);",
144 if (gp.fCoverageScale != 0xff) {
145 const char* coverageScale;
146 fCoverageScaleUniform = uniformHandler->
addUniform(
nullptr,
151 fragBuilder->
codeAppendf(
"half4 %s = half4(half(%s) * %s);",
152 args.fOutputCoverage, coverageScale, edgeAlpha.
c_str());
164 key |= fCoverageScale == 0xff ? 0x8 : 0x0;
165 key |= fUsesLocalCoords ? 0x10 : 0x0;
166 key = ProgramImpl::AddMatrixKeys(caps,
175 return std::make_unique<Impl>();
179 const SkMatrix& localMatrix,
bool usesLocalCoords)
182 , fViewMatrix(viewMatrix)
183 , fLocalMatrix(viewMatrix)
184 , fUsesLocalCoords(usesLocalCoords)
185 , fCoverageScale(coverage) {
193#if defined(GR_TEST_UTILS)
196 SkMatrix viewMatrix = GrTest::TestMatrix(
d->fRandom);
197 SkMatrix localMatrix = GrTest::TestMatrix(
d->fRandom);
198 bool usesLocalCoords =
d->fRandom->nextBool();
219 SetTransform(pdman, shaderCaps, fViewMatrixUniform, qe.fViewMatrix, &fViewMatrix);
220 SetTransform(pdman, shaderCaps, fLocalMatrixUniform, qe.fLocalMatrix, &fLocalMatrix);
222 if (qe.fColor != fColor) {
223 pdman.
set4fv(fColorUniform, 1, qe.fColor.
vec());
227 if (qe.fCoverageScale != 0xff && qe.fCoverageScale != fCoverageScale) {
229 fCoverageScale = qe.fCoverageScale;
234 void onEmitCode(EmitArgs&, GrGPArgs*)
override;
239 uint8_t fCoverageScale = 0xFF;
254 varyingHandler->emitAttributes(gp);
257 varyingHandler->addVarying(
"HairQuadEdge", &v);
270 gp.inPosition().
name(),
272 &fViewMatrixUniform);
273 if (gp.fUsesLocalCoords) {
280 &fLocalMatrixUniform);
285 fragBuilder->
codeAppendf(
"half2 duvdx = half2(dFdx(%s.xy));", v.
fsIn());
286 fragBuilder->
codeAppendf(
"half2 duvdy = half2(dFdy(%s.xy));", v.
fsIn());
287 fragBuilder->
codeAppendf(
"half2 gF = half2(2.0 * %s.x * duvdx.x - duvdx.y,"
288 " 2.0 * %s.x * duvdy.x - duvdy.y);",
290 fragBuilder->
codeAppendf(
"edgeAlpha = half(%s.x * %s.x - %s.y);",
292 fragBuilder->
codeAppend(
"edgeAlpha = sqrt(edgeAlpha * edgeAlpha / dot(gF, gF));");
293 fragBuilder->
codeAppend(
"edgeAlpha = max(1.0 - edgeAlpha, 0.0);");
297 if (gp.fCoverageScale != 0xFF) {
298 const char* coverageScale;
299 fCoverageScaleUniform = uniformHandler->
addUniform(
nullptr,
304 fragBuilder->
codeAppendf(
"half4 %s = half4(%s * edgeAlpha);",
args.fOutputCoverage,
307 fragBuilder->
codeAppendf(
"half4 %s = half4(edgeAlpha);",
args.fOutputCoverage);
317 key |= fCoverageScale != 0xff ? 0x8 : 0x0;
318 key |= fUsesLocalCoords ? 0x10 : 0x0;
319 key = ProgramImpl::AddMatrixKeys(caps,
328 return std::make_unique<Impl>();
332 const SkMatrix& localMatrix,
bool usesLocalCoords)
335 , fViewMatrix(viewMatrix)
336 , fLocalMatrix(localMatrix)
337 , fUsesLocalCoords(usesLocalCoords)
338 , fCoverageScale(coverage) {
346#if defined(GR_TEST_UTILS)
349 SkMatrix viewMatrix = GrTest::TestMatrix(
d->fRandom);
350 SkMatrix localMatrix = GrTest::TestMatrix(
d->fRandom);
351 bool usesLocalCoords =
d->fRandom->nextBool();
static float GrNormalizeByteToFloat(uint8_t value)
#define GR_DEFINE_GEOMETRY_PROCESSOR_TEST(...)
constexpr SkPMColor4f SK_PMColor4fILLEGAL
void onEmitCode(EmitArgs &, GrGPArgs *) override
void setData(const GrGLSLProgramDataManager &pdman, const GrShaderCaps &shaderCaps, const GrGeometryProcessor &geomProc) override
~GrConicEffect() override
static GrGeometryProcessor * Make(SkArenaAlloc *arena, const SkPMColor4f &color, const SkMatrix &viewMatrix, const GrCaps &caps, const SkMatrix &localMatrix, bool usesLocalCoords, uint8_t coverage=0xff)
void addToKey(const GrShaderCaps &caps, skgpu::KeyBuilder *b) const override
std::unique_ptr< ProgramImpl > makeProgramImpl(const GrShaderCaps &) const override
virtual void set4fv(UniformHandle, int arrayCount, const float v[]) const =0
virtual void set1f(UniformHandle, float v0) const =0
void declAppend(const GrShaderVar &var)
void codeAppend(const char *str)
void codeAppendf(const char format[],...) SK_PRINTF_LIKE(2
const char * vsOut() const
const char * fsIn() const
GrShaderVar asShaderVar() const
constexpr const char * name() const
void setupUniformColor(GrGLSLFPFragmentBuilder *fragBuilder, GrGLSLUniformHandler *uniformHandler, const char *outputName, UniformHandle *colorUniform)
GrGLSLProgramDataManager::UniformHandle UniformHandle
static void WriteOutputPosition(GrGLSLVertexBuilder *, GrGPArgs *, const char *posName)
static void WriteLocalCoord(GrGLSLVertexBuilder *, GrGLSLUniformHandler *, const GrShaderCaps &, GrGPArgs *, GrShaderVar localVar, const SkMatrix &localMatrix, UniformHandle *localMatrixUniform)
static void SetTransform(const GrGLSLProgramDataManager &, const GrShaderCaps &, const UniformHandle &uniform, const SkMatrix &matrix, SkMatrix *state=nullptr)
void setVertexAttributesWithImplicitOffsets(const Attribute *attrs, int attrCount)
void onEmitCode(EmitArgs &, GrGPArgs *) override
void setData(const GrGLSLProgramDataManager &pdman, const GrShaderCaps &shaderCaps, const GrGeometryProcessor &geomProc) override
static GrGeometryProcessor * Make(SkArenaAlloc *arena, const SkPMColor4f &color, const SkMatrix &viewMatrix, const GrCaps &caps, const SkMatrix &localMatrix, bool usesLocalCoords, uint8_t coverage=0xff)
void addToKey(const GrShaderCaps &caps, skgpu::KeyBuilder *b) const override
std::unique_ptr< ProgramImpl > makeProgramImpl(const GrShaderCaps &) const override
const char * c_str() const
static const SkMatrix & I()
static const SkMatrix & InvalidMatrix()
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE auto & d
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const float * vec() const
static SkRGBA4f FromBytes_RGBA(uint32_t color)