blob: 39d418ba6b6b75b0bcc7cc58bb91f07dbc0c29e9 [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"
9
Brian Salomon94efbf52016-11-29 13:43:05 -050010#include "GrShaderCaps.h"
joshualitt8072caa2015-02-12 14:20:52 -080011#include "gl/GrGLGpu.h"
egdaniel2d721d32015-11-11 13:06:05 -080012#include "glsl/GrGLSLFragmentShaderBuilder.h"
egdaniel7ea439b2015-12-03 09:20:44 -080013#include "glsl/GrGLSLUniformHandler.h"
egdaniel0eafe792015-11-20 14:01:22 -080014#include "glsl/GrGLSLVarying.h"
jvanverthcba99b82015-06-24 06:59:57 -070015
egdaniele659a582015-11-13 09:55:43 -080016class GrGLPathProcessor : public GrGLSLPrimitiveProcessor {
joshualitt102081a2015-09-11 11:52:17 -070017public:
18 GrGLPathProcessor() : fColor(GrColor_ILLEGAL) {}
19
20 static void GenKey(const GrPathProcessor& pathProc,
Brian Salomon94efbf52016-11-29 13:43:05 -050021 const GrShaderCaps&,
joshualitt102081a2015-09-11 11:52:17 -070022 GrProcessorKeyBuilder* b) {
Brian Salomonbfd51832017-01-04 13:22:08 -050023 b->add32(SkToInt(pathProc.viewMatrix().hasPerspective()));
joshualitt102081a2015-09-11 11:52:17 -070024 }
25
26 void emitCode(EmitArgs& args) override {
cdalton85285412016-02-18 12:37:07 -080027 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
joshualitt102081a2015-09-11 11:52:17 -070028 const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>();
29
cdaltonc08f1962016-02-12 12:14:06 -080030 if (!pathProc.viewMatrix().hasPerspective()) {
31 args.fVaryingHandler->setNoPerspective();
32 }
33
joshualitt102081a2015-09-11 11:52:17 -070034 // emit transforms
bsalomona624bf32016-09-20 09:12:47 -070035 this->emitTransforms(args.fVaryingHandler, args.fFPCoordTransformHandler);
joshualitt102081a2015-09-11 11:52:17 -070036
37 // Setup uniform color
Brian Salomonbfd51832017-01-04 13:22:08 -050038 const char* stagedLocalVarName;
39 fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderFlag,
40 kVec4f_GrSLType,
41 kDefault_GrSLPrecision,
42 "Color",
43 &stagedLocalVarName);
44 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName);
joshualitt102081a2015-09-11 11:52:17 -070045
46 // setup constant solid coverage
Brian Salomon8c852be2017-01-04 10:44:42 -050047 fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
joshualitt102081a2015-09-11 11:52:17 -070048 }
49
egdaniel0eafe792015-11-20 14:01:22 -080050 void emitTransforms(GrGLSLVaryingHandler* varyingHandler,
bsalomona624bf32016-09-20 09:12:47 -070051 FPCoordTransformHandler* transformHandler) {
52 int i = 0;
53 while (const GrCoordTransform* coordTransform = transformHandler->nextCoordTransform()) {
54 GrSLType varyingType =
55 coordTransform->getMatrix().hasPerspective() ? kVec3f_GrSLType
56 : kVec2f_GrSLType;
joshualitt102081a2015-09-11 11:52:17 -070057
bsalomona624bf32016-09-20 09:12:47 -070058 SkString strVaryingName;
59 strVaryingName.printf("TransformedCoord_%d", i);
60 GrGLSLVertToFrag v(varyingType);
61 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) varyingHandler;
62 fInstalledTransforms.push_back().fHandle =
63 glVaryingHandler->addPathProcessingVarying(strVaryingName.c_str(),
64 &v).toIndex();
65 fInstalledTransforms.back().fType = varyingType;
joshualitt102081a2015-09-11 11:52:17 -070066
bsalomona624bf32016-09-20 09:12:47 -070067 transformHandler->specifyCoordsForCurrCoordTransform(SkString(v.fsIn()), varyingType);
68 ++i;
joshualitt102081a2015-09-11 11:52:17 -070069 }
70 }
71
egdaniel018fb622015-10-28 07:26:40 -070072 void setData(const GrGLSLProgramDataManager& pd,
bsalomona624bf32016-09-20 09:12:47 -070073 const GrPrimitiveProcessor& primProc,
74 FPCoordTransformIter&& transformIter) override {
joshualitt102081a2015-09-11 11:52:17 -070075 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>();
Brian Salomonbfd51832017-01-04 13:22:08 -050076 if (pathProc.color() != fColor) {
egdaniel018fb622015-10-28 07:26:40 -070077 float c[4];
joshualitt102081a2015-09-11 11:52:17 -070078 GrColorToRGBAFloat(pathProc.color(), c);
79 pd.set4fv(fColorUniform, 1, c);
80 fColor = pathProc.color();
81 }
joshualitt102081a2015-09-11 11:52:17 -070082
bsalomona624bf32016-09-20 09:12:47 -070083 int t = 0;
84 while (const GrCoordTransform* coordTransform = transformIter.next()) {
85 SkASSERT(fInstalledTransforms[t].fHandle.isValid());
86 const SkMatrix& m = GetTransformMatrix(pathProc.localMatrix(), *coordTransform);
87 if (fInstalledTransforms[t].fCurrentValue.cheapEqualTo(m)) {
joshualitt102081a2015-09-11 11:52:17 -070088 continue;
89 }
bsalomona624bf32016-09-20 09:12:47 -070090 fInstalledTransforms[t].fCurrentValue = m;
joshualitt102081a2015-09-11 11:52:17 -070091
bsalomona624bf32016-09-20 09:12:47 -070092 SkASSERT(fInstalledTransforms[t].fType == kVec2f_GrSLType ||
93 fInstalledTransforms[t].fType == kVec3f_GrSLType);
94 unsigned components = fInstalledTransforms[t].fType == kVec2f_GrSLType ? 2 : 3;
95 pd.setPathFragmentInputTransform(fInstalledTransforms[t].fHandle, components, m);
96 ++t;
joshualitt102081a2015-09-11 11:52:17 -070097 }
98 }
99
100private:
egdanielfe8a8392016-05-09 10:22:19 -0700101 typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle;
bsalomon790c90b2016-09-12 12:56:58 -0700102 struct TransformVarying {
egdanielfe8a8392016-05-09 10:22:19 -0700103 VaryingHandle fHandle;
bsalomon790c90b2016-09-12 12:56:58 -0700104 SkMatrix fCurrentValue = SkMatrix::InvalidMatrix();
105 GrSLType fType = kVoid_GrSLType;
egdanielfe8a8392016-05-09 10:22:19 -0700106 };
107
bsalomona624bf32016-09-20 09:12:47 -0700108 SkTArray<TransformVarying, true> fInstalledTransforms;
egdanielfe8a8392016-05-09 10:22:19 -0700109
joshualitt102081a2015-09-11 11:52:17 -0700110 UniformHandle fColorUniform;
111 GrColor fColor;
112
egdaniele659a582015-11-13 09:55:43 -0800113 typedef GrGLSLPrimitiveProcessor INHERITED;
joshualitt102081a2015-09-11 11:52:17 -0700114};
115
joshualitt8072caa2015-02-12 14:20:52 -0800116GrPathProcessor::GrPathProcessor(GrColor color,
117 const SkMatrix& viewMatrix,
118 const SkMatrix& localMatrix)
Brian Salomon92aee3d2016-12-21 09:20:25 -0500119 : fColor(color)
120 , fViewMatrix(viewMatrix)
Brian Salomonecea86a2017-01-04 13:25:17 -0500121 , fLocalMatrix(localMatrix) {
joshualitt8072caa2015-02-12 14:20:52 -0800122 this->initClassID<GrPathProcessor>();
123}
124
Brian Salomon94efbf52016-11-29 13:43:05 -0500125void GrPathProcessor::getGLSLProcessorKey(const GrShaderCaps& caps,
egdaniel57d3b032015-11-13 11:57:27 -0800126 GrProcessorKeyBuilder* b) const {
joshualitt465283c2015-09-11 08:19:35 -0700127 GrGLPathProcessor::GenKey(*this, caps, b);
joshualitt8072caa2015-02-12 14:20:52 -0800128}
129
Brian Salomon94efbf52016-11-29 13:43:05 -0500130GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrShaderCaps& caps) const {
jvanverth50530632015-04-27 10:36:27 -0700131 SkASSERT(caps.pathRenderingSupport());
joshualitt465283c2015-09-11 08:19:35 -0700132 return new GrGLPathProcessor();
joshualitt8072caa2015-02-12 14:20:52 -0800133}