| Index: src/gpu/gl/GrGLProgramEffects.h
|
| diff --git a/src/gpu/gl/GrGLProgramEffects.h b/src/gpu/gl/GrGLProgramEffects.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c2c21042b08d9ac153ac2f52be3b9ec3333b5542
|
| --- /dev/null
|
| +++ b/src/gpu/gl/GrGLProgramEffects.h
|
| @@ -0,0 +1,192 @@
|
| +/*
|
| + * Copyright 2013 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef GrGLProgramEffects_DEFINED
|
| +#define GrGLProgramEffects_DEFINED
|
| +
|
| +#include "GrBackendEffectFactory.h"
|
| +#include "GrTexture.h"
|
| +#include "GrTextureAccess.h"
|
| +#include "GrGLUniformManager.h"
|
| +
|
| +class GrEffectStage;
|
| +class GrGLProgramEffectsBuilder;
|
| +class GrGLShaderBuilder;
|
| +
|
| +/**
|
| + * This class encapsulates an array of GrGLEffects and their supporting data (coord transforms
|
| + * and textures). It is built with GrGLProgramEffectsBuilder, then used to manage the necessary GL
|
| + * state and shader uniforms.
|
| + */
|
| +class GrGLProgramEffects {
|
| +public:
|
| + typedef GrBackendEffectFactory::EffectKey EffectKey;
|
| + typedef GrGLUniformManager::UniformHandle UniformHandle;
|
| +
|
| + /**
|
| + * These methods generate different portions of an effect's final key.
|
| + */
|
| + static EffectKey GenAttribKey(const GrDrawEffect&);
|
| + static EffectKey GenTransformKey(const GrDrawEffect&);
|
| + static EffectKey GenTextureKey(const GrDrawEffect&, const GrGLCaps&);
|
| +
|
| + ~GrGLProgramEffects();
|
| +
|
| + /**
|
| + * Assigns a texture unit to each sampler. It starts on *texUnitIdx and writes the next
|
| + * available unit to *texUnitIdx when it returns.
|
| + */
|
| + void initSamplers(const GrGLUniformManager&, int* texUnitIdx);
|
| +
|
| + /**
|
| + * Calls setData() on each effect, and sets their transformation matrices and texture bindings.
|
| + */
|
| + void setData(GrGpuGL*,
|
| + const GrGLUniformManager&,
|
| + const GrEffectStage* effectStages[]);
|
| +
|
| + /**
|
| + * Passed to GrGLEffects so they can add transformed coordinates to their shader code.
|
| + */
|
| + class TransformedCoords {
|
| + public:
|
| + TransformedCoords(const char* name, GrSLType type, const char* vsName)
|
| + : fName(name), fType(type), fVSName(vsName) {
|
| + }
|
| +
|
| + const char* c_str() const { return fName.c_str(); }
|
| + GrSLType type() const { return fType; }
|
| + const SkString& getName() const { return fName; }
|
| + // TODO: Remove the VS name when we have vertexless shaders, and gradients are reworked.
|
| + const SkString& getVSName() const { return fVSName; }
|
| +
|
| + private:
|
| + SkString fName;
|
| + GrSLType fType;
|
| + SkString fVSName;
|
| + };
|
| +
|
| + typedef SkTArray<TransformedCoords> TransformedCoordsArray;
|
| +
|
| + /**
|
| + * Passed to GrGLEffects so they can add texture reads to their shader code.
|
| + */
|
| + class TextureSampler {
|
| + public:
|
| + TextureSampler(UniformHandle uniform, const GrTextureAccess& access)
|
| + : fSamplerUniform(uniform)
|
| + , fConfigComponentMask(GrPixelConfigComponentMask(access.getTexture()->config())) {
|
| + SkASSERT(0 != fConfigComponentMask);
|
| + memcpy(fSwizzle, access.getSwizzle(), 5);
|
| + }
|
| +
|
| + UniformHandle samplerUniform() const { return fSamplerUniform; }
|
| + // bitfield of GrColorComponentFlags present in the texture's config.
|
| + uint32_t configComponentMask() const { return fConfigComponentMask; }
|
| + const char* swizzle() const { return fSwizzle; }
|
| +
|
| + private:
|
| + UniformHandle fSamplerUniform;
|
| + uint32_t fConfigComponentMask;
|
| + char fSwizzle[5];
|
| + };
|
| +
|
| + typedef SkTArray<TextureSampler> TextureSamplerArray;
|
| +
|
| +private:
|
| + friend class GrGLProgramEffectsBuilder;
|
| +
|
| + GrGLProgramEffects(int reserveCount, bool explicitLocalCoords)
|
| + : fGLEffects(reserveCount)
|
| + , fTransforms(reserveCount)
|
| + , fSamplers(reserveCount)
|
| + , fHasExplicitLocalCoords(explicitLocalCoords) {
|
| + }
|
| +
|
| + /**
|
| + * Helper for setData(). Sets all the transform matrices for an effect.
|
| + */
|
| + void setTransformData(const GrGLUniformManager&, const GrDrawEffect&, int effectIdx);
|
| +
|
| + /**
|
| + * Helper for setData(). Binds all the textures for an effect.
|
| + */
|
| + void bindTextures(GrGpuGL*, const GrEffectRef&, int effectIdx);
|
| +
|
| + struct Transform {
|
| + Transform() { fCurrentValue = SkMatrix::InvalidMatrix(); }
|
| + UniformHandle fHandle;
|
| + GrSLType fType;
|
| + SkMatrix fCurrentValue;
|
| + };
|
| +
|
| + struct Sampler {
|
| + SkDEBUGCODE(Sampler() : fTextureUnit(-1) {})
|
| + UniformHandle fUniform;
|
| + int fTextureUnit;
|
| + };
|
| +
|
| + SkTArray<GrGLEffect*> fGLEffects;
|
| + SkTArray<SkSTArray<2, Transform, true> > fTransforms;
|
| + SkTArray<SkSTArray<4, Sampler, true> > fSamplers;
|
| + bool fHasExplicitLocalCoords;
|
| +};
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +/**
|
| + * This class is used to construct a GrGLProgramEffects.
|
| + */
|
| +class GrGLProgramEffectsBuilder {
|
| +public:
|
| + GrGLProgramEffectsBuilder(GrGLShaderBuilder* builder, int reserveCount);
|
| +
|
| + /**
|
| + * Emits the effect's shader code, and stores the necessary uniforms internally.
|
| + */
|
| + void emitEffect(const GrEffectStage&,
|
| + GrGLProgramEffects::EffectKey,
|
| + const char* outColor,
|
| + const char* inColor,
|
| + int stageIndex);
|
| +
|
| + /**
|
| + * Finalizes the building process and returns the effect array. After this call, the builder
|
| + * becomes invalid.
|
| + */
|
| + GrGLProgramEffects* finish() { return fProgramEffects.detach(); }
|
| +
|
| +private:
|
| + /**
|
| + * Helper for emitEffect(). Emits any attributes an effect might have.
|
| + */
|
| + void emitAttributes(const GrEffectStage&);
|
| +
|
| + /**
|
| + * Helper for emitEffect(). Emits code to implement an effect's coord transforms in the VS.
|
| + * Varyings are added as an outputs of the VS and inputs to the FS. The varyings may be either a
|
| + * vec2f or vec3f depending upon whether perspective interpolation is required or not. The names
|
| + * of the varyings in the VS and FS as well their types are appended to the
|
| + * TransformedCoordsArray* object, which is in turn passed to the effect's emitCode() function.
|
| + */
|
| + void emitTransforms(const GrEffectRef&,
|
| + GrGLProgramEffects::EffectKey,
|
| + GrGLProgramEffects::TransformedCoordsArray*);
|
| +
|
| + /**
|
| + * Helper for emitEffect(). Emits uniforms for an effect's texture accesses. The uniform info
|
| + * as well as texture access parameters are appended to the TextureSamplerArray* object, which
|
| + * is in turn passed to the effect's emitCode() function.
|
| + */
|
| + void emitSamplers(const GrEffectRef&,
|
| + GrGLProgramEffects::TextureSamplerArray*);
|
| +
|
| + GrGLShaderBuilder* fBuilder;
|
| + SkAutoTDelete<GrGLProgramEffects> fProgramEffects;
|
| +};
|
| +
|
| +#endif
|
|
|