blob: 0b4354c45b198c7a6c388a7c229afa774a9219ac [file] [log] [blame]
jvanverth50530632015-04-27 10:36:27 -07001/*
2* Copyright 2013 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
joshualitt8072caa2015-02-12 14:20:52 -08008#include "GrPathProcessor.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -04009
Brian Salomon94efbf52016-11-29 13:43:05 -050010#include "GrShaderCaps.h"
Hal Canaryc640d0d2018-06-13 09:59:02 -040011#include "SkTo.h"
joshualitt8072caa2015-02-12 14:20:52 -080012#include "gl/GrGLGpu.h"
Brian Salomon1471df92018-06-08 10:49:00 -040013#include "gl/GrGLVaryingHandler.h"
egdaniel2d721d32015-11-11 13:06:05 -080014#include "glsl/GrGLSLFragmentShaderBuilder.h"
Brian Salomon1471df92018-06-08 10:49:00 -040015#include "glsl/GrGLSLPrimitiveProcessor.h"
egdaniel7ea439b2015-12-03 09:20:44 -080016#include "glsl/GrGLSLUniformHandler.h"
egdaniel0eafe792015-11-20 14:01:22 -080017#include "glsl/GrGLSLVarying.h"
jvanverthcba99b82015-06-24 06:59:57 -070018
egdaniele659a582015-11-13 09:55:43 -080019class GrGLPathProcessor : public GrGLSLPrimitiveProcessor {
joshualitt102081a2015-09-11 11:52:17 -070020public:
21 GrGLPathProcessor() : fColor(GrColor_ILLEGAL) {}
22
23 static void GenKey(const GrPathProcessor& pathProc,
Brian Salomon94efbf52016-11-29 13:43:05 -050024 const GrShaderCaps&,
joshualitt102081a2015-09-11 11:52:17 -070025 GrProcessorKeyBuilder* b) {
Brian Salomonbfd51832017-01-04 13:22:08 -050026 b->add32(SkToInt(pathProc.viewMatrix().hasPerspective()));
joshualitt102081a2015-09-11 11:52:17 -070027 }
28
29 void emitCode(EmitArgs& args) override {
Chris Dalton60283612018-02-14 13:38:14 -070030 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt102081a2015-09-11 11:52:17 -070031 const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>();
32
cdaltonc08f1962016-02-12 12:14:06 -080033 if (!pathProc.viewMatrix().hasPerspective()) {
34 args.fVaryingHandler->setNoPerspective();
35 }
36
joshualitt102081a2015-09-11 11:52:17 -070037 // emit transforms
bsalomona624bf32016-09-20 09:12:47 -070038 this->emitTransforms(args.fVaryingHandler, args.fFPCoordTransformHandler);
joshualitt102081a2015-09-11 11:52:17 -070039
40 // Setup uniform color
Brian Salomonbfd51832017-01-04 13:22:08 -050041 const char* stagedLocalVarName;
42 fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholasf7b88202017-09-18 14:10:39 -040043 kHalf4_GrSLType,
Brian Salomonbfd51832017-01-04 13:22:08 -050044 "Color",
45 &stagedLocalVarName);
46 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName);
joshualitt102081a2015-09-11 11:52:17 -070047
48 // setup constant solid coverage
Ethan Nicholasf7b88202017-09-18 14:10:39 -040049 fragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage);
joshualitt102081a2015-09-11 11:52:17 -070050 }
51
egdaniel0eafe792015-11-20 14:01:22 -080052 void emitTransforms(GrGLSLVaryingHandler* varyingHandler,
bsalomona624bf32016-09-20 09:12:47 -070053 FPCoordTransformHandler* transformHandler) {
54 int i = 0;
55 while (const GrCoordTransform* coordTransform = transformHandler->nextCoordTransform()) {
56 GrSLType varyingType =
Ethan Nicholasf7b88202017-09-18 14:10:39 -040057 coordTransform->getMatrix().hasPerspective() ? kHalf3_GrSLType
58 : kHalf2_GrSLType;
joshualitt102081a2015-09-11 11:52:17 -070059
bsalomona624bf32016-09-20 09:12:47 -070060 SkString strVaryingName;
61 strVaryingName.printf("TransformedCoord_%d", i);
Chris Dalton27372882017-12-08 13:34:21 -070062 GrGLSLVarying v(varyingType);
bsalomona624bf32016-09-20 09:12:47 -070063 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) varyingHandler;
64 fInstalledTransforms.push_back().fHandle =
65 glVaryingHandler->addPathProcessingVarying(strVaryingName.c_str(),
66 &v).toIndex();
67 fInstalledTransforms.back().fType = varyingType;
joshualitt102081a2015-09-11 11:52:17 -070068
bsalomona624bf32016-09-20 09:12:47 -070069 transformHandler->specifyCoordsForCurrCoordTransform(SkString(v.fsIn()), varyingType);
70 ++i;
joshualitt102081a2015-09-11 11:52:17 -070071 }
72 }
73
egdaniel018fb622015-10-28 07:26:40 -070074 void setData(const GrGLSLProgramDataManager& pd,
bsalomona624bf32016-09-20 09:12:47 -070075 const GrPrimitiveProcessor& primProc,
76 FPCoordTransformIter&& transformIter) override {
joshualitt102081a2015-09-11 11:52:17 -070077 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>();
Brian Salomonbfd51832017-01-04 13:22:08 -050078 if (pathProc.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -070079 float c[4];
joshualitt102081a2015-09-11 11:52:17 -070080 GrColorToRGBAFloat(pathProc.color(), c);
81 pd.set4fv(fColorUniform, 1, c);
82 fColor = pathProc.color();
83 }
joshualitt102081a2015-09-11 11:52:17 -070084
bsalomona624bf32016-09-20 09:12:47 -070085 int t = 0;
86 while (const GrCoordTransform* coordTransform = transformIter.next()) {
87 SkASSERT(fInstalledTransforms[t].fHandle.isValid());
88 const SkMatrix& m = GetTransformMatrix(pathProc.localMatrix(), *coordTransform);
89 if (fInstalledTransforms[t].fCurrentValue.cheapEqualTo(m)) {
joshualitt102081a2015-09-11 11:52:17 -070090 continue;
91 }
bsalomona624bf32016-09-20 09:12:47 -070092 fInstalledTransforms[t].fCurrentValue = m;
joshualitt102081a2015-09-11 11:52:17 -070093
Ethan Nicholasf7b88202017-09-18 14:10:39 -040094 SkASSERT(fInstalledTransforms[t].fType == kHalf2_GrSLType ||
95 fInstalledTransforms[t].fType == kHalf3_GrSLType);
96 unsigned components = fInstalledTransforms[t].fType == kHalf2_GrSLType ? 2 : 3;
bsalomona624bf32016-09-20 09:12:47 -070097 pd.setPathFragmentInputTransform(fInstalledTransforms[t].fHandle, components, m);
98 ++t;
joshualitt102081a2015-09-11 11:52:17 -070099 }
100 }
101
102private:
egdanielfe8a8392016-05-09 10:22:19 -0700103 typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle;
bsalomon790c90b2016-09-12 12:56:58 -0700104 struct TransformVarying {
egdanielfe8a8392016-05-09 10:22:19 -0700105 VaryingHandle fHandle;
bsalomon790c90b2016-09-12 12:56:58 -0700106 SkMatrix fCurrentValue = SkMatrix::InvalidMatrix();
107 GrSLType fType = kVoid_GrSLType;
egdanielfe8a8392016-05-09 10:22:19 -0700108 };
109
bsalomona624bf32016-09-20 09:12:47 -0700110 SkTArray<TransformVarying, true> fInstalledTransforms;
egdanielfe8a8392016-05-09 10:22:19 -0700111
joshualitt102081a2015-09-11 11:52:17 -0700112 UniformHandle fColorUniform;
113 GrColor fColor;
114
egdaniele659a582015-11-13 09:55:43 -0800115 typedef GrGLSLPrimitiveProcessor INHERITED;
joshualitt102081a2015-09-11 11:52:17 -0700116};
117
joshualitt8072caa2015-02-12 14:20:52 -0800118GrPathProcessor::GrPathProcessor(GrColor color,
119 const SkMatrix& viewMatrix,
120 const SkMatrix& localMatrix)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400121 : INHERITED(kGrPathProcessor_ClassID)
122 , fColor(color)
Brian Salomon92aee3d2016-12-21 09:20:25 -0500123 , fViewMatrix(viewMatrix)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400124 , fLocalMatrix(localMatrix) {}
joshualitt8072caa2015-02-12 14:20:52 -0800125
Brian Salomon94efbf52016-11-29 13:43:05 -0500126void GrPathProcessor::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800127 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700128 GrGLPathProcessor::GenKey(*this, caps, b);
joshualitt8072caa2015-02-12 14:20:52 -0800129}
130
Brian Salomon94efbf52016-11-29 13:43:05 -0500131GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrShaderCaps& caps) const {
jvanverth50530632015-04-27 10:36:27 -0700132 SkASSERT(caps.pathRenderingSupport());
joshualitt465283c2015-09-11 08:19:35 -0700133 return new GrGLPathProcessor();
joshualitt8072caa2015-02-12 14:20:52 -0800134}