зеркало из https://github.com/mozilla/moz-skia.git
Pass GrCustomStage to key-generation functions and emitCode().
R=robertphillips@google.com Review URL: https://codereview.appspot.com/6819046 git-svn-id: http://skia.googlecode.com/svn/branches/gpu_dev@6182 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Родитель
484ee2a5fe
Коммит
2eaaefd7e6
|
@ -33,6 +33,7 @@
|
|||
'<(skia_include_path)/gpu/GrResource.h',
|
||||
'<(skia_include_path)/gpu/GrScalar.h',
|
||||
'<(skia_include_path)/gpu/GrSurface.h',
|
||||
'<(skia_include_path)/gpu/GrTBackendEffectFactory.h',
|
||||
'<(skia_include_path)/gpu/GrTextContext.h',
|
||||
'<(skia_include_path)/gpu/GrTexture.h',
|
||||
'<(skia_include_path)/gpu/GrTextureAccess.h',
|
||||
|
|
|
@ -10,14 +10,21 @@
|
|||
|
||||
#include "GrTypes.h"
|
||||
#include "SkTemplates.h"
|
||||
#include "SkThread_platform.h"
|
||||
#include "GrNoncopyable.h"
|
||||
|
||||
/** Given a GrEffect of a particular type, creates the corresponding
|
||||
graphics-backend-specific GrGLEffect. Also tracks equivalence
|
||||
of shaders generated via a key.
|
||||
/** Given a GrEffect of a particular type, creates the corresponding graphics-backend-specific
|
||||
effect object. Also tracks equivalence of shaders generated via a key. Each factory instance
|
||||
is assigned a generation ID at construction. The ID of the return of GrEffect::getFactory()
|
||||
is used as a type identifier. Thus a GrEffect subclass must return a singleton from
|
||||
getFactory(). GrEffect subclasses should use the derived class GrTBackendEffectFactory that is
|
||||
templated on the GrEffect subclass as their factory object. It requires that the GrEffect
|
||||
subclass has a nested class (or typedef) GLEffect which is its GL implementation and a subclass
|
||||
of GrGLEffect.
|
||||
*/
|
||||
|
||||
class GrEffect;
|
||||
class GrEffectStage;
|
||||
class GrGLEffect;
|
||||
class GrGLCaps;
|
||||
|
||||
|
@ -35,7 +42,7 @@ public:
|
|||
kTextureKeyBits = 6
|
||||
};
|
||||
|
||||
virtual EffectKey glEffectKey(const GrEffect&, const GrGLCaps&) const = 0;
|
||||
virtual EffectKey glEffectKey(const GrEffectStage&, const GrGLCaps&) const = 0;
|
||||
virtual GrGLEffect* createGLInstance(const GrEffect&) const = 0;
|
||||
|
||||
bool operator ==(const GrBackendEffectFactory& b) const {
|
||||
|
@ -71,59 +78,4 @@ private:
|
|||
static int32_t fCurrEffectClassID;
|
||||
};
|
||||
|
||||
template <typename EffectClass>
|
||||
class GrTBackendEffectFactory : public GrBackendEffectFactory {
|
||||
|
||||
public:
|
||||
typedef typename EffectClass::GLEffect GLEffect;
|
||||
|
||||
/** Returns a human-readable name that is accessible via GrEffect or
|
||||
GrGLEffect and is consistent between the two of them.
|
||||
*/
|
||||
virtual const char* name() const SK_OVERRIDE { return EffectClass::Name(); }
|
||||
|
||||
/** Returns a value that identifies the GLSL shader code generated by
|
||||
a GrEffect. This enables caching of generated shaders. Part of the
|
||||
id identifies the GrEffect subclass. The remainder is based
|
||||
on the aspects of the GrEffect object's configuration that affect
|
||||
GLSL code generation. */
|
||||
virtual EffectKey glEffectKey(const GrEffect& effect, const GrGLCaps& caps) const SK_OVERRIDE {
|
||||
GrAssert(kIllegalEffectClassID != fEffectClassID);
|
||||
EffectKey effectKey = GLEffect::GenKey(effect, caps);
|
||||
EffectKey textureKey = GLEffect::GenTextureKey(effect, caps);
|
||||
#if GR_DEBUG
|
||||
static const EffectKey kIllegalIDMask = (uint16_t) (~((1U << kEffectKeyBits) - 1));
|
||||
GrAssert(!(kIllegalIDMask & effectKey));
|
||||
|
||||
static const EffectKey kIllegalTextureKeyMask = (uint16_t) (~((1U << kTextureKeyBits) - 1));
|
||||
GrAssert(!(kIllegalTextureKeyMask & textureKey));
|
||||
#endif
|
||||
return fEffectClassID | (textureKey << kEffectKeyBits) | effectKey;
|
||||
}
|
||||
|
||||
/** Returns a new instance of the appropriate *GL* implementation class
|
||||
for the given GrEffect; caller is responsible for deleting
|
||||
the object. */
|
||||
virtual GLEffect* createGLInstance(const GrEffect& effect) const SK_OVERRIDE {
|
||||
return SkNEW_ARGS(GLEffect, (*this, effect));
|
||||
}
|
||||
|
||||
/** This class is a singleton. This function returns the single instance.
|
||||
*/
|
||||
static const GrBackendEffectFactory& getInstance() {
|
||||
static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem;
|
||||
static const GrTBackendEffectFactory* gInstance;
|
||||
if (!gInstance) {
|
||||
gInstance = SkNEW_PLACEMENT(gInstanceMem.get(),
|
||||
GrTBackendEffectFactory);
|
||||
}
|
||||
return *gInstance;
|
||||
}
|
||||
|
||||
protected:
|
||||
GrTBackendEffectFactory() {
|
||||
fEffectClassID = GenID() << (kEffectKeyBits + kTextureKeyBits) ;
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -10,10 +10,10 @@
|
|||
|
||||
#include "GrRefCnt.h"
|
||||
#include "GrNoncopyable.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrEffectUnitTest.h"
|
||||
#include "GrTextureAccess.h"
|
||||
|
||||
class GrBackendEffectFactory;
|
||||
class GrContext;
|
||||
class GrTexture;
|
||||
class SkString;
|
||||
|
@ -33,8 +33,6 @@ class GrEffect : public GrRefCnt {
|
|||
public:
|
||||
SK_DECLARE_INST_COUNT(GrEffect)
|
||||
|
||||
typedef GrBackendEffectFactory::EffectKey EffectKey;
|
||||
|
||||
explicit GrEffect(int numTextures);
|
||||
virtual ~GrEffect();
|
||||
|
||||
|
@ -77,7 +75,7 @@ public:
|
|||
|
||||
/** Human-meaningful string to identify this effect; may be embedded
|
||||
in generated shader code. */
|
||||
const char* name() const { return this->getFactory().name(); }
|
||||
const char* name() const;
|
||||
|
||||
int numTextures() const { return fNumTextures; }
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#ifndef GrEffectStage_DEFINED
|
||||
#define GrEffectStage_DEFINED
|
||||
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrEffect.h"
|
||||
#include "GrMatrix.h"
|
||||
#include "GrTypes.h"
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include "SkGr.h"
|
||||
#include "SkGrPixelRef.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
|
@ -117,14 +118,14 @@ public:
|
|||
virtual ~GrGLBlendEffect();
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect& s, const GrGLCaps&);
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
private:
|
||||
typedef GrGLEffect INHERITED;
|
||||
|
@ -246,7 +247,7 @@ GrGLBlendEffect::~GrGLBlendEffect() {
|
|||
}
|
||||
|
||||
void GrGLBlendEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -278,7 +279,7 @@ void GrGLBlendEffect::emitCode(GrGLShaderBuilder* builder,
|
|||
}
|
||||
}
|
||||
|
||||
GrGLEffect::EffectKey GrGLBlendEffect::GenKey(const GrEffect& s, const GrGLCaps&) {
|
||||
return static_cast<const GrBlendEffect&>(s).mode();
|
||||
GrGLEffect::EffectKey GrGLBlendEffect::GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
return static_cast<const GrBlendEffect&>(*s.getEffect()).mode();
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -320,6 +320,7 @@ bool SkColorMatrixFilter::asColorMatrix(SkScalar matrix[20]) {
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "GrEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
|
||||
class ColorMatrixEffect : public GrEffect {
|
||||
|
@ -342,7 +343,7 @@ public:
|
|||
class GLEffect : public GrGLEffect {
|
||||
public:
|
||||
// this class always generates the same code.
|
||||
static EffectKey GenKey(const GrEffect& s, const GrGLCaps&) { return 0; }
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps&) { return 0; }
|
||||
|
||||
GLEffect(const GrBackendEffectFactory& factory,
|
||||
const GrEffect& effect)
|
||||
|
@ -352,7 +353,7 @@ public:
|
|||
}
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
#include "SkTypes.h"
|
||||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "effects/GrSingleTextureEffect.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
#include "GrEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
class GrGLDiffuseLightingEffect;
|
||||
class GrGLSpecularLightingEffect;
|
||||
|
@ -949,14 +949,14 @@ public:
|
|||
virtual ~GrGLLightingEffect();
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps);
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
/**
|
||||
* Subclasses of GrGLLightingEffect must call INHERITED::setData();
|
||||
|
@ -1072,7 +1072,7 @@ GrGLLightingEffect::~GrGLLightingEffect() {
|
|||
}
|
||||
|
||||
void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -1167,9 +1167,9 @@ void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder,
|
|||
GrGLSLMulVarBy4f(code, 2, outputColor, inputColor);
|
||||
}
|
||||
|
||||
GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrEffect& s,
|
||||
const GrGLCaps& caps) {
|
||||
return static_cast<const GrLightingEffect&>(s).light()->type();
|
||||
GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrEffectStage& s,
|
||||
const GrGLCaps& caps) {
|
||||
return static_cast<const GrLightingEffect&>(*s.getEffect()).light()->type();
|
||||
}
|
||||
|
||||
void GrGLLightingEffect::setData(const GrGLUniformManager& uman, const GrEffectStage& stage) {
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "gl/GrGLEffect.h"
|
||||
#include "gl/GrGLSL.h"
|
||||
#include "gl/GrGLTexture.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
class GrGLMagnifierEffect;
|
||||
|
||||
|
@ -78,7 +78,7 @@ public:
|
|||
const GrEffect& effect);
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -87,7 +87,7 @@ public:
|
|||
|
||||
virtual void setData(const GrGLUniformManager& uman, const GrEffectStage& stage) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect&, const GrGLCaps&);
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
private:
|
||||
|
||||
|
@ -107,7 +107,7 @@ GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory,
|
|||
}
|
||||
|
||||
void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -167,8 +167,7 @@ void GrGLMagnifierEffect::setData(const GrGLUniformManager& uman,
|
|||
uman.set2f(fInsetVar, zoom.x_inset(), zoom.y_inset());
|
||||
}
|
||||
|
||||
GrGLEffect::EffectKey GrGLMagnifierEffect::GenKey(const GrEffect& s,
|
||||
const GrGLCaps& caps) {
|
||||
GrGLEffect::EffectKey GrGLMagnifierEffect::GenKey(const GrEffectStage&, const GrGLCaps&) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
#include "gl/GrGLEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#endif
|
||||
|
||||
SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(const SkISize& kernelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input)
|
||||
|
@ -284,14 +285,14 @@ public:
|
|||
GrGLMatrixConvolutionEffect(const GrBackendEffectFactory& factory,
|
||||
const GrEffect& effect);
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps);
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE;
|
||||
|
||||
|
@ -348,7 +349,7 @@ static void appendTextureLookup(GrGLShaderBuilder* builder,
|
|||
}
|
||||
|
||||
void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -417,9 +418,9 @@ int encodeXY(int x, int y) {
|
|||
|
||||
};
|
||||
|
||||
GrGLEffect::EffectKey GrGLMatrixConvolutionEffect::GenKey(const GrEffect& s,
|
||||
const GrGLCaps& caps) {
|
||||
const GrMatrixConvolutionEffect& m = static_cast<const GrMatrixConvolutionEffect&>(s);
|
||||
GrGLEffect::EffectKey GrGLMatrixConvolutionEffect::GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
const GrMatrixConvolutionEffect& m =
|
||||
static_cast<const GrMatrixConvolutionEffect&>(*s.getEffect());
|
||||
EffectKey key = encodeXY(m.kernelSize().width(), m.kernelSize().height());
|
||||
key |= m.tileMode() << 7;
|
||||
key |= m.convolveAlpha() ? 1 << 9 : 0;
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#if SK_SUPPORT_GPU
|
||||
#include "GrContext.h"
|
||||
#include "GrTexture.h"
|
||||
#include "GrGpu.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
#include "effects/Gr1DKernelEffect.h"
|
||||
#endif
|
||||
|
@ -272,14 +272,14 @@ public:
|
|||
const GrEffect& effect);
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps);
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE;
|
||||
|
||||
|
@ -303,7 +303,7 @@ GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory
|
|||
}
|
||||
|
||||
void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -342,9 +342,8 @@ void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder,
|
|||
GrGLSLMulVarBy4f(code, 2, outputColor, inputColor);
|
||||
}
|
||||
|
||||
GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrEffect& s,
|
||||
const GrGLCaps& caps) {
|
||||
const GrMorphologyEffect& m = static_cast<const GrMorphologyEffect&>(s);
|
||||
GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
const GrMorphologyEffect& m = static_cast<const GrMorphologyEffect&>(*s.getEffect());
|
||||
EffectKey key = static_cast<EffectKey>(m.radius());
|
||||
key |= (m.type() << 8);
|
||||
return key;
|
||||
|
|
|
@ -217,6 +217,7 @@ bool SkTable_ColorFilter::asComponentTable(SkBitmap* table) const {
|
|||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
#include "SkGr.h"
|
||||
|
||||
|
@ -250,7 +251,7 @@ public:
|
|||
const GrEffect& effect);
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -259,7 +260,7 @@ public:
|
|||
|
||||
virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE {}
|
||||
|
||||
static EffectKey GenKey(const GrEffect&, const GrGLCaps&);
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
private:
|
||||
|
||||
|
@ -272,7 +273,7 @@ GLColorTableEffect::GLColorTableEffect(
|
|||
}
|
||||
|
||||
void GLColorTableEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -316,8 +317,7 @@ void GLColorTableEffect::emitCode(GrGLShaderBuilder* builder,
|
|||
code->appendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
|
||||
}
|
||||
|
||||
GrGLEffect::EffectKey GLColorTableEffect::GenKey(const GrEffect& s,
|
||||
const GrGLCaps& caps) {
|
||||
GrGLEffect::EffectKey GLColorTableEffect::GenKey(const GrEffectStage&, const GrGLCaps&) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -474,6 +474,8 @@ void SkLinearGradient::shadeSpan16(int x, int y,
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
class GrGLLinearGradient : public GrGLGradientEffect {
|
||||
|
@ -486,14 +488,14 @@ public:
|
|||
virtual ~GrGLLinearGradient() { }
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps) { return 0; }
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps& caps) { return 0; }
|
||||
|
||||
private:
|
||||
|
||||
|
@ -551,7 +553,7 @@ GrEffect* GrLinearGradient::TestCreate(SkRandom* random,
|
|||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GrGLLinearGradient::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
|
|
@ -473,6 +473,8 @@ void SkRadialGradient::shadeSpan(int x, int y,
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
class GrGLRadialGradient : public GrGLGradientEffect {
|
||||
public:
|
||||
|
||||
|
@ -481,14 +483,14 @@ public:
|
|||
virtual ~GrGLRadialGradient() { }
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps) { return 0; }
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps& caps) { return 0; }
|
||||
|
||||
private:
|
||||
|
||||
|
@ -549,7 +551,7 @@ GrEffect* GrRadialGradient::TestCreate(SkRandom* random,
|
|||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GrGLRadialGradient::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
|
|
@ -382,6 +382,8 @@ void SkSweepGradient::shadeSpan16(int x, int y, uint16_t* SK_RESTRICT dstC,
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
class GrGLSweepGradient : public GrGLGradientEffect {
|
||||
public:
|
||||
|
||||
|
@ -390,14 +392,14 @@ public:
|
|||
virtual ~GrGLSweepGradient() { }
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
const char* inputColor,
|
||||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
|
||||
static EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps) { return 0; }
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps& caps) { return 0; }
|
||||
|
||||
private:
|
||||
|
||||
|
@ -455,7 +457,7 @@ GrEffect* GrSweepGradient::TestCreate(SkRandom* random,
|
|||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
void GrGLSweepGradient::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
|
|
@ -315,6 +315,8 @@ void SkTwoPointConicalGradient::flatten(
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
// For brevity
|
||||
typedef GrGLUniformManager::UniformHandle UniformHandle;
|
||||
static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
|
||||
|
@ -327,7 +329,7 @@ public:
|
|||
virtual ~GrGLConical2Gradient() { }
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -335,7 +337,7 @@ public:
|
|||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE;
|
||||
|
||||
static EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps);
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps& caps);
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -466,7 +468,7 @@ GrGLConical2Gradient::GrGLConical2Gradient(
|
|||
}
|
||||
|
||||
void GrGLConical2Gradient::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -666,8 +668,8 @@ void GrGLConical2Gradient::setData(const GrGLUniformManager& uman, const GrEffec
|
|||
}
|
||||
}
|
||||
|
||||
GrEffect::EffectKey GrGLConical2Gradient::GenKey(const GrEffect& s, const GrGLCaps& caps) {
|
||||
return (static_cast<const GrConical2Gradient&>(s).isDegenerate());
|
||||
GrGLEffect::EffectKey GrGLConical2Gradient::GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
return (static_cast<const GrConical2Gradient&>(*s.getEffect()).isDegenerate());
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -349,6 +349,8 @@ void SkTwoPointRadialGradient::init() {
|
|||
|
||||
#if SK_SUPPORT_GPU
|
||||
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
// For brevity
|
||||
typedef GrGLUniformManager::UniformHandle UniformHandle;
|
||||
static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
|
||||
|
@ -362,7 +364,7 @@ public:
|
|||
virtual ~GrGLRadial2Gradient() { }
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -370,7 +372,7 @@ public:
|
|||
const TextureSamplerArray&) SK_OVERRIDE;
|
||||
virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE;
|
||||
|
||||
static EffectKey GenKey(const GrEffect& s, const GrGLCaps& caps);
|
||||
static EffectKey GenKey(const GrEffectStage&, const GrGLCaps& caps);
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -499,7 +501,7 @@ GrGLRadial2Gradient::GrGLRadial2Gradient(
|
|||
}
|
||||
|
||||
void GrGLRadial2Gradient::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -640,8 +642,8 @@ void GrGLRadial2Gradient::setData(const GrGLUniformManager& uman, const GrEffect
|
|||
}
|
||||
}
|
||||
|
||||
GrEffect::EffectKey GrGLRadial2Gradient::GenKey(const GrEffect& s, const GrGLCaps& caps) {
|
||||
return (static_cast<const GrRadial2Gradient&>(s).isDegenerate());
|
||||
GrGLEffect::EffectKey GrGLRadial2Gradient::GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
return (static_cast<const GrRadial2Gradient&>(*s.getEffect()).isDegenerate());
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#ifndef GrDrawState_DEFINED
|
||||
#define GrDrawState_DEFINED
|
||||
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrColor.h"
|
||||
#include "GrMatrix.h"
|
||||
#include "GrRefCnt.h"
|
||||
|
|
|
@ -5,8 +5,9 @@
|
|||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "GrContext.h"
|
||||
#include "GrEffect.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrContext.h"
|
||||
#include "GrMemoryPool.h"
|
||||
#include "SkTLS.h"
|
||||
|
||||
|
@ -49,6 +50,11 @@ bool GrEffect::isOpaque(bool inputTextureIsOpaque) const {
|
|||
return false;
|
||||
}
|
||||
|
||||
const char* GrEffect::name() const {
|
||||
return this->getFactory().name();
|
||||
}
|
||||
|
||||
|
||||
bool GrEffect::isEqual(const GrEffect& s) const {
|
||||
if (this->numTextures() != s.numTextures()) {
|
||||
return false;
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
*/
|
||||
|
||||
#include "GrConfigConversionEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
|
||||
class GrGLConfigConversionEffect : public GrGLEffect {
|
||||
|
@ -18,7 +19,7 @@ public:
|
|||
}
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -59,8 +60,9 @@ public:
|
|||
GrGLSLMulVarBy4f(&builder->fFSCode, 2, outputColor, inputColor);
|
||||
}
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect& s, const GrGLCaps&) {
|
||||
const GrConfigConversionEffect& effect = static_cast<const GrConfigConversionEffect&>(s);
|
||||
static inline EffectKey GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
const GrConfigConversionEffect& effect =
|
||||
static_cast<const GrConfigConversionEffect&>(*s.getEffect());
|
||||
return static_cast<int>(effect.swapsRedAndBlue()) | (effect.pmConversion() << 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "gl/GrGLEffect.h"
|
||||
#include "gl/GrGLSL.h"
|
||||
#include "gl/GrGLTexture.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
|
||||
// For brevity
|
||||
typedef GrGLUniformManager::UniformHandle UniformHandle;
|
||||
|
@ -20,7 +20,7 @@ public:
|
|||
GrGLConvolutionEffect(const GrBackendEffectFactory&, const GrEffect&);
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -29,7 +29,7 @@ public:
|
|||
|
||||
virtual void setData(const GrGLUniformManager& uman, const GrEffectStage&) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect&, const GrGLCaps&);
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&);
|
||||
|
||||
private:
|
||||
int width() const { return Gr1DKernelEffect::WidthFromRadius(fRadius); }
|
||||
|
@ -52,7 +52,7 @@ GrGLConvolutionEffect::GrGLConvolutionEffect(const GrBackendEffectFactory& facto
|
|||
}
|
||||
|
||||
void GrGLConvolutionEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -107,9 +107,8 @@ void GrGLConvolutionEffect::setData(const GrGLUniformManager& uman, const GrEffe
|
|||
uman.set1fv(fKernelUni, 0, this->width(), conv.kernel());
|
||||
}
|
||||
|
||||
GrGLEffect::EffectKey GrGLConvolutionEffect::GenKey(const GrEffect& s,
|
||||
const GrGLCaps& caps) {
|
||||
return static_cast<const GrConvolutionEffect&>(s).radius();
|
||||
GrGLEffect::EffectKey GrGLConvolutionEffect::GenKey(const GrEffectStage& s, const GrGLCaps&) {
|
||||
return static_cast<const GrConvolutionEffect&>(*s.getEffect()).radius();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include "gl/GrGLEffect.h"
|
||||
#include "gl/GrGLSL.h"
|
||||
#include "gl/GrGLTexture.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#include "GrTexture.h"
|
||||
|
||||
class GrGLSingleTextureEffect : public GrGLEffect {
|
||||
|
@ -19,7 +19,7 @@ public:
|
|||
}
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -31,7 +31,7 @@ public:
|
|||
builder->fFSCode.append(";\n");
|
||||
}
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect&, const GrGLCaps&) { return 0; }
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&) { return 0; }
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
@ -6,15 +6,15 @@
|
|||
*/
|
||||
|
||||
#include "GrTextureDomainEffect.h"
|
||||
#include "GrTBackendEffectFactory.h"
|
||||
#include "gl/GrGLEffect.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
|
||||
class GrGLTextureDomainEffect : public GrGLEffect {
|
||||
public:
|
||||
GrGLTextureDomainEffect(const GrBackendEffectFactory&, const GrEffect&);
|
||||
|
||||
virtual void emitCode(GrGLShaderBuilder*,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
@ -23,7 +23,7 @@ public:
|
|||
|
||||
virtual void setData(const GrGLUniformManager&, const GrEffectStage&) SK_OVERRIDE;
|
||||
|
||||
static inline EffectKey GenKey(const GrEffect&, const GrGLCaps&) { return 0; }
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&) { return 0; }
|
||||
|
||||
private:
|
||||
GrGLUniformManager::UniformHandle fNameUni;
|
||||
|
@ -38,7 +38,7 @@ GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendEffectFactory& f
|
|||
}
|
||||
|
||||
void GrGLTextureDomainEffect::emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect&,
|
||||
const GrEffectStage&,
|
||||
EffectKey,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
|
|
@ -8,14 +8,13 @@
|
|||
#ifndef GrGLEffect_DEFINED
|
||||
#define GrGLEffect_DEFINED
|
||||
|
||||
#include "GrAllocator.h"
|
||||
#include "GrEffectStage.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrGLProgram.h"
|
||||
#include "GrGLShaderBuilder.h"
|
||||
#include "GrGLShaderVar.h"
|
||||
#include "GrGLSL.h"
|
||||
|
||||
struct GrGLInterface;
|
||||
class GrEffectStage;
|
||||
class GrGLTexture;
|
||||
|
||||
/** @file
|
||||
|
@ -23,7 +22,7 @@ class GrGLTexture;
|
|||
include/gpu/GrEffect.h. Objects of type GrGLEffect are responsible for emitting the
|
||||
GLSL code that implements a GrEffect and for uploading uniforms at draw time. They also
|
||||
must have a function:
|
||||
static inline EffectKey GenKey(const GrEffect&, const GrGLCaps&)
|
||||
static inline EffectKey GenKey(const GrEffectStage&, const GrGLCaps&)
|
||||
that is used to implement a program cache. When two GrEffects produce the same key this means
|
||||
that their GrGLEffects would emit the same GLSL code.
|
||||
|
||||
|
@ -33,7 +32,8 @@ class GrGLTexture;
|
|||
class GrGLEffect {
|
||||
|
||||
public:
|
||||
typedef GrEffect::EffectKey EffectKey;
|
||||
typedef GrBackendEffectFactory::EffectKey EffectKey;
|
||||
|
||||
enum {
|
||||
// the number of bits in EffectKey available to GenKey
|
||||
kEffectKeyBits = GrBackendEffectFactory::kEffectKeyBits,
|
||||
|
@ -50,7 +50,7 @@ public:
|
|||
stages.
|
||||
|
||||
@param builder Interface used to emit code in the shaders.
|
||||
@param effect The effect that generated this program stage.
|
||||
@param stage The effect stage that generated this program stage.
|
||||
@param key The key that was computed by EffectKey() from the generating GrEffect.
|
||||
@param vertexCoords A vec2 of texture coordinates in the VS, which may be altered. This will
|
||||
be removed soon and stages will be responsible for computing their own
|
||||
|
@ -67,7 +67,7 @@ public:
|
|||
reads in the generated code.
|
||||
*/
|
||||
virtual void emitCode(GrGLShaderBuilder* builder,
|
||||
const GrEffect& effect,
|
||||
const GrEffectStage& stage,
|
||||
EffectKey key,
|
||||
const char* vertexCoords,
|
||||
const char* outputColor,
|
||||
|
|
|
@ -53,8 +53,8 @@ inline const char* dual_source_output_name() { return "dualSourceOut"; }
|
|||
|
||||
GrGLProgram* GrGLProgram::Create(const GrGLContextInfo& gl,
|
||||
const Desc& desc,
|
||||
const GrEffect** effects) {
|
||||
GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, effects));
|
||||
const GrEffectStage* stages[]) {
|
||||
GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, stages));
|
||||
if (!program->succeeded()) {
|
||||
delete program;
|
||||
program = NULL;
|
||||
|
@ -64,7 +64,7 @@ GrGLProgram* GrGLProgram::Create(const GrGLContextInfo& gl,
|
|||
|
||||
GrGLProgram::GrGLProgram(const GrGLContextInfo& gl,
|
||||
const Desc& desc,
|
||||
const GrEffect** effects)
|
||||
const GrEffectStage* stages[])
|
||||
: fContextInfo(gl)
|
||||
, fUniformManager(gl) {
|
||||
fDesc = desc;
|
||||
|
@ -86,7 +86,7 @@ GrGLProgram::GrGLProgram(const GrGLContextInfo& gl,
|
|||
fTextureOrigin[s] = GrSurface::kBottomLeft_Origin;
|
||||
}
|
||||
|
||||
this->genProgram(effects);
|
||||
this->genProgram(stages);
|
||||
}
|
||||
|
||||
GrGLProgram::~GrGLProgram() {
|
||||
|
@ -500,7 +500,7 @@ bool GrGLProgram::compileShaders(const GrGLShaderBuilder& builder) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GrGLProgram::genProgram(const GrEffect** effects) {
|
||||
bool GrGLProgram::genProgram(const GrEffectStage* stages[]) {
|
||||
GrAssert(0 == fProgramID);
|
||||
|
||||
GrGLShaderBuilder builder(fContextInfo, fUniformManager);
|
||||
|
@ -624,7 +624,7 @@ bool GrGLProgram::genProgram(const GrEffect** effects) {
|
|||
}
|
||||
|
||||
builder.setCurrentStage(s);
|
||||
fEffects[s] = GenStageCode(effects[s],
|
||||
fEffects[s] = GenStageCode(*stages[s],
|
||||
fDesc.fStages[s],
|
||||
&fUniforms.fStages[s],
|
||||
inColor.size() ? inColor.c_str() : NULL,
|
||||
|
@ -729,7 +729,7 @@ bool GrGLProgram::genProgram(const GrEffect** effects) {
|
|||
inCoverage.append("4");
|
||||
}
|
||||
builder.setCurrentStage(s);
|
||||
fEffects[s] = GenStageCode(effects[s],
|
||||
fEffects[s] = GenStageCode(*stages[s],
|
||||
fDesc.fStages[s],
|
||||
&fUniforms.fStages[s],
|
||||
inCoverage.size() ? inCoverage.c_str() : NULL,
|
||||
|
@ -896,14 +896,15 @@ void GrGLProgram::initSamplerUniforms() {
|
|||
// Stage code generation
|
||||
|
||||
// TODO: Move this function to GrGLShaderBuilder
|
||||
GrGLEffect* GrGLProgram::GenStageCode(const GrEffect* effect,
|
||||
const StageDesc& desc,
|
||||
StageUniforms* uniforms,
|
||||
const char* fsInColor, // NULL means no incoming color
|
||||
const char* fsOutColor,
|
||||
const char* vsInCoord,
|
||||
GrGLShaderBuilder* builder) {
|
||||
GrGLEffect* GrGLProgram::GenStageCode(const GrEffectStage& stage,
|
||||
const StageDesc& desc,
|
||||
StageUniforms* uniforms,
|
||||
const char* fsInColor, // NULL means no incoming color
|
||||
const char* fsOutColor,
|
||||
const char* vsInCoord,
|
||||
GrGLShaderBuilder* builder) {
|
||||
|
||||
const GrEffect* effect = stage.getEffect();
|
||||
GrGLEffect* glEffect = effect->getFactory().createGLInstance(*effect);
|
||||
|
||||
/// Vertex Shader Stuff
|
||||
|
@ -956,7 +957,7 @@ GrGLEffect* GrGLProgram::GenStageCode(const GrEffect* effect,
|
|||
builder->fVSCode.appendf("\t{ // %s\n", glEffect->name());
|
||||
builder->fFSCode.appendf("\t{ // %s \n", glEffect->name());
|
||||
glEffect->emitCode(builder,
|
||||
*effect,
|
||||
stage,
|
||||
desc.fEffectKey,
|
||||
varyingVSName,
|
||||
fsOutColor,
|
||||
|
|
|
@ -43,7 +43,7 @@ public:
|
|||
|
||||
static GrGLProgram* Create(const GrGLContextInfo& gl,
|
||||
const Desc& desc,
|
||||
const GrEffect** effects);
|
||||
const GrEffectStage* stages[]);
|
||||
|
||||
virtual ~GrGLProgram();
|
||||
|
||||
|
@ -163,24 +163,24 @@ private:
|
|||
|
||||
GrGLProgram(const GrGLContextInfo& gl,
|
||||
const Desc& desc,
|
||||
const GrEffect** effects);
|
||||
const GrEffectStage* stages[]);
|
||||
|
||||
bool succeeded() const { return 0 != fProgramID; }
|
||||
|
||||
/**
|
||||
* This is the heavy initialization routine for building a GLProgram.
|
||||
*/
|
||||
bool genProgram(const GrEffect** effects);
|
||||
bool genProgram(const GrEffectStage* stages[]);
|
||||
|
||||
void genInputColor(GrGLShaderBuilder* builder, SkString* inColor);
|
||||
|
||||
static GrGLEffect* GenStageCode(const GrEffect* effect,
|
||||
const StageDesc& desc, // TODO: Eliminate this
|
||||
StageUniforms* stageUniforms, // TODO: Eliminate this
|
||||
const char* fsInColor, // NULL means no incoming color
|
||||
const char* fsOutColor,
|
||||
const char* vsInCoord,
|
||||
GrGLShaderBuilder* builder);
|
||||
static GrGLEffect* GenStageCode(const GrEffectStage& stage,
|
||||
const StageDesc& desc, // TODO: Eliminate this
|
||||
StageUniforms* stageUniforms, // TODO: Eliminate this
|
||||
const char* fsInColor, // NULL means no incoming color
|
||||
const char* fsOutColor,
|
||||
const char* vsInCoord,
|
||||
GrGLShaderBuilder* builder);
|
||||
|
||||
void genGeometryShader(GrGLShaderBuilder* segments) const;
|
||||
|
||||
|
|
|
@ -153,9 +153,10 @@ void GrGLShaderBuilder::appendTextureLookupAndModulate(
|
|||
GrGLSLModulate4f(out, modulation, lookup.c_str());
|
||||
}
|
||||
|
||||
GrEffect::EffectKey GrGLShaderBuilder::KeyForTextureAccess(const GrTextureAccess& access,
|
||||
const GrGLCaps& caps) {
|
||||
GrEffect::EffectKey key = 0;
|
||||
GrBackendEffectFactory::EffectKey GrGLShaderBuilder::KeyForTextureAccess(
|
||||
const GrTextureAccess& access,
|
||||
const GrGLCaps& caps) {
|
||||
GrBackendEffectFactory::EffectKey key = 0;
|
||||
|
||||
// Assume that swizzle support implies that we never have to modify a shader to adjust
|
||||
// for texture format/swizzle settings.
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#define GrGLShaderBuilder_DEFINED
|
||||
|
||||
#include "GrAllocator.h"
|
||||
#include "GrBackendEffectFactory.h"
|
||||
#include "GrEffect.h"
|
||||
#include "gl/GrGLShaderVar.h"
|
||||
#include "gl/GrGLSL.h"
|
||||
|
@ -122,8 +123,8 @@ public:
|
|||
/** Generates a EffectKey for the shader code based on the texture access parameters and the
|
||||
capabilities of the GL context. This is useful for keying the shader programs that may
|
||||
have multiple representations, based on the type/format of textures used. */
|
||||
static GrEffect::EffectKey KeyForTextureAccess(const GrTextureAccess& access,
|
||||
const GrGLCaps& caps);
|
||||
static GrBackendEffectFactory::EffectKey KeyForTextureAccess(const GrTextureAccess&,
|
||||
const GrGLCaps&);
|
||||
|
||||
/** If texture swizzling is available using tex parameters then it is preferred over mangling
|
||||
the generated shader code. This potentially allows greater reuse of cached shaders. */
|
||||
|
|
|
@ -163,7 +163,7 @@ private:
|
|||
ProgramCache(const GrGLContextInfo& gl);
|
||||
|
||||
void abandon();
|
||||
GrGLProgram* getProgram(const GrGLProgram::Desc& desc, const GrEffect** stages);
|
||||
GrGLProgram* getProgram(const GrGLProgram::Desc& desc, const GrEffectStage* stages[]);
|
||||
private:
|
||||
enum {
|
||||
kKeySize = sizeof(ProgramDesc),
|
||||
|
@ -237,7 +237,6 @@ private:
|
|||
void buildProgram(bool isPoints,
|
||||
BlendOptFlags blendOpts,
|
||||
GrBlendCoeff dstCoeff,
|
||||
const GrEffect** effects,
|
||||
ProgramDesc* desc);
|
||||
|
||||
// Inits GrDrawTarget::Caps, subclass may enable additional caps.
|
||||
|
|
|
@ -33,7 +33,7 @@ void GrGpuGL::ProgramCache::abandon() {
|
|||
}
|
||||
|
||||
GrGLProgram* GrGpuGL::ProgramCache::getProgram(const ProgramDesc& desc,
|
||||
const GrEffect** stages) {
|
||||
const GrEffectStage* stages[]) {
|
||||
Entry newEntry;
|
||||
newEntry.fKey.setKeyData(desc.asKey());
|
||||
|
||||
|
@ -345,11 +345,14 @@ bool GrGpuGL::flushGraphicsState(DrawType type) {
|
|||
return false;
|
||||
}
|
||||
|
||||
const GrEffect* effects[GrDrawState::kNumStages];
|
||||
const GrEffectStage* stages[GrDrawState::kNumStages];
|
||||
for (int i = 0; i < GrDrawState::kNumStages; ++i) {
|
||||
stages[i] = drawState.isStageEnabled(i) ? &drawState.getStage(i) : NULL;
|
||||
}
|
||||
GrGLProgram::Desc desc;
|
||||
this->buildProgram(kDrawPoints_DrawType == type, blendOpts, dstCoeff, effects, &desc);
|
||||
this->buildProgram(kDrawPoints_DrawType == type, blendOpts, dstCoeff, &desc);
|
||||
|
||||
fCurrentProgram.reset(fProgramCache->getProgram(desc, effects));
|
||||
fCurrentProgram.reset(fProgramCache->getProgram(desc, stages));
|
||||
if (NULL == fCurrentProgram.get()) {
|
||||
GrAssert(!"Failed to create program!");
|
||||
return false;
|
||||
|
@ -558,30 +561,9 @@ void GrGpuGL::setupGeometry(int* startVertex,
|
|||
fHWGeometryState.fArrayPtrsDirty = false;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
void setup_effect(GrGLProgram::Desc::StageDesc* stageDesc,
|
||||
const GrEffectStage& stage,
|
||||
const GrGLCaps& caps,
|
||||
const GrEffect** effects,
|
||||
GrGLProgram* program, int index) {
|
||||
const GrEffect* effect = stage.getEffect();
|
||||
if (effect) {
|
||||
const GrBackendEffectFactory& factory = effect->getFactory();
|
||||
stageDesc->fEffectKey = factory.glEffectKey(*effect, caps);
|
||||
effects[index] = effect;
|
||||
} else {
|
||||
stageDesc->fEffectKey = 0;
|
||||
effects[index] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void GrGpuGL::buildProgram(bool isPoints,
|
||||
BlendOptFlags blendOpts,
|
||||
GrBlendCoeff dstCoeff,
|
||||
const GrEffect** effects,
|
||||
ProgramDesc* desc) {
|
||||
const GrDrawState& drawState = this->getDrawState();
|
||||
|
||||
|
@ -687,12 +669,11 @@ void GrGpuGL::buildProgram(bool isPoints,
|
|||
// This will go away when effects manage their own texture matrix.
|
||||
stageDesc.fOptFlags |= StageDesc::kIdentityMatrix_OptFlagBit;
|
||||
}
|
||||
setup_effect(&stageDesc, stage, this->glCaps(), effects, fCurrentProgram.get(), s);
|
||||
|
||||
const GrBackendEffectFactory& factory = effect->getFactory();
|
||||
stageDesc.fEffectKey = factory.glEffectKey(stage, this->glCaps());
|
||||
} else {
|
||||
stageDesc.fOptFlags = 0;
|
||||
stageDesc.fEffectKey = 0;
|
||||
effects[s] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,13 +32,10 @@ bool random_bool(GrRandom* r) {
|
|||
}
|
||||
|
||||
typedef GrGLProgram::StageDesc StageDesc;
|
||||
// TODO: Effects should be able to register themselves for inclusion in the
|
||||
// randomly generated shaders. They should be able to configure themselves
|
||||
// randomly.
|
||||
const GrEffect* create_random_effect(StageDesc* stageDesc,
|
||||
GrRandom* random,
|
||||
GrContext* context,
|
||||
GrTexture* dummyTextures[]) {
|
||||
|
||||
const GrEffect* create_random_effect(GrRandom* random,
|
||||
GrContext* context,
|
||||
GrTexture* dummyTextures[]) {
|
||||
|
||||
// The new code uses SkRandom not GrRandom.
|
||||
// TODO: Remove GrRandom.
|
||||
|
@ -118,7 +115,7 @@ bool GrGpuGL::programUnitTest() {
|
|||
pdesc.fDualSrcOutput = ProgramDesc::kNone_DualSrcOutput;
|
||||
}
|
||||
|
||||
SkAutoTUnref<const GrEffect> effects[GrDrawState::kNumStages];
|
||||
GrEffectStage stages[GrDrawState::kNumStages];
|
||||
|
||||
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
||||
StageDesc& stageDesc = pdesc.fStages[s];
|
||||
|
@ -141,22 +138,23 @@ bool GrGpuGL::programUnitTest() {
|
|||
|
||||
if (stageDesc.isEnabled()) {
|
||||
GrTexture* dummyTextures[] = {dummyTexture1.get(), dummyTexture2.get()};
|
||||
effects[s].reset(create_random_effect(&stageDesc,
|
||||
&random,
|
||||
getContext(),
|
||||
dummyTextures));
|
||||
if (NULL != effects[s]) {
|
||||
SkAutoTUnref<const GrEffect> effect(create_random_effect(&random,
|
||||
getContext(),
|
||||
dummyTextures));
|
||||
stages[s].setEffect(effect.get());
|
||||
if (NULL != stages[s].getEffect()) {
|
||||
stageDesc.fEffectKey =
|
||||
effects[s]->getFactory().glEffectKey(*effects[s], this->glCaps());
|
||||
stages[s].getEffect()->getFactory().glEffectKey(stages[s], this->glCaps());
|
||||
}
|
||||
}
|
||||
}
|
||||
GR_STATIC_ASSERT(sizeof(effects) ==
|
||||
GrDrawState::kNumStages * sizeof(GrEffect*));
|
||||
const GrEffect** stages = reinterpret_cast<const GrEffect**>(&effects);
|
||||
const GrEffectStage* stagePtrs[GrDrawState::kNumStages];
|
||||
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
||||
stagePtrs[s] = &stages[s];
|
||||
}
|
||||
SkAutoTUnref<GrGLProgram> program(GrGLProgram::Create(this->glContextInfo(),
|
||||
pdesc,
|
||||
stages));
|
||||
stagePtrs));
|
||||
if (NULL == program.get()) {
|
||||
return false;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче