Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Side by Side Diff: include/gpu/GrTBackendEffectFactory.h

Issue 356513003: Step towards variable length effect keys. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tweak comment Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef GrTBackendEffectFactory_DEFINED 8 #ifndef GrTBackendEffectFactory_DEFINED
9 #define GrTBackendEffectFactory_DEFINED 9 #define GrTBackendEffectFactory_DEFINED
10 10
11 #include "GrBackendEffectFactory.h" 11 #include "GrBackendEffectFactory.h"
12 #include "GrDrawEffect.h" 12 #include "GrDrawEffect.h"
13 #include "gl/GrGLProgramEffects.h" 13 #include "gl/GrGLProgramEffects.h"
14 14
15 /** 15 /**
16 * Implements GrBackendEffectFactory for a GrEffect subclass as a singleton. 16 * Implements GrBackendEffectFactory for a GrEffect subclass as a singleton.
17 */ 17 */
18 template <typename EffectClass> 18 template <typename EffectClass>
19 class GrTBackendEffectFactory : public GrBackendEffectFactory { 19 class GrTBackendEffectFactory : public GrBackendEffectFactory {
20 20
21 public: 21 public:
22 typedef typename EffectClass::GLEffect GLEffect; 22 typedef typename EffectClass::GLEffect GLEffect;
23 23
24 /** Returns a human-readable name that is accessible via GrEffect or 24 /** Returns a human-readable name that is accessible via GrEffect or
25 GrGLEffect and is consistent between the two of them. 25 GrGLEffect and is consistent between the two of them.
26 */ 26 */
27 virtual const char* name() const SK_OVERRIDE { return EffectClass::Name(); } 27 virtual const char* name() const SK_OVERRIDE { return EffectClass::Name(); }
28 28
29 /** Returns a value that identifies the GLSL shader code generated by 29 /** Generates an effect's key. This enables caching of generated shaders. Pa rt of the
30 a GrEffect. This enables caching of generated shaders. Part of the 30 id identifies the GrEffect subclass. The remainder is based on the aspec ts of the
31 id identifies the GrEffect subclass. The remainder is based 31 GrEffect object's configuration that affect GLSL code generation. If thi s fails
32 on the aspects of the GrEffect object's configuration that affect 32 then program generation should be aborted. Failure occurs if the effect uses more
33 GLSL code generation. */ 33 transforms, attributes, or textures than the key has space for. */
34 virtual EffectKey glEffectKey(const GrDrawEffect& drawEffect, 34 virtual bool getGLEffectKey(const GrDrawEffect& drawEffect,
35 const GrGLCaps& caps) const SK_OVERRIDE { 35 const GrGLCaps& caps,
36 GrEffectKeyBuilder* b) const SK_OVERRIDE {
36 SkASSERT(kIllegalEffectClassID != fEffectClassID); 37 SkASSERT(kIllegalEffectClassID != fEffectClassID);
37 EffectKey effectKey = GLEffect::GenKey(drawEffect, caps); 38 EffectKey effectKey = GLEffect::GenKey(drawEffect, caps);
38 EffectKey textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, cap s); 39 EffectKey textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, cap s);
39 EffectKey transformKey = GrGLProgramEffects::GenTransformKey(drawEffect) ; 40 EffectKey transformKey = GrGLProgramEffects::GenTransformKey(drawEffect) ;
40 EffectKey attribKey = GrGLProgramEffects::GenAttribKey(drawEffect); 41 EffectKey attribKey = GrGLProgramEffects::GenAttribKey(drawEffect);
jvanverth1 2014/07/11 15:33:12 It took me a while to figure out what this is doin
41 #ifdef SK_DEBUG 42 static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16);
42 static const EffectKey kIllegalEffectKeyMask = (uint16_t) (~((1U << kEff ectKeyBits) - 1)); 43 if ((textureKey | transformKey | attribKey | fEffectClassID) & kMetaKeyI nvalidMask) {
43 SkASSERT(!(kIllegalEffectKeyMask & effectKey)); 44 return false;
45 }
44 46
45 static const EffectKey kIllegalTextureKeyMask = (uint16_t) (~((1U << kTe xtureKeyBits) - 1)); 47 // effectKey must be first because it is what will be returned by
46 SkASSERT(!(kIllegalTextureKeyMask & textureKey)); 48 // GrGLProgramDesc::EffectKeyProvider and passed to the GrGLEffect as it s key.
47 49 b->add32(effectKey);
48 static const EffectKey kIllegalTransformKeyMask = (uint16_t) (~((1U << k TransformKeyBits) - 1)); 50 b->add32(textureKey << 16 | transformKey);
49 SkASSERT(!(kIllegalTransformKeyMask & transformKey)); 51 b->add32(fEffectClassID << 16 | attribKey);
50 52 return true;
51 static const EffectKey kIllegalAttribKeyMask = (uint16_t) (~((1U << kAtt ribKeyBits) - 1));
52 SkASSERT(!(kIllegalAttribKeyMask & textureKey));
53
54 static const EffectKey kIllegalClassIDMask = (uint16_t) (~((1U << kClass IDBits) - 1));
55 SkASSERT(!(kIllegalClassIDMask & fEffectClassID));
56 #endif
57 return (fEffectClassID << (kEffectKeyBits+kTextureKeyBits+kTransformKeyB its+kAttribKeyBits)) |
58 (attribKey << (kEffectKeyBits+kTextureKeyBits+kTransformKeyBits)) |
59 (transformKey << (kEffectKeyBits+kTextureKeyBits)) |
60 (textureKey << kEffectKeyBits) |
61 (effectKey);
62 } 53 }
63 54
64 /** Returns a new instance of the appropriate *GL* implementation class 55 /** Returns a new instance of the appropriate *GL* implementation class
65 for the given GrEffect; caller is responsible for deleting 56 for the given GrEffect; caller is responsible for deleting
66 the object. */ 57 the object. */
67 virtual GrGLEffect* createGLInstance(const GrDrawEffect& drawEffect) const S K_OVERRIDE { 58 virtual GrGLEffect* createGLInstance(const GrDrawEffect& drawEffect) const S K_OVERRIDE {
68 return SkNEW_ARGS(GLEffect, (*this, drawEffect)); 59 return SkNEW_ARGS(GLEffect, (*this, drawEffect));
69 } 60 }
70 61
71 /** This class is a singleton. This function returns the single instance. 62 /** This class is a singleton. This function returns the single instance.
72 */ 63 */
73 static const GrBackendEffectFactory& getInstance() { 64 static const GrBackendEffectFactory& getInstance() {
74 static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem; 65 static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem;
75 static const GrTBackendEffectFactory* gInstance; 66 static const GrTBackendEffectFactory* gInstance;
76 if (!gInstance) { 67 if (!gInstance) {
77 gInstance = SkNEW_PLACEMENT(gInstanceMem.get(), 68 gInstance = SkNEW_PLACEMENT(gInstanceMem.get(),
78 GrTBackendEffectFactory); 69 GrTBackendEffectFactory);
79 } 70 }
80 return *gInstance; 71 return *gInstance;
81 } 72 }
82 73
83 protected: 74 protected:
84 GrTBackendEffectFactory() { 75 GrTBackendEffectFactory() {
85 fEffectClassID = GenID(); 76 fEffectClassID = GenID();
86 } 77 }
87 }; 78 };
88 79
89 #endif 80 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698