Chromium Code Reviews| Index: include/gpu/GrTBackendEffectFactory.h |
| diff --git a/include/gpu/GrTBackendEffectFactory.h b/include/gpu/GrTBackendEffectFactory.h |
| index fd14b4fa8ecc5bfa6f5216ce10be50db5aec9861..cd4c0a49e96a40aa16622606027717aad03784d1 100644 |
| --- a/include/gpu/GrTBackendEffectFactory.h |
| +++ b/include/gpu/GrTBackendEffectFactory.h |
| @@ -26,39 +26,30 @@ public: |
| */ |
| 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 GrDrawEffect& drawEffect, |
| - const GrGLCaps& caps) const SK_OVERRIDE { |
| + /** Generates an effect's key. 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. If this fails |
| + then program generation should be aborted. Failure occurs if the effect uses more |
| + transforms, attributes, or textures than the key has space for. */ |
| + virtual bool getGLEffectKey(const GrDrawEffect& drawEffect, |
| + const GrGLCaps& caps, |
| + GrEffectKeyBuilder* b) const SK_OVERRIDE { |
| SkASSERT(kIllegalEffectClassID != fEffectClassID); |
| EffectKey effectKey = GLEffect::GenKey(drawEffect, caps); |
| EffectKey textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, caps); |
| EffectKey transformKey = GrGLProgramEffects::GenTransformKey(drawEffect); |
| EffectKey attribKey = GrGLProgramEffects::GenAttribKey(drawEffect); |
|
jvanverth1
2014/07/11 15:33:12
It took me a while to figure out what this is doin
|
| -#ifdef SK_DEBUG |
| - static const EffectKey kIllegalEffectKeyMask = (uint16_t) (~((1U << kEffectKeyBits) - 1)); |
| - SkASSERT(!(kIllegalEffectKeyMask & effectKey)); |
| - |
| - static const EffectKey kIllegalTextureKeyMask = (uint16_t) (~((1U << kTextureKeyBits) - 1)); |
| - SkASSERT(!(kIllegalTextureKeyMask & textureKey)); |
| - |
| - static const EffectKey kIllegalTransformKeyMask = (uint16_t) (~((1U << kTransformKeyBits) - 1)); |
| - SkASSERT(!(kIllegalTransformKeyMask & transformKey)); |
| - |
| - static const EffectKey kIllegalAttribKeyMask = (uint16_t) (~((1U << kAttribKeyBits) - 1)); |
| - SkASSERT(!(kIllegalAttribKeyMask & textureKey)); |
| + static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16); |
| + if ((textureKey | transformKey | attribKey | fEffectClassID) & kMetaKeyInvalidMask) { |
| + return false; |
| + } |
| - static const EffectKey kIllegalClassIDMask = (uint16_t) (~((1U << kClassIDBits) - 1)); |
| - SkASSERT(!(kIllegalClassIDMask & fEffectClassID)); |
| -#endif |
| - return (fEffectClassID << (kEffectKeyBits+kTextureKeyBits+kTransformKeyBits+kAttribKeyBits)) | |
| - (attribKey << (kEffectKeyBits+kTextureKeyBits+kTransformKeyBits)) | |
| - (transformKey << (kEffectKeyBits+kTextureKeyBits)) | |
| - (textureKey << kEffectKeyBits) | |
| - (effectKey); |
| + // effectKey must be first because it is what will be returned by |
| + // GrGLProgramDesc::EffectKeyProvider and passed to the GrGLEffect as its key. |
| + b->add32(effectKey); |
| + b->add32(textureKey << 16 | transformKey); |
| + b->add32(fEffectClassID << 16 | attribKey); |
| + return true; |
| } |
| /** Returns a new instance of the appropriate *GL* implementation class |