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

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

Issue 2339203002: Stop flattening GrCoordTransforms in parent GrFragmentProcessors. (Closed)
Patch Set: Fix issue of taking ref to a temporary 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.fTransformsIn, args.fTra nsformsOut); 37 this->emitTransforms(args.fVaryingHandler, args.fFPCoordTransformHandler );
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 const TransformsIn& tin, 57 FPCoordTransformHandler* transformHandler) {
58 TransformsOut* tout) { 58 int i = 0;
59 tout->push_back_n(tin.count()); 59 while (const GrCoordTransform* coordTransform = transformHandler->nextCo ordTransform()) {
60 fInstalledTransforms.push_back_n(tin.count()); 60 GrSLType varyingType =
61 for (int i = 0; i < tin.count(); i++) { 61 coordTransform->getMatrix().hasPerspective() ? kVec3f_GrSLTy pe
62 const ProcCoords& coordTransforms = tin[i]; 62 : kVec2f_GrSLTy pe;
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;
68 63
69 SkString strVaryingName("MatrixCoord"); 64 SkString strVaryingName;
70 strVaryingName.appendf("_%i_%i", i, t); 65 strVaryingName.printf("TransformedCoord_%d", i);
71 GrGLSLVertToFrag v(varyingType); 66 GrGLSLVertToFrag v(varyingType);
72 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) var yingHandler; 67 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) varying Handler;
73 fInstalledTransforms[i][t].fHandle = 68 fInstalledTransforms.push_back().fHandle =
74 glVaryingHandler->addPathProcessingVarying(strVaryingNam e.c_str(), 69 glVaryingHandler->addPathProcessingVarying(strVaryingName.c_ str(),
75 &v).toIndex() ; 70 &v).toIndex();
76 fInstalledTransforms[i][t].fType = varyingType; 71 fInstalledTransforms.back().fType = varyingType;
77 72
78 (*tout)[i].emplace_back(SkString(v.fsIn()), varyingType); 73 transformHandler->specifyCoordsForCurrCoordTransform(SkString(v.fsIn ()), varyingType);
79 } 74 ++i;
80 } 75 }
81 } 76 }
82 77
83 void setData(const GrGLSLProgramDataManager& pd, 78 void setData(const GrGLSLProgramDataManager& pd,
84 const GrPrimitiveProcessor& primProc) override { 79 const GrPrimitiveProcessor& primProc,
80 FPCoordTransformIter&& transformIter) override {
85 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); 81 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>();
86 if (pathProc.overrides().readsColor() && pathProc.color() != fColor) { 82 if (pathProc.overrides().readsColor() && pathProc.color() != fColor) {
87 float c[4]; 83 float c[4];
88 GrColorToRGBAFloat(pathProc.color(), c); 84 GrColorToRGBAFloat(pathProc.color(), c);
89 pd.set4fv(fColorUniform, 1, c); 85 pd.set4fv(fColorUniform, 1, c);
90 fColor = pathProc.color(); 86 fColor = pathProc.color();
91 } 87 }
92 }
93 88
94 void setTransformData(const GrPrimitiveProcessor& primProc, 89 int t = 0;
95 const GrGLSLProgramDataManager& pdman, 90 while (const GrCoordTransform* coordTransform = transformIter.next()) {
96 int index, 91 SkASSERT(fInstalledTransforms[t].fHandle.isValid());
97 const SkTArray<const GrCoordTransform*, true>& coordTr ansforms) override { 92 const SkMatrix& m = GetTransformMatrix(pathProc.localMatrix(), *coor dTransform);
98 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); 93 if (fInstalledTransforms[t].fCurrentValue.cheapEqualTo(m)) {
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)) {
106 continue; 94 continue;
107 } 95 }
108 transforms[t].fCurrentValue = transform; 96 fInstalledTransforms[t].fCurrentValue = m;
109 97
110 SkASSERT(transforms[t].fType == kVec2f_GrSLType || 98 SkASSERT(fInstalledTransforms[t].fType == kVec2f_GrSLType ||
111 transforms[t].fType == kVec3f_GrSLType); 99 fInstalledTransforms[t].fType == kVec3f_GrSLType);
112 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3 ; 100 unsigned components = fInstalledTransforms[t].fType == kVec2f_GrSLTy pe ? 2 : 3;
113 pdman.setPathFragmentInputTransform(transforms[t].fHandle, component s, transform); 101 pd.setPathFragmentInputTransform(fInstalledTransforms[t].fHandle, co mponents, m);
102 ++t;
114 } 103 }
115 } 104 }
116 105
117 private: 106 private:
118 typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle; 107 typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle;
119 struct TransformVarying { 108 struct TransformVarying {
120 VaryingHandle fHandle; 109 VaryingHandle fHandle;
121 SkMatrix fCurrentValue = SkMatrix::InvalidMatrix(); 110 SkMatrix fCurrentValue = SkMatrix::InvalidMatrix();
122 GrSLType fType = kVoid_GrSLType; 111 GrSLType fType = kVoid_GrSLType;
123 }; 112 };
124 113
125 SkSTArray<8, SkSTArray<2, TransformVarying, true> > fInstalledTransforms; 114 SkTArray<TransformVarying, true> fInstalledTransforms;
126 115
127 UniformHandle fColorUniform; 116 UniformHandle fColorUniform;
128 GrColor fColor; 117 GrColor fColor;
129 118
130 typedef GrGLSLPrimitiveProcessor INHERITED; 119 typedef GrGLSLPrimitiveProcessor INHERITED;
131 }; 120 };
132 121
133 GrPathProcessor::GrPathProcessor(GrColor color, 122 GrPathProcessor::GrPathProcessor(GrColor color,
134 const GrXPOverridesForBatch& overrides, 123 const GrXPOverridesForBatch& overrides,
135 const SkMatrix& viewMatrix, 124 const SkMatrix& viewMatrix,
136 const SkMatrix& localMatrix) 125 const SkMatrix& localMatrix)
137 : fColor(color) 126 : fColor(color)
138 , fViewMatrix(viewMatrix) 127 , fViewMatrix(viewMatrix)
139 , fLocalMatrix(localMatrix) 128 , fLocalMatrix(localMatrix)
140 , fOverrides(overrides) { 129 , fOverrides(overrides) {
141 this->initClassID<GrPathProcessor>(); 130 this->initClassID<GrPathProcessor>();
142 } 131 }
143 132
144 void GrPathProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps, 133 void GrPathProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps,
145 GrProcessorKeyBuilder* b) const { 134 GrProcessorKeyBuilder* b) const {
146 GrGLPathProcessor::GenKey(*this, caps, b); 135 GrGLPathProcessor::GenKey(*this, caps, b);
147 } 136 }
148 137
149 GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrGLSLCaps& caps) const { 138 GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrGLSLCaps& caps) const {
150 SkASSERT(caps.pathRenderingSupport()); 139 SkASSERT(caps.pathRenderingSupport());
151 return new GrGLPathProcessor(); 140 return new GrGLPathProcessor();
152 } 141 }
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