};
/**
- * This class is used to pass the key that was created for a GrGLProcessor back to it
- * when it emits code. It may allow the emit step to skip calculations that were
- * performed when computing the key.
- */
-class GrProcessorKey {
-public:
- GrProcessorKey(const uint32_t* key, int count) : fKey(key), fCount(count) {
- SkASSERT(0 == reinterpret_cast<intptr_t>(key) % sizeof(uint32_t));
- }
-
- /** Gets the uint32_t values that the processor inserted into the key. */
- uint32_t get32(int index) const {
- SkASSERT(index >=0 && index < fCount);
- return fKey[index];
- }
-
- /** Gets the number of uint32_t values that the processor inserted into the key. */
- int count32() const { return fCount; }
-
-private:
- const uint32_t* fKey; // unowned ptr into the larger key.
- int fCount; // number of uint32_ts inserted by the processor into its key.
-};
-
-/**
* Given a GrProcessor of a particular type, creates the corresponding graphics-backend-specific
* processor object. It also tracks equivalence of shaders generated via a key. The factory for an
* processor is accessed via GrProcessor::getFactory(). Each factory instance is assigned an ID at
}
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLAlphaThresholdEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLArithmeticEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
const GrProcessor&);
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLRectBlurEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLRRectBlurEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrColorCubeEffect::GLProcessor::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLDisplacementMapEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLLightingEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLMagnifierEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLMorphologyEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLPerlinNoise::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLColorTableEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
if (SkGradientShaderBase::kTwo_GpuColorType == e.getColorType()) {
key |= kTwoColorKey;
- } else if (SkGradientShaderBase::kThree_GpuColorType == e.getColorType()){
+ } else if (SkGradientShaderBase::kThree_GpuColorType == e.getColorType()) {
key |= kThreeColorKey;
}
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLLinearGradient::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLRadialGradient::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLSweepGradient::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLEdge2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLFocalOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLFocalInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLCircleInside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLCircleOutside2PtConicalEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLRadial2Gradient::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
// This should really only be used internally, base classes should return their own headers
const KeyHeader& header() const { return *this->atOffset<KeyHeader, kHeaderOffset>(); }
- /** Used to provide effects' keys to their emitCode() function. */
- class ProcKeyProvider {
- public:
- enum ProcessorType {
- kGeometry_ProcessorType,
- kFragment_ProcessorType,
- };
-
- ProcKeyProvider(const GrProgramDesc* desc, ProcessorType type, int effectOffset)
- : fDesc(desc), fBaseIndex(0), fEffectOffset(effectOffset) {
- switch (type) {
- case kGeometry_ProcessorType:
- // there can be only one
- fBaseIndex = 0;
- break;
- case kFragment_ProcessorType:
- fBaseIndex = desc->hasGeometryProcessor() ? 1 : 0;
- break;
- }
- }
-
- GrProcessorKey get(int index) const {
- const uint16_t* offsetsAndLengths = reinterpret_cast<const uint16_t*>(
- fDesc->fKey.begin() + fEffectOffset);
- // We store two uint16_ts per effect, one for the offset to the effect's key and one for
- // its length. Here we just need the offset.
- uint16_t offset = offsetsAndLengths[2 * (fBaseIndex + index) + 0];
- uint16_t length = offsetsAndLengths[2 * (fBaseIndex + index) + 1];
- // Currently effects must add to the key in units of uint32_t.
- SkASSERT(0 == (length % sizeof(uint32_t)));
- return GrProcessorKey(reinterpret_cast<const uint32_t*>(fDesc->fKey.begin() + offset),
- length / sizeof(uint32_t));
- }
- private:
- const GrProgramDesc* fDesc;
- int fBaseIndex;
- int fEffectOffset;
- };
-
// A struct to communicate descriptor information to the program descriptor builder
struct DescInfo {
int positionAttributeIndex() const {
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLBicubicEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& effect,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLAARectEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLConvexPolyEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLConvolutionEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLDitherEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
const GrProcessor&);
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLMatrixConvolutionEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLCircleEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLEllipseEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
}
void GLCircularRRectEffect::emitCode(GrGLFPBuilder* builder,
- const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
- const char* outputColor,
- const char* inputColor,
- const TransformedCoordsArray&,
- const TextureSamplerArray& samplers) {
+ const GrFragmentProcessor& fp,
+ const char* outputColor,
+ const char* inputColor,
+ const TransformedCoordsArray&,
+ const TextureSamplerArray& samplers) {
const CircularRRectEffect& crre = fp.cast<CircularRRectEffect>();
const char *rectName;
const char *radiusPlusHalfName;
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& effect,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GLEllipticalRRectEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& effect,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder*,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
void GrGLTextureDomainEffect::emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor&,
- const GrProcessorKey&,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
struct EmitArgs {
EmitArgs(GrGLGPBuilder* pb,
const GrGeometryProcessor& gp,
- const GrProcessorKey& key,
const char* output,
const char* input,
const TextureSamplerArray& samplers)
- : fPB(pb), fGP(gp), fKey(key), fOutput(output), fInput(input), fSamplers(samplers) {}
+ : fPB(pb), fGP(gp), fOutput(output), fInput(input), fSamplers(samplers) {}
GrGLGPBuilder* fPB;
const GrGeometryProcessor& fGP;
- const GrProcessorKey& fKey;
const char* fOutput;
const char* fInput;
const TextureSamplerArray& fSamplers;
*/
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& effect,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray& coords,
if (fOptState.hasGeometryProcessor()) {
const GrGeometryProcessor& gp = *fOptState.getGeometryProcessor();
fVS.emitAttributes(gp);
- ProcKeyProvider keyProvider(&fDesc,
- ProcKeyProvider::kGeometry_ProcessorType,
- GrGLProgramDescBuilder::kProcessorKeyOffsetsAndLengthOffset);
GrGLSLExpr4 output;
- this->emitAndInstallProc<GrGeometryProcessor>(gp, 0, keyProvider, *inputCoverage, &output);
+ this->emitAndInstallProc<GrGeometryProcessor>(gp, 0, *inputCoverage, &output);
*inputCoverage = output;
}
this->emitAndInstallFragProcs(fOptState.numColorStages(), numProcs, inputCoverage);
}
void GrGLProgramBuilder::emitAndInstallFragProcs(int procOffset, int numProcs, GrGLSLExpr4* inOut) {
- ProcKeyProvider keyProvider(&fDesc,
- ProcKeyProvider::kFragment_ProcessorType,
- GrGLProgramDescBuilder::kProcessorKeyOffsetsAndLengthOffset);
for (int e = procOffset; e < numProcs; ++e) {
GrGLSLExpr4 output;
const GrPendingFragmentStage& stage = fOptState.getFragmentStage(e);
- this->emitAndInstallProc<GrPendingFragmentStage>(stage, e, keyProvider, *inOut, &output);
+ this->emitAndInstallProc<GrPendingFragmentStage>(stage, e, *inOut, &output);
*inOut = output;
}
}
template <class Proc>
void GrGLProgramBuilder::emitAndInstallProc(const Proc& proc,
int index,
- const ProcKeyProvider& keyProvider,
const GrGLSLExpr4& input,
GrGLSLExpr4* output) {
// Program builders have a bit of state we need to clear with each effect
openBrace.printf("{ // Stage %d, %s\n", fStageIndex, proc.name());
fFS.codeAppend(openBrace.c_str());
- this->emitAndInstallProc(proc, keyProvider.get(index), output->c_str(),
- input.isOnes() ? NULL : input.c_str());
+ this->emitAndInstallProc(proc, output->c_str(), input.isOnes() ? NULL : input.c_str());
fFS.codeAppend("}");
}
void GrGLProgramBuilder::emitAndInstallProc(const GrPendingFragmentStage& fs,
- const GrProcessorKey& key,
const char* outColor,
const char* inColor) {
GrGLInstalledFragProc* ifp = SkNEW_ARGS(GrGLInstalledFragProc, (fVS.hasLocalCoords()));
SkSTArray<2, GrGLProcessor::TransformedCoords> coords(fp.numTransforms());
this->emitTransforms(fs, &coords, ifp);
- ifp->fGLProc->emitCode(this, fp, key, outColor, inColor, coords, samplers);
+ ifp->fGLProc->emitCode(this, fp, outColor, inColor, coords, samplers);
// We have to check that effects and the code they emit are consistent, ie if an effect
// asks for dst color, then the emit code needs to follow suit
}
void GrGLProgramBuilder::emitAndInstallProc(const GrGeometryProcessor& gp,
- const GrProcessorKey& key,
const char* outCoverage,
const char* inCoverage) {
SkASSERT(!fGeometryProcessor);
SkSTArray<4, GrGLProcessor::TextureSampler> samplers(gp.numTextures());
this->emitSamplers(gp, &samplers, fGeometryProcessor);
- GrGLGeometryProcessor::EmitArgs args(this, gp, key, outCoverage, inCoverage, samplers);
+ GrGLGeometryProcessor::EmitArgs args(this, gp, outCoverage, inCoverage, samplers);
fGeometryProcessor->fGLProc->emitCode(args);
// We have to check that effects and the code they emit are consistent, ie if an effect
};
protected:
- typedef GrProgramDesc::ProcKeyProvider ProcKeyProvider;
typedef GrGLProgramDataManager::UniformInfo UniformInfo;
typedef GrGLProgramDataManager::UniformInfoArray UniformInfoArray;
template <class Proc>
void emitAndInstallProc(const Proc&,
int index,
- const ProcKeyProvider&,
const GrGLSLExpr4& input,
GrGLSLExpr4* output);
// these emit functions help to keep the createAndEmitProcessors template general
void emitAndInstallProc(const GrPendingFragmentStage&,
- const GrProcessorKey&,
const char* outColor,
const char* inColor);
void emitAndInstallProc(const GrGeometryProcessor&,
- const GrProcessorKey&,
const char* outCoverage,
const char* inCoverage);
void verify(const GrGeometryProcessor&);
virtual void emitCode(GrGLFPBuilder* builder,
const GrFragmentProcessor& fp,
- const GrProcessorKey& key,
const char* outputColor,
const char* inputColor,
const TransformedCoordsArray&,
- const TextureSamplerArray&) {
- for (uint32_t i = 0; i < kMaxKeySize; i++) {
- SkASSERT(key.get32(i) == i);
- }
- }
+ const TextureSamplerArray&) {}
static void GenKey(const GrProcessor& processor, const GrGLCaps&, GrProcessorKeyBuilder* b) {
for (uint32_t i = 0; i < kMaxKeySize; i++) {