Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(192)

Side by Side Diff: src/gpu/GrPathProcessor.cpp

Issue 2351753002: Revert of Stop flattening GrCoordTransforms in parent GrFragmentProcessors. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrOvalRenderer.cpp ('k') | src/gpu/GrProgramDesc.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrPathProcessor.h" 8 #include "GrPathProcessor.h"
9 9
10 #include "gl/GrGLGpu.h" 10 #include "gl/GrGLGpu.h"
(...skipping 16 matching lines...) Expand all
27 27
28 void emitCode(EmitArgs& args) override { 28 void emitCode(EmitArgs& args) override {
29 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; 29 GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder;
30 const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>(); 30 const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>();
31 31
32 if (!pathProc.viewMatrix().hasPerspective()) { 32 if (!pathProc.viewMatrix().hasPerspective()) {
33 args.fVaryingHandler->setNoPerspective(); 33 args.fVaryingHandler->setNoPerspective();
34 } 34 }
35 35
36 // emit transforms 36 // emit transforms
37 this->emitTransforms(args.fVaryingHandler, args.fFPCoordTransformHandler ); 37 this->emitTransforms(args.fVaryingHandler, args.fTransformsIn, args.fTra nsformsOut);
38 38
39 // Setup uniform color 39 // Setup uniform color
40 if (pathProc.overrides().readsColor()) { 40 if (pathProc.overrides().readsColor()) {
41 const char* stagedLocalVarName; 41 const char* stagedLocalVarName;
42 fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderF lag, 42 fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderF lag,
43 kVec4f_GrSLType, 43 kVec4f_GrSLType,
44 kDefault_GrSLPrecis ion, 44 kDefault_GrSLPrecis ion,
45 "Color", 45 "Color",
46 &stagedLocalVarName ); 46 &stagedLocalVarName );
47 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalV arName); 47 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalV arName);
48 } 48 }
49 49
50 // setup constant solid coverage 50 // setup constant solid coverage
51 if (pathProc.overrides().readsCoverage()) { 51 if (pathProc.overrides().readsCoverage()) {
52 fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 52 fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
53 } 53 }
54 } 54 }
55 55
56 void emitTransforms(GrGLSLVaryingHandler* varyingHandler, 56 void emitTransforms(GrGLSLVaryingHandler* varyingHandler,
57 FPCoordTransformHandler* transformHandler) { 57 const TransformsIn& tin,
58 int i = 0; 58 TransformsOut* tout) {
59 while (const GrCoordTransform* coordTransform = transformHandler->nextCo ordTransform()) { 59 tout->push_back_n(tin.count());
60 GrSLType varyingType = 60 fInstalledTransforms.push_back_n(tin.count());
61 coordTransform->getMatrix().hasPerspective() ? kVec3f_GrSLTy pe 61 for (int i = 0; i < tin.count(); i++) {
62 : kVec2f_GrSLTy pe; 62 const ProcCoords& coordTransforms = tin[i];
63 fInstalledTransforms[i].push_back_n(coordTransforms.count());
64 for (int t = 0; t < coordTransforms.count(); t++) {
65 GrSLType varyingType =
66 coordTransforms[t]->getMatrix().hasPerspective() ? kVec3 f_GrSLType :
67 kVec2 f_GrSLType;
63 68
64 SkString strVaryingName; 69 SkString strVaryingName("MatrixCoord");
65 strVaryingName.printf("TransformedCoord_%d", i); 70 strVaryingName.appendf("_%i_%i", i, t);
66 GrGLSLVertToFrag v(varyingType); 71 GrGLSLVertToFrag v(varyingType);
67 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) varying Handler; 72 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) var yingHandler;
68 fInstalledTransforms.push_back().fHandle = 73 fInstalledTransforms[i][t].fHandle =
69 glVaryingHandler->addPathProcessingVarying(strVaryingName.c_ str(), 74 glVaryingHandler->addPathProcessingVarying(strVaryingNam e.c_str(),
70 &v).toIndex(); 75 &v).toIndex() ;
71 fInstalledTransforms.back().fType = varyingType; 76 fInstalledTransforms[i][t].fType = varyingType;
72 77
73 transformHandler->specifyCoordsForCurrCoordTransform(SkString(v.fsIn ()), varyingType); 78 (*tout)[i].emplace_back(SkString(v.fsIn()), varyingType);
74 ++i; 79 }
75 } 80 }
76 } 81 }
77 82
78 void setData(const GrGLSLProgramDataManager& pd, 83 void setData(const GrGLSLProgramDataManager& pd,
79 const GrPrimitiveProcessor& primProc, 84 const GrPrimitiveProcessor& primProc) override {
80 FPCoordTransformIter&& transformIter) override {
81 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); 85 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>();
82 if (pathProc.overrides().readsColor() && pathProc.color() != fColor) { 86 if (pathProc.overrides().readsColor() && pathProc.color() != fColor) {
83 float c[4]; 87 float c[4];
84 GrColorToRGBAFloat(pathProc.color(), c); 88 GrColorToRGBAFloat(pathProc.color(), c);
85 pd.set4fv(fColorUniform, 1, c); 89 pd.set4fv(fColorUniform, 1, c);
86 fColor = pathProc.color(); 90 fColor = pathProc.color();
87 } 91 }
92 }
88 93
89 int t = 0; 94 void setTransformData(const GrPrimitiveProcessor& primProc,
90 while (const GrCoordTransform* coordTransform = transformIter.next()) { 95 const GrGLSLProgramDataManager& pdman,
91 SkASSERT(fInstalledTransforms[t].fHandle.isValid()); 96 int index,
92 const SkMatrix& m = GetTransformMatrix(pathProc.localMatrix(), *coor dTransform); 97 const SkTArray<const GrCoordTransform*, true>& coordTr ansforms) override {
93 if (fInstalledTransforms[t].fCurrentValue.cheapEqualTo(m)) { 98 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>();
99 SkTArray<TransformVarying, true>& transforms = fInstalledTransforms[inde x];
100 int numTransforms = transforms.count();
101 for (int t = 0; t < numTransforms; ++t) {
102 SkASSERT(transforms[t].fHandle.isValid());
103 const SkMatrix& transform = GetTransformMatrix(pathProc.localMatrix( ),
104 *coordTransforms[t]);
105 if (transforms[t].fCurrentValue.cheapEqualTo(transform)) {
94 continue; 106 continue;
95 } 107 }
96 fInstalledTransforms[t].fCurrentValue = m; 108 transforms[t].fCurrentValue = transform;
97 109
98 SkASSERT(fInstalledTransforms[t].fType == kVec2f_GrSLType || 110 SkASSERT(transforms[t].fType == kVec2f_GrSLType ||
99 fInstalledTransforms[t].fType == kVec3f_GrSLType); 111 transforms[t].fType == kVec3f_GrSLType);
100 unsigned components = fInstalledTransforms[t].fType == kVec2f_GrSLTy pe ? 2 : 3; 112 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3 ;
101 pd.setPathFragmentInputTransform(fInstalledTransforms[t].fHandle, co mponents, m); 113 pdman.setPathFragmentInputTransform(transforms[t].fHandle, component s, transform);
102 ++t;
103 } 114 }
104 } 115 }
105 116
106 private: 117 private:
107 typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle; 118 typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle;
108 struct TransformVarying { 119 struct TransformVarying {
109 VaryingHandle fHandle; 120 VaryingHandle fHandle;
110 SkMatrix fCurrentValue = SkMatrix::InvalidMatrix(); 121 SkMatrix fCurrentValue = SkMatrix::InvalidMatrix();
111 GrSLType fType = kVoid_GrSLType; 122 GrSLType fType = kVoid_GrSLType;
112 }; 123 };
113 124
114 SkTArray<TransformVarying, true> fInstalledTransforms; 125 SkSTArray<8, SkSTArray<2, TransformVarying, true> > fInstalledTransforms;
115 126
116 UniformHandle fColorUniform; 127 UniformHandle fColorUniform;
117 GrColor fColor; 128 GrColor fColor;
118 129
119 typedef GrGLSLPrimitiveProcessor INHERITED; 130 typedef GrGLSLPrimitiveProcessor INHERITED;
120 }; 131 };
121 132
122 GrPathProcessor::GrPathProcessor(GrColor color, 133 GrPathProcessor::GrPathProcessor(GrColor color,
123 const GrXPOverridesForBatch& overrides, 134 const GrXPOverridesForBatch& overrides,
124 const SkMatrix& viewMatrix, 135 const SkMatrix& viewMatrix,
125 const SkMatrix& localMatrix) 136 const SkMatrix& localMatrix)
126 : fColor(color) 137 : fColor(color)
127 , fViewMatrix(viewMatrix) 138 , fViewMatrix(viewMatrix)
128 , fLocalMatrix(localMatrix) 139 , fLocalMatrix(localMatrix)
129 , fOverrides(overrides) { 140 , fOverrides(overrides) {
130 this->initClassID<GrPathProcessor>(); 141 this->initClassID<GrPathProcessor>();
131 } 142 }
132 143
133 void GrPathProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps, 144 void GrPathProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps,
134 GrProcessorKeyBuilder* b) const { 145 GrProcessorKeyBuilder* b) const {
135 GrGLPathProcessor::GenKey(*this, caps, b); 146 GrGLPathProcessor::GenKey(*this, caps, b);
136 } 147 }
137 148
138 GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrGLSLCaps& caps) const { 149 GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrGLSLCaps& caps) const {
139 SkASSERT(caps.pathRenderingSupport()); 150 SkASSERT(caps.pathRenderingSupport());
140 return new GrGLPathProcessor(); 151 return new GrGLPathProcessor();
141 } 152 }
OLDNEW
« no previous file with comments | « src/gpu/GrOvalRenderer.cpp ('k') | src/gpu/GrProgramDesc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698