OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "glsl/GrGLSLProgramBuilder.h" | 8 #include "glsl/GrGLSLProgramBuilder.h" |
9 | 9 |
10 #include "GrPipeline.h" | 10 #include "GrPipeline.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 return false; | 46 return false; |
47 } | 47 } |
48 } | 48 } |
49 | 49 |
50 this->emitAndInstallPrimProc(primProc, inputColor, inputCoverage); | 50 this->emitAndInstallPrimProc(primProc, inputColor, inputCoverage); |
51 | 51 |
52 int numProcs = this->pipeline().numFragmentProcessors(); | 52 int numProcs = this->pipeline().numFragmentProcessors(); |
53 this->emitAndInstallFragProcs(0, this->pipeline().numColorFragmentProcessors
(), inputColor); | 53 this->emitAndInstallFragProcs(0, this->pipeline().numColorFragmentProcessors
(), inputColor); |
54 this->emitAndInstallFragProcs(this->pipeline().numColorFragmentProcessors(),
numProcs, | 54 this->emitAndInstallFragProcs(this->pipeline().numColorFragmentProcessors(),
numProcs, |
55 inputCoverage); | 55 inputCoverage); |
56 this->emitAndInstallXferProc(this->pipeline().getXferProcessor(), *inputColo
r, *inputCoverage, | 56 if (primProc.getPixelLocalStorageState() != |
57 this->pipeline().ignoresCoverage()); | 57 GrPixelLocalStorageState::kDraw_GrPixelLocalStorageState) { |
58 this->emitFSOutputSwizzle(this->pipeline().getXferProcessor().hasSecondaryOu
tput()); | 58 this->emitAndInstallXferProc(this->pipeline().getXferProcessor(), *input
Color, |
| 59 *inputCoverage, this->pipeline().ignoresCov
erage(), |
| 60 primProc.getPixelLocalStorageState()); |
| 61 this->emitFSOutputSwizzle(this->pipeline().getXferProcessor().hasSeconda
ryOutput()); |
| 62 } |
59 return true; | 63 return true; |
60 } | 64 } |
61 | 65 |
62 void GrGLSLProgramBuilder::emitAndInstallPrimProc(const GrPrimitiveProcessor& pr
oc, | 66 void GrGLSLProgramBuilder::emitAndInstallPrimProc(const GrPrimitiveProcessor& pr
oc, |
63 GrGLSLExpr4* outputColor, | 67 GrGLSLExpr4* outputColor, |
64 GrGLSLExpr4* outputCoverage) { | 68 GrGLSLExpr4* outputCoverage) { |
65 // Program builders have a bit of state we need to clear with each effect | 69 // Program builders have a bit of state we need to clear with each effect |
66 AutoStageAdvance adv(this); | 70 AutoStageAdvance adv(this); |
67 this->nameExpression(outputColor, "outputColor"); | 71 this->nameExpression(outputColor, "outputColor"); |
68 this->nameExpression(outputCoverage, "outputCoverage"); | 72 this->nameExpression(outputCoverage, "outputCoverage"); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 // asks for dst color, then the emit code needs to follow suit | 148 // asks for dst color, then the emit code needs to follow suit |
145 verify(fp); | 149 verify(fp); |
146 fFragmentProcessors.push_back(fragProc); | 150 fFragmentProcessors.push_back(fragProc); |
147 | 151 |
148 fFS.codeAppend("}"); | 152 fFS.codeAppend("}"); |
149 } | 153 } |
150 | 154 |
151 void GrGLSLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp, | 155 void GrGLSLProgramBuilder::emitAndInstallXferProc(const GrXferProcessor& xp, |
152 const GrGLSLExpr4& colorIn, | 156 const GrGLSLExpr4& colorIn, |
153 const GrGLSLExpr4& coverageIn, | 157 const GrGLSLExpr4& coverageIn, |
154 bool ignoresCoverage) { | 158 bool ignoresCoverage, |
| 159 GrPixelLocalStorageState plsSt
ate) { |
155 // Program builders have a bit of state we need to clear with each effect | 160 // Program builders have a bit of state we need to clear with each effect |
156 AutoStageAdvance adv(this); | 161 AutoStageAdvance adv(this); |
157 | 162 |
158 SkASSERT(!fXferProcessor); | 163 SkASSERT(!fXferProcessor); |
159 fXferProcessor = xp.createGLSLInstance(); | 164 fXferProcessor = xp.createGLSLInstance(); |
160 | 165 |
161 // Enable dual source secondary output if we have one | 166 // Enable dual source secondary output if we have one |
162 if (xp.hasSecondaryOutput()) { | 167 if (xp.hasSecondaryOutput()) { |
163 fFS.enableSecondaryOutput(); | 168 fFS.enableSecondaryOutput(); |
164 } | 169 } |
165 | 170 |
166 if (this->glslCaps()->mustDeclareFragmentShaderOutput()) { | 171 if (this->glslCaps()->mustDeclareFragmentShaderOutput()) { |
167 fFS.enableCustomOutput(); | 172 fFS.enableCustomOutput(); |
168 } | 173 } |
169 | 174 |
170 SkString openBrace; | 175 SkString openBrace; |
171 openBrace.printf("{ // Xfer Processor: %s\n", xp.name()); | 176 openBrace.printf("{ // Xfer Processor: %s\n", xp.name()); |
172 fFS.codeAppend(openBrace.c_str()); | 177 fFS.codeAppend(openBrace.c_str()); |
173 | 178 |
174 SkSTArray<4, GrGLSLTextureSampler> samplers(xp.numTextures()); | 179 SkSTArray<4, GrGLSLTextureSampler> samplers(xp.numTextures()); |
175 this->emitSamplers(xp, &samplers); | 180 this->emitSamplers(xp, &samplers); |
176 | 181 |
| 182 bool usePLSDstRead = (plsState == GrPixelLocalStorageState::kFinish_GrPixelL
ocalStorageState); |
177 GrGLSLXferProcessor::EmitArgs args(&fFS, | 183 GrGLSLXferProcessor::EmitArgs args(&fFS, |
178 this->uniformHandler(), | 184 this->uniformHandler(), |
179 this->glslCaps(), | 185 this->glslCaps(), |
180 xp, colorIn.c_str(), | 186 xp, colorIn.c_str(), |
181 ignoresCoverage ? nullptr : coverageIn.c_
str(), | 187 ignoresCoverage ? nullptr : coverageIn.c_
str(), |
182 fFS.getPrimaryColorOutputName(), | 188 fFS.getPrimaryColorOutputName(), |
183 fFS.getSecondaryColorOutputName(), | 189 fFS.getSecondaryColorOutputName(), |
184 samplers); | 190 samplers, |
| 191 usePLSDstRead); |
185 fXferProcessor->emitCode(args); | 192 fXferProcessor->emitCode(args); |
186 | 193 |
187 // We have to check that effects and the code they emit are consistent, ie i
f an effect | 194 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
188 // asks for dst color, then the emit code needs to follow suit | 195 // asks for dst color, then the emit code needs to follow suit |
189 verify(xp); | 196 verify(xp); |
190 fFS.codeAppend("}"); | 197 fFS.codeAppend("}"); |
191 } | 198 } |
192 | 199 |
193 void GrGLSLProgramBuilder::emitFSOutputSwizzle(bool hasSecondaryOutput) { | 200 void GrGLSLProgramBuilder::emitFSOutputSwizzle(bool hasSecondaryOutput) { |
194 // Swizzle the fragment shader outputs if necessary. | 201 // Swizzle the fragment shader outputs if necessary. |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 kFloat_GrSLType, kDefault_Gr
SLPrecision, | 279 kFloat_GrSLType, kDefault_Gr
SLPrecision, |
273 name, false, 0, outName); | 280 name, false, 0, outName); |
274 } | 281 } |
275 | 282 |
276 void GrGLSLProgramBuilder::cleanupFragmentProcessors() { | 283 void GrGLSLProgramBuilder::cleanupFragmentProcessors() { |
277 for (int i = 0; i < fFragmentProcessors.count(); ++i) { | 284 for (int i = 0; i < fFragmentProcessors.count(); ++i) { |
278 delete fFragmentProcessors[i]; | 285 delete fFragmentProcessors[i]; |
279 } | 286 } |
280 } | 287 } |
281 | 288 |
OLD | NEW |