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