void GrGLNvprProgramBuilder::emitTransforms(const GrFragmentStage& processorStage, GrGLProcessor::TransformedCoordsArray* outCoords, GrGLInstalledFragProc* ifp) { const GrFragmentProcessor* effect = processorStage.getProcessor(); int numTransforms = effect->numTransforms(); ifp->fTransforms.push_back_n(numTransforms); for (int t = 0; t < numTransforms; t++) { GrSLType varyingType = processorStage.isPerspectiveCoordTransform(t, false) ? kVec3f_GrSLType : kVec2f_GrSLType; const char* varyingName = "MatrixCoord"; SkString suffixedVaryingName; if (0 != t) { suffixedVaryingName.append(varyingName); suffixedVaryingName.appendf("_%i", t); varyingName = suffixedVaryingName.c_str(); } GrGLVertToFrag v(varyingType); ifp->fTransforms[t].fHandle = this->addSeparableVarying(varyingName, &v); ifp->fTransforms[t].fType = varyingType; SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords, (SkString(v.fsIn()), varyingType)); } }
static void get_stage_stats(const GrFragmentStage& stage, bool* readsDst, bool* readsFragPosition) { if (stage.getFragmentProcessor()->willReadDstColor()) { *readsDst = true; } if (stage.getFragmentProcessor()->willReadFragmentPosition()) { *readsFragPosition = true; } }
static void get_stage_stats(const GrFragmentStage stage, bool* readsDst, bool* readsFragPosition, bool* requiresVertexShader) { if (stage.getProcessor()->willReadDstColor()) { *readsDst = true; } if (stage.getProcessor()->willReadFragmentPosition()) { *readsFragPosition = true; } }
static bool GetProcessorKey(const GrFragmentStage& fps, const GrGLCaps& caps, bool useLocalCoords, GrProcessorKeyBuilder* b, uint16_t* keySize) { /* 0 because no attribs on a fP */ return get_meta_key(*fps.getProcessor(), caps, gen_transform_key(fps, useLocalCoords), 0, b, keySize); }
static uint32_t gen_transform_key(const GrFragmentStage& effectStage, bool useExplicitLocalCoords) { uint32_t totalKey = 0; int numTransforms = effectStage.getProcessor()->numTransforms(); for (int t = 0; t < numTransforms; ++t) { uint32_t key = 0; if (effectStage.isPerspectiveCoordTransform(t, useExplicitLocalCoords)) { key |= kGeneral_MatrixType; } else { key |= kNoPersp_MatrixType; } const GrCoordTransform& coordTransform = effectStage.getProcessor()->coordTransform(t); if (kLocal_GrCoordSet != coordTransform.sourceCoords() && useExplicitLocalCoords) { key |= kPositionCoords_Flag; } key <<= kTransformKeyBits * t; SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap totalKey |= key; } return totalKey; }