91274b9972
git-svn-id: http://skia.googlecode.com/svn/trunk@8120 2bbb7eff-a529-9590-31e7-b0007b416f81
79 lines
3.0 KiB
C++
79 lines
3.0 KiB
C++
/*
|
|
* Copyright 2012 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef GrTBackendEffectFactory_DEFINED
|
|
#define GrTBackendEffectFactory_DEFINED
|
|
|
|
#include "GrBackendEffectFactory.h"
|
|
#include "GrEffectStage.h"
|
|
|
|
/**
|
|
* Implements GrBackendEffectFactory for a GrEffect subclass as a singleton.
|
|
*/
|
|
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 GrEffectStage& stage,
|
|
const GrGLCaps& caps) const SK_OVERRIDE {
|
|
GrAssert(kIllegalEffectClassID != fEffectClassID);
|
|
EffectKey effectKey = GLEffect::GenKey(stage, caps);
|
|
EffectKey textureKey = GLEffect::GenTextureKey(stage.getEffect(), caps);
|
|
EffectKey attribKey = GLEffect::GenAttribKey(stage);
|
|
#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));
|
|
|
|
static const EffectKey kIllegalAttribKeyMask = (uint16_t) (~((1U << kAttribKeyBits) - 1));
|
|
GrAssert(!(kIllegalAttribKeyMask & textureKey));
|
|
#endif
|
|
return fEffectClassID | (attribKey << (kEffectKeyBits+kTextureKeyBits)) |
|
|
(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 GrEffectRef& 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
|