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

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

Issue 394213002: Revert of Makes GrGLProgramDesc's key store the lengths as well as offsets of the effect keys. (Closed) Base URL: https://skia.googlesource.com/skia.git@key
Patch Set: 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
« no previous file with comments | « include/gpu/GrBackendEffectFactory.h ('k') | src/gpu/gl/GrGLProgramDesc.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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. Thi s can be used by 16 * Implements GrBackendEffectFactory for a GrEffect subclass as a singleton.
17 * most GrEffect subclasses to implement the GrEffect::getFactory() method:
18 *
19 * const GrBackendEffectFactory& MyEffect::getFactory() const {
20 * return GrTBackendEffectFactory<MyEffect>::getInstance();
21 * }
22 *
23 * Using this class requires that the GrEffect subclass always produces the same GrGLEffect
24 * subclass. Additionally, It adds the following requirements to the GrEffect an d GrGLEffect
25 * subclasses:
26 *
27 * 1. The GrGLEffect used by GrEffect subclass MyEffect must be named or typedef 'ed to
28 * MyEffect::GLEffect.
29 * 2. MyEffect::GLEffect must have a static function:
30 * EffectKey GenKey(const GrDrawEffect, const GrGLCaps&)
31 * which generates a key that maps 1 to 1 with code variations emitted by
32 * MyEffect::GLEffect::emitCode().
33 * 3. MyEffect must have a static function:
34 * const char* Name()
35 * which returns a human-readable name for the effect.
36 */ 17 */
37 template <typename EffectClass> 18 template <typename EffectClass>
38 class GrTBackendEffectFactory : public GrBackendEffectFactory { 19 class GrTBackendEffectFactory : public GrBackendEffectFactory {
39 20
40 public: 21 public:
41 typedef typename EffectClass::GLEffect GLEffect; 22 typedef typename EffectClass::GLEffect GLEffect;
42 23
43 /** Returns a human-readable name for the effect. Implemented using GLEffect ::Name as described 24 /** Returns a human-readable name that is accessible via GrEffect or
44 * in this class's comment. */ 25 GrGLEffect and is consistent between the two of them.
26 */
45 virtual const char* name() const SK_OVERRIDE { return EffectClass::Name(); } 27 virtual const char* name() const SK_OVERRIDE { return EffectClass::Name(); }
46 28
47 29 /** Generates an effect's key. This enables caching of generated shaders. Pa rt of the
48 /** Implemented using GLEffect::GenKey as described in this class's comment. */ 30 id identifies the GrEffect subclass. The remainder is based on the aspec ts of the
49 virtual void getGLEffectKey(const GrDrawEffect& drawEffect, 31 GrEffect object's configuration that affect GLSL code generation. If thi s fails
32 then program generation should be aborted. Failure occurs if the effect uses more
33 transforms, attributes, or textures than the key has space for. */
34 virtual bool getGLEffectKey(const GrDrawEffect& drawEffect,
50 const GrGLCaps& caps, 35 const GrGLCaps& caps,
51 GrEffectKeyBuilder* b) const SK_OVERRIDE { 36 GrEffectKeyBuilder* b) const SK_OVERRIDE {
37 SkASSERT(kIllegalEffectClassID != fEffectClassID);
52 EffectKey effectKey = GLEffect::GenKey(drawEffect, caps); 38 EffectKey effectKey = GLEffect::GenKey(drawEffect, caps);
39 EffectKey textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, cap s);
40 EffectKey transformKey = GrGLProgramEffects::GenTransformKey(drawEffect) ;
41 EffectKey attribKey = GrGLProgramEffects::GenAttribKey(drawEffect);
42 static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16);
43 if ((textureKey | transformKey | attribKey | fEffectClassID) & kMetaKeyI nvalidMask) {
44 return false;
45 }
46
47 // effectKey must be first because it is what will be returned by
48 // GrGLProgramDesc::EffectKeyProvider and passed to the GrGLEffect as it s key.
53 b->add32(effectKey); 49 b->add32(effectKey);
50 b->add32(textureKey << 16 | transformKey);
51 b->add32(fEffectClassID << 16 | attribKey);
52 return true;
54 } 53 }
55 54
56 /** Returns a new instance of the appropriate *GL* implementation class 55 /** Returns a new instance of the appropriate *GL* implementation class
57 for the given GrEffect; caller is responsible for deleting 56 for the given GrEffect; caller is responsible for deleting
58 the object. */ 57 the object. */
59 virtual GrGLEffect* createGLInstance(const GrDrawEffect& drawEffect) const S K_OVERRIDE { 58 virtual GrGLEffect* createGLInstance(const GrDrawEffect& drawEffect) const S K_OVERRIDE {
60 return SkNEW_ARGS(GLEffect, (*this, drawEffect)); 59 return SkNEW_ARGS(GLEffect, (*this, drawEffect));
61 } 60 }
62 61
63 /** This class is a singleton. This function returns the single instance. */ 62 /** This class is a singleton. This function returns the single instance.
63 */
64 static const GrBackendEffectFactory& getInstance() { 64 static const GrBackendEffectFactory& getInstance() {
65 static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem; 65 static SkAlignedSTStorage<1, GrTBackendEffectFactory> gInstanceMem;
66 static const GrTBackendEffectFactory* gInstance; 66 static const GrTBackendEffectFactory* gInstance;
67 if (!gInstance) { 67 if (!gInstance) {
68 gInstance = SkNEW_PLACEMENT(gInstanceMem.get(), 68 gInstance = SkNEW_PLACEMENT(gInstanceMem.get(),
69 GrTBackendEffectFactory); 69 GrTBackendEffectFactory);
70 } 70 }
71 return *gInstance; 71 return *gInstance;
72 } 72 }
73 73
74 protected: 74 protected:
75 GrTBackendEffectFactory() {} 75 GrTBackendEffectFactory() {
76 fEffectClassID = GenID();
77 }
76 }; 78 };
77 79
78 #endif 80 #endif
OLDNEW
« no previous file with comments | « include/gpu/GrBackendEffectFactory.h ('k') | src/gpu/gl/GrGLProgramDesc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698