| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * Copyright 2014 Google Inc. |    2  * Copyright 2014 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 "gl/GrGLProgram.h" |    8 #include "gl/GrGLProgram.h" | 
|    9 #include "gl/GrGLSLPrettyPrint.h" |    9 #include "gl/GrGLSLPrettyPrint.h" | 
|   10 #include "gl/GrGLUniformHandle.h" |   10 #include "gl/GrGLUniformHandle.h" | 
| (...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  319                     GetProgramResourceLocation(programId, |  319                     GetProgramResourceLocation(programId, | 
|  320                                                GR_GL_FRAGMENT_INPUT, |  320                                                GR_GL_FRAGMENT_INPUT, | 
|  321                                                fSeparableVaryingInfos[i].fVariab
     le.c_str())); |  321                                                fSeparableVaryingInfos[i].fVariab
     le.c_str())); | 
|  322         fSeparableVaryingInfos[i].fLocation = location; |  322         fSeparableVaryingInfos[i].fLocation = location; | 
|  323     } |  323     } | 
|  324 } |  324 } | 
|  325  |  325  | 
|  326 const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const { |  326 const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const { | 
|  327     return fGpu->ctxInfo(); |  327     return fGpu->ctxInfo(); | 
|  328 } |  328 } | 
|  329  |  | 
|  330 //////////////////////////////////////////////////////////////////////////////// |  | 
|  331  |  | 
|  332 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu, |  | 
|  333                                               const GrGLProgramDesc& desc) |  | 
|  334     : INHERITED(gpu, desc) |  | 
|  335     , fGS(this) |  | 
|  336     , fVS(this) { |  | 
|  337 } |  | 
|  338  |  | 
|  339 void GrGLFullProgramBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, |  | 
|  340                                                    GrGLSLExpr4* coverage) { |  | 
|  341     fVS.emitCodeBeforeEffects(color, coverage); |  | 
|  342 } |  | 
|  343  |  | 
|  344 void GrGLFullProgramBuilder::emitGeometryProcessor(const GrEffectStage* geometry
     Processor, |  | 
|  345                                                    GrGLSLExpr4* coverage) { |  | 
|  346     if (geometryProcessor) { |  | 
|  347         GrGLProgramDesc::EffectKeyProvider geometryProcessorKeyProvider( |  | 
|  348                 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kGeometryProc
     essor_EffectType); |  | 
|  349         fGeometryProcessor.reset(this->createAndEmitEffect( |  | 
|  350                                  geometryProcessor, |  | 
|  351                                  geometryProcessorKeyProvider, |  | 
|  352                                  coverage)); |  | 
|  353     } |  | 
|  354 } |  | 
|  355  |  | 
|  356 void GrGLFullProgramBuilder::emitCodeAfterEffects() { |  | 
|  357     fVS.emitCodeAfterEffects(); |  | 
|  358 } |  | 
|  359  |  | 
|  360 void GrGLFullProgramBuilder::addVarying(GrSLType type, |  | 
|  361                                         const char* name, |  | 
|  362                                         const char** vsOutName, |  | 
|  363                                         const char** fsInName, |  | 
|  364                                         GrGLShaderVar::Precision fsPrecision) { |  | 
|  365     fVS.addVarying(type, name, vsOutName); |  | 
|  366  |  | 
|  367     SkString* fsInputName = fVS.fOutputs.back().accessName(); |  | 
|  368  |  | 
|  369 #if GR_GL_EXPERIMENTAL_GS |  | 
|  370     if (desc().getHeader().fExperimentalGS) { |  | 
|  371        // TODO let the caller use these names |  | 
|  372        fGS.addVarying(type, fsInputName->c_str(), NULL); |  | 
|  373        fsInputName = fGS.fOutputs.back().accessName(); |  | 
|  374     } |  | 
|  375 #endif |  | 
|  376     fFS.addVarying(type, fsInputName->c_str(), fsInName, fsPrecision); |  | 
|  377 } |  | 
|  378  |  | 
|  379 GrGLFullProgramBuilder::VaryingHandle |  | 
|  380 GrGLFullProgramBuilder::addSeparableVarying(GrSLType type, |  | 
|  381                                             const char* name, |  | 
|  382                                             const char** vsOutName, |  | 
|  383                                             const char** fsInName) { |  | 
|  384     addVarying(type, name, vsOutName, fsInName); |  | 
|  385     SeparableVaryingInfo& varying = fSeparableVaryingInfos.push_back(); |  | 
|  386     varying.fVariable = fFS.fInputs.back(); |  | 
|  387     return VaryingHandle::CreateFromSeparableVaryingIndex(fSeparableVaryingInfos
     .count() - 1); |  | 
|  388 } |  | 
|  389  |  | 
|  390  |  | 
|  391 GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffects( |  | 
|  392         const GrEffectStage* effectStages[], |  | 
|  393         int effectCnt, |  | 
|  394         const GrGLProgramDesc::EffectKeyProvider& keyProvider, |  | 
|  395         GrGLSLExpr4* inOutFSColor) { |  | 
|  396  |  | 
|  397     GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); |  | 
|  398     this->INHERITED::createAndEmitEffects(&programEffectsBuilder, |  | 
|  399                                           effectStages, |  | 
|  400                                           effectCnt, |  | 
|  401                                           keyProvider, |  | 
|  402                                           inOutFSColor); |  | 
|  403     return programEffectsBuilder.finish(); |  | 
|  404 } |  | 
|  405  |  | 
|  406 void GrGLFullProgramBuilder::createAndEmitEffect(GrGLProgramEffectsBuilder* prog
     ramEffectsBuilder, |  | 
|  407                                               const GrEffectStage* effectStages, |  | 
|  408                                               const GrGLProgramDesc::EffectKeyPr
     ovider& keyProvider, |  | 
|  409                                               GrGLSLExpr4* fsInOutColor) { |  | 
|  410     GrGLSLExpr4 inColor = *fsInOutColor; |  | 
|  411     GrGLSLExpr4 outColor; |  | 
|  412  |  | 
|  413     SkASSERT(effectStages && effectStages->getEffect()); |  | 
|  414     const GrEffectStage& stage = *effectStages; |  | 
|  415  |  | 
|  416     // Using scope to force ASR destructor to be triggered |  | 
|  417     { |  | 
|  418         CodeStage::AutoStageRestore csar(&fCodeStage, &stage); |  | 
|  419  |  | 
|  420         if (inColor.isZeros()) { |  | 
|  421             SkString inColorName; |  | 
|  422  |  | 
|  423             // Effects have no way to communicate zeros, they treat an empty str
     ing as ones. |  | 
|  424             this->nameVariable(&inColorName, '\0', "input"); |  | 
|  425             fFS.codeAppendf("vec4 %s = %s;", inColorName.c_str(), inColor.c_str(
     )); |  | 
|  426             inColor = inColorName; |  | 
|  427         } |  | 
|  428  |  | 
|  429         // create var to hold stage result |  | 
|  430         SkString outColorName; |  | 
|  431         this->nameVariable(&outColorName, '\0', "output"); |  | 
|  432         fFS.codeAppendf("vec4 %s;", outColorName.c_str()); |  | 
|  433         outColor = outColorName; |  | 
|  434  |  | 
|  435  |  | 
|  436         programEffectsBuilder->emitEffect(stage, |  | 
|  437                                           keyProvider.get(0), |  | 
|  438                                           outColor.c_str(), |  | 
|  439                                           inColor.isOnes() ? NULL : inColor.c_st
     r(), |  | 
|  440                                           fCodeStage.stageIndex()); |  | 
|  441     } |  | 
|  442  |  | 
|  443     *fsInOutColor = outColor; |  | 
|  444 } |  | 
|  445  |  | 
|  446 GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffect( |  | 
|  447         const GrEffectStage* geometryProcessor, |  | 
|  448         const GrGLProgramDesc::EffectKeyProvider& keyProvider, |  | 
|  449         GrGLSLExpr4* inOutFSColor) { |  | 
|  450  |  | 
|  451     GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, 1); |  | 
|  452     this->createAndEmitEffect(&programEffectsBuilder, geometryProcessor, keyProv
     ider, inOutFSColor); |  | 
|  453     return programEffectsBuilder.finish(); |  | 
|  454 } |  | 
|  455  |  | 
|  456 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId, |  | 
|  457                                                      SkTDArray<GrGLuint>* shader
     Ids) const { |  | 
|  458     return INHERITED::compileAndAttachShaders(programId, shaderIds) |  | 
|  459          && fVS.compileAndAttachShaders(programId, shaderIds) |  | 
|  460 #if GR_GL_EXPERIMENTAL_GS |  | 
|  461          && (!desc().getHeader().fExperimentalGS |  | 
|  462                  || fGS.compileAndAttachShaders(programId, shaderIds)) |  | 
|  463 #endif |  | 
|  464          ; |  | 
|  465 } |  | 
|  466  |  | 
|  467 void GrGLFullProgramBuilder::bindProgramLocations(GrGLuint programId) { |  | 
|  468     fVS.bindProgramLocations(programId); |  | 
|  469     INHERITED::bindProgramLocations(programId); |  | 
|  470 } |  | 
|  471  |  | 
|  472 //////////////////////////////////////////////////////////////////////////////// |  | 
|  473  |  | 
|  474 GrGLFragmentOnlyProgramBuilder::GrGLFragmentOnlyProgramBuilder(GrGpuGL* gpu, |  | 
|  475                                                                const GrGLProgram
     Desc& desc) |  | 
|  476     : INHERITED(gpu, desc) { |  | 
|  477     SkASSERT(!desc.getHeader().fRequiresVertexShader); |  | 
|  478     SkASSERT(gpu->glCaps().pathRenderingSupport()); |  | 
|  479     SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fColorIn
     put); |  | 
|  480     SkASSERT(GrGLProgramDesc::kAttribute_ColorInput != desc.getHeader().fCoverag
     eInput); |  | 
|  481 } |  | 
|  482  |  | 
|  483 int GrGLFragmentOnlyProgramBuilder::addTexCoordSets(int count) { |  | 
|  484     int firstFreeCoordSet = fTexCoordSetCnt; |  | 
|  485     fTexCoordSetCnt += count; |  | 
|  486     SkASSERT(gpu()->glCaps().maxFixedFunctionTextureCoords() >= fTexCoordSetCnt)
     ; |  | 
|  487     return firstFreeCoordSet; |  | 
|  488 } |  | 
|  489  |  | 
|  490 GrGLProgramEffects* GrGLFragmentOnlyProgramBuilder::createAndEmitEffects( |  | 
|  491         const GrEffectStage* effectStages[], int effectCnt, |  | 
|  492         const GrGLProgramDesc::EffectKeyProvider& keyProvider, GrGLSLExpr4* inOu
     tFSColor) { |  | 
|  493  |  | 
|  494     GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, |  | 
|  495                                                                  effectCnt); |  | 
|  496     this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, |  | 
|  497                                           effectStages, |  | 
|  498                                           effectCnt, |  | 
|  499                                           keyProvider, |  | 
|  500                                           inOutFSColor); |  | 
|  501     return pathTexGenEffectsBuilder.finish(); |  | 
|  502 } |  | 
| OLD | NEW |