bool GrGLProgramDesc::GetEffectKeyAndUpdateStats(const GrEffectStage& stage, const GrGLCaps& caps, bool useExplicitLocalCoords, GrEffectKeyBuilder* b, uint16_t* effectKeySize, bool* setTrueIfReadsDst, bool* setTrueIfReadsPos, bool* setTrueIfRequiresVertexShader) { const GrBackendEffectFactory& factory = stage.getEffect()->getFactory(); GrDrawEffect drawEffect(stage, useExplicitLocalCoords); if (stage.getEffect()->willReadDstColor()) { *setTrueIfReadsDst = true; } if (stage.getEffect()->willReadFragmentPosition()) { *setTrueIfReadsPos = true; } if (stage.getEffect()->requiresVertexShader()) { *setTrueIfRequiresVertexShader = true; } factory.getGLEffectKey(drawEffect, caps, b); size_t size = b->size(); if (size > SK_MaxU16) { *effectKeySize = 0; // suppresses a warning. return false; } *effectKeySize = SkToU16(size); if (!GrGLProgramEffects::GenEffectMetaKey(drawEffect, caps, b)) { return false; } return true; }
void GrGLPathTexGenProgramEffects::emitEffect(GrGLFragmentOnlyShaderBuilder* builder, const GrEffectStage& stage, const GrEffectKey& key, const char* outColor, const char* inColor, int stageIndex) { GrDrawEffect drawEffect(stage, false); const GrEffect* effect = stage.getEffect(); SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); SkSTArray<4, TextureSampler> samplers(effect->numTextures()); SkASSERT(0 == stage.getVertexAttribIndexCount()); this->setupPathTexGen(builder, drawEffect, &coords); this->emitSamplers(builder, effect, &samplers); GrGLEffect* glEffect = effect->getFactory().createGLInstance(drawEffect); fGLEffects.push_back(glEffect); // Enclose custom code in a block to avoid namespace conflicts SkString openBrace; openBrace.printf("\t{ // Stage %d: %s\n", stageIndex, glEffect->name()); builder->fsCodeAppend(openBrace.c_str()); SkASSERT(!glEffect->isVertexEffect()); glEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samplers); builder->fsCodeAppend("\t}\n"); }
void GrGLVertexProgramEffects::emitEffect(GrGLFullShaderBuilder* builder, const GrEffectStage& stage, const GrEffectKey& key, const char* outColor, const char* inColor, int stageIndex) { GrDrawEffect drawEffect(stage, fHasExplicitLocalCoords); const GrEffect* effect = stage.getEffect(); SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); SkSTArray<4, TextureSampler> samplers(effect->numTextures()); this->emitAttributes(builder, stage); this->emitTransforms(builder, drawEffect, &coords); this->emitSamplers(builder, effect, &samplers); GrGLEffect* glEffect = effect->getFactory().createGLInstance(drawEffect); fGLEffects.push_back(glEffect); // Enclose custom code in a block to avoid namespace conflicts SkString openBrace; openBrace.printf("\t{ // Stage %d: %s\n", stageIndex, glEffect->name()); builder->vsCodeAppend(openBrace.c_str()); builder->fsCodeAppend(openBrace.c_str()); if (glEffect->isVertexEffect()) { GrGLVertexEffect* vertexEffect = static_cast<GrGLVertexEffect*>(glEffect); vertexEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samplers); } else { glEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samplers); } builder->vsCodeAppend("\t}\n"); builder->fsCodeAppend("\t}\n"); }
static inline EffectKey GenKey(const GrEffectStage& stage, const GrGLCaps&) { const GrSingleTextureEffect& ste = static_cast<const GrSingleTextureEffect&>(*stage.getEffect()); return GrGLEffectMatrix::GenKey(ste.getMatrix(), stage.getCoordChangeMatrix(), ste.texture(0)); }
void GrGLVertexProgramEffects::emitAttributes(GrGLFullShaderBuilder* builder, const GrEffectStage& stage) { int numAttributes = stage.getVertexAttribIndexCount(); const int* attributeIndices = stage.getVertexAttribIndices(); for (int a = 0; a < numAttributes; ++a) { // TODO: Make addAttribute mangle the name. SkString attributeName("aAttr"); attributeName.appendS32(attributeIndices[a]); builder->addEffectAttribute(attributeIndices[a], stage.getEffect()->vertexAttribType(a), attributeName); } }