void GrGLPathTexGenProgramEffects::setupPathTexGen(GrGLFragmentOnlyShaderBuilder* builder, const GrDrawEffect& drawEffect, TransformedCoordsArray* outCoords) { int numTransforms = drawEffect.effect()->numTransforms(); uint32_t totalKey = GenTransformKey(drawEffect); int texCoordIndex = builder->addTexCoordSets(numTransforms); SkNEW_APPEND_TO_TARRAY(&fTransforms, Transforms, (totalKey, texCoordIndex)); SkString name; for (int t = 0; t < numTransforms; ++t) { GrSLType type = kGeneral_MatrixType == get_matrix_type(totalKey, t) ? kVec3f_GrSLType : kVec2f_GrSLType; name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex++); SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, (name, type)); } }
void GrGLPathTexGenProgramEffects::setupPathTexGen(GrGLFragmentOnlyShaderBuilder* builder, const GrEffectRef& effect, EffectKey effectKey, TransformedCoordsArray* outCoords) { int numTransforms = effect->numTransforms(); EffectKey totalKey = GrBackendEffectFactory::GetTransformKey(effectKey); int texCoordIndex = builder->addTexCoordSets(numTransforms); SkNEW_APPEND_TO_TARRAY(&fTransforms, Transforms, (totalKey, texCoordIndex)); SkString name; for (int t = 0; t < numTransforms; ++t) { GrSLType type = kGeneral_MatrixType == get_matrix_type(totalKey, t) ? kVec3f_GrSLType : kVec2f_GrSLType; name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex++); SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, (name, type)); } }
void GrGLShaderBuilder::fsEmitFunction(GrSLType returnType, const char* name, int argCnt, const GrGLShaderVar* args, const char* body, SkString* outName) { fFSFunctions.append(GrGLSLTypeString(returnType)); this->nameVariable(outName, '\0', name); fFSFunctions.appendf(" %s", outName->c_str()); fFSFunctions.append("("); for (int i = 0; i < argCnt; ++i) { args[i].appendDecl(this->ctxInfo(), &fFSFunctions); if (i < argCnt - 1) { fFSFunctions.append(", "); } } fFSFunctions.append(") {\n"); fFSFunctions.append(body); fFSFunctions.append("}\n\n"); }
void GrGLSLShaderBuilder::emitFunction(GrSLType returnType, const char* name, int argCnt, const GrGLSLShaderVar* args, const char* body, SkString* outName) { this->functions().append(GrGLSLTypeString(returnType)); fProgramBuilder->nameVariable(outName, '\0', name); this->functions().appendf(" %s", outName->c_str()); this->functions().append("("); for (int i = 0; i < argCnt; ++i) { args[i].appendDecl(fProgramBuilder->glslCaps(), &this->functions()); if (i < argCnt - 1) { this->functions().append(", "); } } this->functions().append(") {\n"); this->functions().append(body); this->functions().append("}\n\n"); }
void GrGLShaderBuilder::emitFunction(GrSLType returnType, const char* name, int argCnt, const GrGLShaderVar* args, const char* body, SkString* outName) { fFunctions.append(GrGLSLTypeString(returnType)); fProgramBuilder->nameVariable(outName, '\0', name); fFunctions.appendf(" %s", outName->c_str()); fFunctions.append("("); const GrGLContextInfo& ctxInfo = fProgramBuilder->gpu()->ctxInfo(); for (int i = 0; i < argCnt; ++i) { args[i].appendDecl(ctxInfo, &fFunctions); if (i < argCnt - 1) { fFunctions.append(", "); } } fFunctions.append(") {\n"); fFunctions.append(body); fFunctions.append("}\n\n"); }
void GrGLLegacyPathProcessor::emitTransforms(GrGLGPBuilder*, const TransformsIn& tin, TransformsOut* tout) { tout->push_back_n(tin.count()); fInstalledTransforms.push_back_n(tin.count()); for (int i = 0; i < tin.count(); i++) { const ProcCoords& coordTransforms = tin[i]; int texCoordIndex = this->addTexCoordSets(coordTransforms.count()); // Use the first uniform location as the texcoord index. fInstalledTransforms[i].push_back_n(1); fInstalledTransforms[i][0].fHandle = ShaderVarHandle(texCoordIndex); SkString name; for (int t = 0; t < coordTransforms.count(); ++t) { GrSLType type = coordTransforms[t]->getMatrix().hasPerspective() ? kVec3f_GrSLType : kVec2f_GrSLType; name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex++); SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCoords, (name, type)); } } }