Home | History | Annotate | Download | only in glsl
      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