Index: include/gpu/GrBackendEffectFactory.h |
diff --git a/include/gpu/GrBackendEffectFactory.h b/include/gpu/GrBackendEffectFactory.h |
index af8d5c76c577b9bfb3034c602ab82bf2e329e160..32f14f27460955a0f99939faaaef27a4d87ec9b3 100644 |
--- a/include/gpu/GrBackendEffectFactory.h |
+++ b/include/gpu/GrBackendEffectFactory.h |
@@ -12,6 +12,7 @@ |
#include "SkTemplates.h" |
#include "SkThread.h" |
#include "SkTypes.h" |
+#include "SkTArray.h" |
/** 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 |
@@ -27,23 +28,32 @@ class GrGLEffect; |
class GrGLCaps; |
class GrDrawEffect; |
+/** |
+ * Used by effects to build their keys. It incorpates each per-effect key into a larger shader key. |
jvanverth1
2014/07/11 15:33:12
Typo: incorporates
|
+ */ |
+class GrEffectKeyBuilder { |
+public: |
+ GrEffectKeyBuilder(SkTArray<unsigned char, true>* data) : fData(data), fCount(0) { |
+ SkASSERT(0 == fData->count() % sizeof(uint32_t)); |
+ } |
+ |
+ void add32(uint32_t v) { |
+ ++fCount; |
+ fData->push_back_n(4, reinterpret_cast<uint8_t*>(&v)); |
+ } |
+ |
+ size_t size() const { return sizeof(uint32_t) * fCount; } |
+ |
+private: |
+ SkTArray<uint8_t, true>* fData; // unowned ptr to the larger key. |
+ int fCount; // number of uint32_ts added to fData by the effect. |
+}; |
+ |
class GrBackendEffectFactory : SkNoncopyable { |
public: |
typedef uint32_t EffectKey; |
- enum { |
- kNoEffectKey = 0, |
- kEffectKeyBits = 10, |
- /** |
- * The framework automatically includes coord transforms and texture accesses in their |
- * effect's EffectKey, so effects don't need to account for them in GenKey(). |
- */ |
- kTextureKeyBits = 4, |
- kTransformKeyBits = 6, |
- kAttribKeyBits = 6, |
- kClassIDBits = 6 |
- }; |
- virtual EffectKey glEffectKey(const GrDrawEffect&, const GrGLCaps&) const = 0; |
+ virtual bool getGLEffectKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*) const = 0; |
virtual GrGLEffect* createGLInstance(const GrDrawEffect&) const = 0; |
bool operator ==(const GrBackendEffectFactory& b) const { |
@@ -55,10 +65,6 @@ public: |
virtual const char* name() const = 0; |
- static EffectKey GetTransformKey(EffectKey key) { |
- return key >> (kEffectKeyBits + kTextureKeyBits) & ((1U << kTransformKeyBits) - 1); |
- } |
- |
protected: |
enum { |
kIllegalEffectClassID = 0, |
@@ -69,18 +75,15 @@ protected: |
} |
virtual ~GrBackendEffectFactory() {} |
- static EffectKey GenID() { |
- SkDEBUGCODE(static const int32_t kClassIDBits = 8 * sizeof(EffectKey) - |
- kTextureKeyBits - kEffectKeyBits - kAttribKeyBits); |
+ static int32_t GenID() { |
// fCurrEffectClassID has been initialized to kIllegalEffectClassID. The |
// atomic inc returns the old value not the incremented value. So we add |
// 1 to the returned value. |
int32_t id = sk_atomic_inc(&fCurrEffectClassID) + 1; |
- SkASSERT(id < (1 << kClassIDBits)); |
- return static_cast<EffectKey>(id); |
+ return id; |
} |
- EffectKey fEffectClassID; |
+ int32_t fEffectClassID; |
private: |
static int32_t fCurrEffectClassID; |