1 /* 2 * Copyright 2015 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 "GrGLSLFragmentProcessor.h" 9 #include "GrFragmentProcessor.h" 10 #include "GrProcessor.h" 11 #include "glsl/GrGLSLFragmentShaderBuilder.h" 12 #include "glsl/GrGLSLUniformHandler.h" 13 14 void GrGLSLFragmentProcessor::setData(const GrGLSLProgramDataManager& pdman, 15 const GrFragmentProcessor& processor) { 16 this->onSetData(pdman, processor); 17 SkASSERT(fChildProcessors.count() == processor.numChildProcessors()); 18 for (int i = 0; i < fChildProcessors.count(); ++i) { 19 fChildProcessors[i]->setData(pdman, processor.childProcessor(i)); 20 } 21 } 22 23 void GrGLSLFragmentProcessor::emitChild(int childIndex, const char* inputColor, EmitArgs& args) { 24 this->internalEmitChild(childIndex, inputColor, args.fOutputColor, args); 25 } 26 27 void GrGLSLFragmentProcessor::emitChild(int childIndex, const char* inputColor, 28 SkString* outputColor, EmitArgs& args) { 29 SkASSERT(outputColor); 30 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 31 outputColor->append(fragBuilder->getMangleString()); 32 fragBuilder->codeAppendf("half4 %s;", outputColor->c_str()); 33 this->internalEmitChild(childIndex, inputColor, outputColor->c_str(), args); 34 } 35 36 void GrGLSLFragmentProcessor::internalEmitChild(int childIndex, const char* inputColor, 37 const char* outputColor, EmitArgs& args) { 38 SkASSERT(inputColor); 39 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 40 41 fragBuilder->onBeforeChildProcEmitCode(); // call first so mangleString is updated 42 43 const GrFragmentProcessor& childProc = args.fFp.childProcessor(childIndex); 44 45 // emit the code for the child in its own scope 46 fragBuilder->codeAppend("{\n"); 47 fragBuilder->codeAppendf("// Child Index %d (mangle: %s): %s\n", childIndex, 48 fragBuilder->getMangleString().c_str(), childProc.name()); 49 TransformedCoordVars coordVars = args.fTransformedCoords.childInputs(childIndex); 50 TextureSamplers textureSamplers = args.fTexSamplers.childInputs(childIndex); 51 TexelBuffers texelBuffers = args.fTexelBuffers.childInputs(childIndex); 52 EmitArgs childArgs(fragBuilder, 53 args.fUniformHandler, 54 args.fShaderCaps, 55 childProc, 56 outputColor, 57 inputColor, 58 coordVars, 59 textureSamplers, 60 texelBuffers); 61 this->childProcessor(childIndex)->emitCode(childArgs); 62 fragBuilder->codeAppend("}\n"); 63 64 fragBuilder->onAfterChildProcEmitCode(); 65 } 66 67 ////////////////////////////////////////////////////////////////////////////// 68 69 GrGLSLFragmentProcessor* GrGLSLFragmentProcessor::Iter::next() { 70 if (fFPStack.empty()) { 71 return nullptr; 72 } 73 GrGLSLFragmentProcessor* back = fFPStack.back(); 74 fFPStack.pop_back(); 75 for (int i = back->numChildProcessors() - 1; i >= 0; --i) { 76 fFPStack.push_back(back->childProcessor(i)); 77 } 78 return back; 79 } 80