OLD | NEW |
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 GrEffect_DEFINED | 8 #ifndef GrEffect_DEFINED |
9 #define GrEffect_DEFINED | 9 #define GrEffect_DEFINED |
10 | 10 |
11 #include "GrColor.h" | 11 #include "GrColor.h" |
12 #include "GrEffectUnitTest.h" | 12 #include "GrEffectUnitTest.h" |
13 #include "GrProgramElement.h" | 13 #include "GrProgramElement.h" |
| 14 #include "GrShaderVar.h" |
14 #include "GrTextureAccess.h" | 15 #include "GrTextureAccess.h" |
15 #include "GrTypesPriv.h" | 16 #include "GrTypesPriv.h" |
| 17 #include "SkString.h" |
16 | 18 |
17 class GrBackendEffectFactory; | 19 class GrBackendEffectFactory; |
18 class GrContext; | 20 class GrContext; |
19 class GrCoordTransform; | 21 class GrCoordTransform; |
20 | 22 |
21 | |
22 /** Provides custom vertex shader, fragment shader, uniform data for a particula
r stage of the | 23 /** Provides custom vertex shader, fragment shader, uniform data for a particula
r stage of the |
23 Ganesh shading pipeline. | 24 Ganesh shading pipeline. |
24 Subclasses must have a function that produces a human-readable name: | 25 Subclasses must have a function that produces a human-readable name: |
25 static const char* Name(); | 26 static const char* Name(); |
26 GrEffect objects *must* be immutable: after being constructed, their fields
may not change. | 27 GrEffect objects *must* be immutable: after being constructed, their fields
may not change. |
27 | 28 |
28 Dynamically allocated GrEffects are managed by a per-thread memory pool. The
ref count of an | 29 Dynamically allocated GrEffects are managed by a per-thread memory pool. The
ref count of an |
29 effect must reach 0 before the thread terminates and the pool is destroyed.
To create a static | 30 effect must reach 0 before the thread terminates and the pool is destroyed.
To create a static |
30 effect use the macro GR_CREATE_STATIC_EFFECT declared below. | 31 effect use the macro GR_CREATE_STATIC_EFFECT declared below. |
31 */ | 32 */ |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 /** Will this effect read the destination pixel value? */ | 108 /** Will this effect read the destination pixel value? */ |
108 bool willReadDstColor() const { return fWillReadDstColor; } | 109 bool willReadDstColor() const { return fWillReadDstColor; } |
109 | 110 |
110 /** Will this effect read the fragment position? */ | 111 /** Will this effect read the fragment position? */ |
111 bool willReadFragmentPosition() const { return fWillReadFragmentPosition; } | 112 bool willReadFragmentPosition() const { return fWillReadFragmentPosition; } |
112 | 113 |
113 /** Will this effect emit custom vertex shader code? | 114 /** Will this effect emit custom vertex shader code? |
114 (To set this value the effect must inherit from GrEffect.) */ | 115 (To set this value the effect must inherit from GrEffect.) */ |
115 bool requiresVertexShader() const { return fRequiresVertexShader; } | 116 bool requiresVertexShader() const { return fRequiresVertexShader; } |
116 | 117 |
117 int numVertexAttribs() const { | 118 static const int kMaxVertexAttribs = 2; |
118 SkASSERT(0 == fVertexAttribTypes.count() || fRequiresVertexShader); | 119 typedef SkSTArray<kMaxVertexAttribs, GrShaderVar, true> VertexAttribArray; |
119 return fVertexAttribTypes.count(); | |
120 } | |
121 | 120 |
122 GrSLType vertexAttribType(int index) const { return fVertexAttribTypes[index
]; } | 121 const VertexAttribArray& getVertexAttribs() const { return fVertexAttribs; } |
123 | |
124 static const int kMaxVertexAttribs = 2; | |
125 | 122 |
126 void* operator new(size_t size); | 123 void* operator new(size_t size); |
127 void operator delete(void* target); | 124 void operator delete(void* target); |
128 | 125 |
129 void* operator new(size_t size, void* placement) { | 126 void* operator new(size_t size, void* placement) { |
130 return ::operator new(size, placement); | 127 return ::operator new(size, placement); |
131 } | 128 } |
132 void operator delete(void* target, void* placement) { | 129 void operator delete(void* target, void* placement) { |
133 ::operator delete(target, placement); | 130 ::operator delete(target, placement); |
134 } | 131 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 void setWillNotUseInputColor() { fWillUseInputColor = false; } | 183 void setWillNotUseInputColor() { fWillUseInputColor = false; } |
187 | 184 |
188 private: | 185 private: |
189 SkDEBUGCODE(void assertEquality(const GrEffect& other) const;) | 186 SkDEBUGCODE(void assertEquality(const GrEffect& other) const;) |
190 | 187 |
191 /** Subclass implements this to support isEqual(). It will only be called if
it is known that | 188 /** Subclass implements this to support isEqual(). It will only be called if
it is known that |
192 the two effects are of the same subclass (i.e. they return the same obje
ct from | 189 the two effects are of the same subclass (i.e. they return the same obje
ct from |
193 getFactory()).*/ | 190 getFactory()).*/ |
194 virtual bool onIsEqual(const GrEffect& other) const = 0; | 191 virtual bool onIsEqual(const GrEffect& other) const = 0; |
195 | 192 |
196 friend class GrVertexEffect; // to set fRequiresVertexShader and build fVert
exAttribTypes. | 193 friend class GrGeometryProcessor; // to set fRequiresVertexShader and build
fVertexAttribTypes. |
197 | 194 |
198 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; | 195 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; |
199 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; | 196 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; |
200 SkSTArray<kMaxVertexAttribs, GrSLType, true> fVertexAttribTypes; | 197 VertexAttribArray fVertexAttribs; |
201 bool fWillReadDstColor; | 198 bool fWillReadDstColor; |
202 bool fWillReadFragmentPosition; | 199 bool fWillReadFragmentPosition; |
203 bool fWillUseInputColor; | 200 bool fWillUseInputColor; |
204 bool fRequiresVertexShader; | 201 bool fRequiresVertexShader; |
205 | 202 |
206 typedef GrProgramElement INHERITED; | 203 typedef GrProgramElement INHERITED; |
207 }; | 204 }; |
208 | 205 |
209 /** | 206 /** |
210 * This creates an effect outside of the effect memory pool. The effect's destru
ctor will be called | 207 * This creates an effect outside of the effect memory pool. The effect's destru
ctor will be called |
211 * at global destruction time. NAME will be the name of the created GrEffect. | 208 * at global destruction time. NAME will be the name of the created GrEffect. |
212 */ | 209 */ |
213 #define GR_CREATE_STATIC_EFFECT(NAME, EFFECT_CLASS, ARGS)
\ | 210 #define GR_CREATE_STATIC_EFFECT(NAME, EFFECT_CLASS, ARGS)
\ |
214 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage;
\ | 211 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage;
\ |
215 static GrEffect* NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLAS
S, ARGS); \ | 212 static GrEffect* NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLAS
S, ARGS); \ |
216 static SkAutoTDestroy<GrEffect> NAME##_ad(NAME); | 213 static SkAutoTDestroy<GrEffect> NAME##_ad(NAME); |
217 | 214 |
218 #endif | 215 #endif |
OLD | NEW |