OLD | NEW |
| (Empty) |
1 /* | |
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 | |
8 #include "GrGLPathProcessor.h" | |
9 | |
10 #include "GrPathProcessor.h" | |
11 #include "GrGLGpu.h" | |
12 #include "GrGLPathRendering.h" | |
13 | |
14 GrGLPathProcessor::GrGLPathProcessor() | |
15 : fColor(GrColor_ILLEGAL) {} | |
16 | |
17 void GrGLPathProcessor::emitCode(EmitArgs& args) { | |
18 GrGLGPBuilder* pb = args.fPB; | |
19 GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | |
20 const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>(); | |
21 | |
22 // emit transforms | |
23 this->emitTransforms(args.fPB, args.fTransformsIn, args.fTransformsOut); | |
24 | |
25 // Setup uniform color | |
26 if (pathProc.opts().readsColor()) { | |
27 const char* stagedLocalVarName; | |
28 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, | |
29 kVec4f_GrSLType, | |
30 kDefault_GrSLPrecision, | |
31 "Color", | |
32 &stagedLocalVarName); | |
33 fs->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName); | |
34 } | |
35 | |
36 // setup constant solid coverage | |
37 if (pathProc.opts().readsCoverage()) { | |
38 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | |
39 } | |
40 } | |
41 | |
42 void GrGLPathProcessor::GenKey(const GrPathProcessor& pathProc, | |
43 const GrGLSLCaps&, | |
44 GrProcessorKeyBuilder* b) { | |
45 b->add32(SkToInt(pathProc.opts().readsColor()) | | |
46 SkToInt(pathProc.opts().readsCoverage()) << 16); | |
47 } | |
48 | |
49 void GrGLPathProcessor::setData(const GrGLProgramDataManager& pdman, | |
50 const GrPrimitiveProcessor& primProc) { | |
51 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); | |
52 if (pathProc.opts().readsColor() && pathProc.color() != fColor) { | |
53 GrGLfloat c[4]; | |
54 GrColorToRGBAFloat(pathProc.color(), c); | |
55 pdman.set4fv(fColorUniform, 1, c); | |
56 fColor = pathProc.color(); | |
57 } | |
58 } | |
59 | |
60 void GrGLPathProcessor::emitTransforms(GrGLGPBuilder* pb, const TransformsIn& ti
n, | |
61 TransformsOut* tout) { | |
62 tout->push_back_n(tin.count()); | |
63 fInstalledTransforms.push_back_n(tin.count()); | |
64 for (int i = 0; i < tin.count(); i++) { | |
65 const ProcCoords& coordTransforms = tin[i]; | |
66 fInstalledTransforms[i].push_back_n(coordTransforms.count()); | |
67 for (int t = 0; t < coordTransforms.count(); t++) { | |
68 GrSLType varyingType = | |
69 coordTransforms[t]->getMatrix().hasPerspective() ? kVec3f_Gr
SLType : | |
70 kVec2f_Gr
SLType; | |
71 | |
72 SkString strVaryingName("MatrixCoord"); | |
73 strVaryingName.appendf("_%i_%i", i, t); | |
74 GrGLVertToFrag v(varyingType); | |
75 fInstalledTransforms[i][t].fHandle = | |
76 pb->addSeparableVarying(strVaryingName.c_str(), &v).toIndex(
); | |
77 fInstalledTransforms[i][t].fType = varyingType; | |
78 | |
79 SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCoords
, | |
80 (SkString(v.fsIn()), varyingType)); | |
81 } | |
82 } | |
83 } | |
84 | |
85 void GrGLPathProcessor::setTransformData( | |
86 const GrPrimitiveProcessor& primProc, | |
87 const GrGLProgramDataManager& pdman, | |
88 int index, | |
89 const SkTArray<const GrCoordTransform*, true>& coordTransforms) { | |
90 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); | |
91 SkSTArray<2, Transform, true>& transforms = fInstalledTransforms[index]; | |
92 int numTransforms = transforms.count(); | |
93 for (int t = 0; t < numTransforms; ++t) { | |
94 SkASSERT(transforms[t].fHandle.isValid()); | |
95 const SkMatrix& transform = GetTransformMatrix(pathProc.localMatrix(), | |
96 *coordTransforms[t]); | |
97 if (transforms[t].fCurrentValue.cheapEqualTo(transform)) { | |
98 continue; | |
99 } | |
100 transforms[t].fCurrentValue = transform; | |
101 | |
102 SkASSERT(transforms[t].fType == kVec2f_GrSLType || | |
103 transforms[t].fType == kVec3f_GrSLType); | |
104 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3; | |
105 pdman.setPathFragmentInputTransform(transforms[t].fHandle, components, t
ransform); | |
106 } | |
107 } | |
OLD | NEW |