| 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 GrProcessor_DEFINED | 8 #ifndef GrProcessor_DEFINED |
| 9 #define GrProcessor_DEFINED | 9 #define GrProcessor_DEFINED |
| 10 | 10 |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 this->assertEquality(other); | 117 this->assertEquality(other); |
| 118 } | 118 } |
| 119 #endif | 119 #endif |
| 120 return result; | 120 return result; |
| 121 } | 121 } |
| 122 | 122 |
| 123 /** Human-meaningful string to identify this effect; may be embedded | 123 /** Human-meaningful string to identify this effect; may be embedded |
| 124 in generated shader code. */ | 124 in generated shader code. */ |
| 125 const char* name() const; | 125 const char* name() const; |
| 126 | 126 |
| 127 int numTransforms() const { return fCoordTransforms.count(); } | |
| 128 | |
| 129 /** Returns the coordinate transformation at index. index must be valid acco
rding to | |
| 130 numTransforms(). */ | |
| 131 const GrCoordTransform& coordTransform(int index) const { return *fCoordTran
sforms[index]; } | |
| 132 | |
| 133 int numTextures() const { return fTextureAccesses.count(); } | 127 int numTextures() const { return fTextureAccesses.count(); } |
| 134 | 128 |
| 135 /** Returns the access pattern for the texture at index. index must be valid
according to | 129 /** Returns the access pattern for the texture at index. index must be valid
according to |
| 136 numTextures(). */ | 130 numTextures(). */ |
| 137 const GrTextureAccess& textureAccess(int index) const { return *fTextureAcce
sses[index]; } | 131 const GrTextureAccess& textureAccess(int index) const { return *fTextureAcce
sses[index]; } |
| 138 | 132 |
| 139 /** Shortcut for textureAccess(index).texture(); */ | 133 /** Shortcut for textureAccess(index).texture(); */ |
| 140 GrTexture* texture(int index) const { return this->textureAccess(index).getT
exture(); } | 134 GrTexture* texture(int index) const { return this->textureAccess(index).getT
exture(); } |
| 141 | 135 |
| 142 /** Will this effect read the fragment position? */ | 136 /** Will this effect read the fragment position? */ |
| 143 bool willReadFragmentPosition() const { return fWillReadFragmentPosition; } | 137 bool willReadFragmentPosition() const { return fWillReadFragmentPosition; } |
| 144 | 138 |
| 145 void* operator new(size_t size); | 139 void* operator new(size_t size); |
| 146 void operator delete(void* target); | 140 void operator delete(void* target); |
| 147 | 141 |
| 148 void* operator new(size_t size, void* placement) { | 142 void* operator new(size_t size, void* placement) { |
| 149 return ::operator new(size, placement); | 143 return ::operator new(size, placement); |
| 150 } | 144 } |
| 151 void operator delete(void* target, void* placement) { | 145 void operator delete(void* target, void* placement) { |
| 152 ::operator delete(target, placement); | 146 ::operator delete(target, placement); |
| 153 } | 147 } |
| 154 | 148 |
| 155 /** | 149 /** |
| 156 * Helper for down-casting to a GrProcessor subclass | 150 * Helper for down-casting to a GrProcessor subclass |
| 157 */ | 151 */ |
| 158 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } | 152 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } |
| 159 | 153 |
| 160 protected: | 154 protected: |
| 161 /** | 155 /** |
| 162 * Subclasses call this from their constructor to register coordinate transf
ormations. The | |
| 163 * effect subclass manages the lifetime of the transformations (this functio
n only stores a | |
| 164 * pointer). The GrCoordTransform is typically a member field of the GrProce
ssor subclass. When | |
| 165 * the matrix has perspective, the transformed coordinates will have 3 compo
nents. Otherwise | |
| 166 * they'll have 2. This must only be called from the constructor because GrP
rocessors are | |
| 167 * immutable. | |
| 168 */ | |
| 169 void addCoordTransform(const GrCoordTransform* coordTransform); | |
| 170 | |
| 171 /** | |
| 172 * Subclasses call this from their constructor to register GrTextureAccesses
. The effect | 156 * Subclasses call this from their constructor to register GrTextureAccesses
. The effect |
| 173 * subclass manages the lifetime of the accesses (this function only stores
a pointer). The | 157 * subclass manages the lifetime of the accesses (this function only stores
a pointer). The |
| 174 * GrTextureAccess is typically a member field of the GrProcessor subclass.
This must only be | 158 * GrTextureAccess is typically a member field of the GrProcessor subclass.
This must only be |
| 175 * called from the constructor because GrProcessors are immutable. | 159 * called from the constructor because GrProcessors are immutable. |
| 176 */ | 160 */ |
| 177 void addTextureAccess(const GrTextureAccess* textureAccess); | 161 void addTextureAccess(const GrTextureAccess* textureAccess); |
| 178 | 162 |
| 179 GrProcessor() | 163 GrProcessor() |
| 180 : fWillReadFragmentPosition(false) {} | 164 : fWillReadFragmentPosition(false) {} |
| 181 | 165 |
| 182 /** | 166 /** |
| 183 * If the effect will generate a backend-specific effect that will read the
fragment position | 167 * If the effect will generate a backend-specific effect that will read the
fragment position |
| 184 * in the FS then it must call this method from its constructor. Otherwise,
the request to | 168 * in the FS then it must call this method from its constructor. Otherwise,
the request to |
| 185 * access the fragment position will be denied. | 169 * access the fragment position will be denied. |
| 186 */ | 170 */ |
| 187 void setWillReadFragmentPosition() { fWillReadFragmentPosition = true; } | 171 void setWillReadFragmentPosition() { fWillReadFragmentPosition = true; } |
| 188 | 172 |
| 189 private: | 173 private: |
| 190 SkDEBUGCODE(void assertEquality(const GrProcessor& other) const;) | 174 SkDEBUGCODE(void assertEquality(const GrProcessor& other) const;) |
| 191 | 175 |
| 192 /** Subclass implements this to support isEqual(). It will only be called if
it is known that | 176 /** Subclass implements this to support isEqual(). It will only be called if
it is known that |
| 193 the two effects are of the same subclass (i.e. they return the same obje
ct from | 177 the two effects are of the same subclass (i.e. they return the same obje
ct from |
| 194 getFactory()).*/ | 178 getFactory()).*/ |
| 195 virtual bool onIsEqual(const GrProcessor& other) const = 0; | 179 virtual bool onIsEqual(const GrProcessor& other) const = 0; |
| 196 | 180 |
| 197 /** | 181 /** |
| 198 * Subclass implements this to support getConstantColorComponents(...). | 182 * Subclass implements this to support getConstantColorComponents(...). |
| 199 */ | 183 */ |
| 200 virtual void onComputeInvariantOutput(InvariantOutput* inout) const = 0; | 184 virtual void onComputeInvariantOutput(InvariantOutput* inout) const = 0; |
| 201 friend class GrGeometryProcessor; // to set fRequiresVertexShader and build
fVertexAttribTypes. | |
| 202 | 185 |
| 203 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; | |
| 204 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; | 186 SkSTArray<4, const GrTextureAccess*, true> fTextureAccesses; |
| 205 bool fWillReadFragmentPosition; | 187 bool fWillReadFragmentPosition; |
| 206 | 188 |
| 207 typedef GrProgramElement INHERITED; | 189 typedef GrProgramElement INHERITED; |
| 208 }; | 190 }; |
| 209 | 191 |
| 210 class GrFragmentProcessor : public GrProcessor { | 192 class GrFragmentProcessor : public GrProcessor { |
| 211 public: | 193 public: |
| 212 GrFragmentProcessor() | 194 GrFragmentProcessor() |
| 213 : INHERITED() | 195 : INHERITED() |
| 214 , fWillReadDstColor(false) | 196 , fWillReadDstColor(false) |
| 215 , fWillUseInputColor(true) {} | 197 , fWillUseInputColor(true) {} |
| 216 | 198 |
| 217 virtual const GrBackendFragmentProcessorFactory& getFactory() const = 0; | 199 virtual const GrBackendFragmentProcessorFactory& getFactory() const = 0; |
| 218 | 200 |
| 201 int numTransforms() const { return fCoordTransforms.count(); } |
| 202 |
| 203 /** Returns the coordinate transformation at index. index must be valid acco
rding to |
| 204 numTransforms(). */ |
| 205 const GrCoordTransform& coordTransform(int index) const { return *fCoordTran
sforms[index]; } |
| 206 |
| 219 /** Will this effect read the destination pixel value? */ | 207 /** Will this effect read the destination pixel value? */ |
| 220 bool willReadDstColor() const { return fWillReadDstColor; } | 208 bool willReadDstColor() const { return fWillReadDstColor; } |
| 221 | 209 |
| 222 /** Will this effect read the source color value? */ | 210 /** Will this effect read the source color value? */ |
| 223 bool willUseInputColor() const { return fWillUseInputColor; } | 211 bool willUseInputColor() const { return fWillUseInputColor; } |
| 224 | 212 |
| 225 protected: | 213 protected: |
| 226 /** | 214 /** |
| 215 * Fragment Processor subclasses call this from their constructor to registe
r coordinate |
| 216 * transformations. The processor subclass manages the lifetime of the trans
formations (this |
| 217 * function only stores a pointer). The GrCoordTransform is typically a memb
er field of the |
| 218 * GrProcessor subclass. When the matrix has perspective, the transformed co
ordinates will have |
| 219 * 3 components. Otherwise they'll have 2. This must only be called from the
constructor because |
| 220 * GrProcessors are immutable. |
| 221 */ |
| 222 void addCoordTransform(const GrCoordTransform*); |
| 223 |
| 224 /** |
| 227 * If the effect subclass will read the destination pixel value then it must
call this function | 225 * If the effect subclass will read the destination pixel value then it must
call this function |
| 228 * from its constructor. Otherwise, when its generated backend-specific effe
ct class attempts | 226 * from its constructor. Otherwise, when its generated backend-specific effe
ct class attempts |
| 229 * to generate code that reads the destination pixel it will fail. | 227 * to generate code that reads the destination pixel it will fail. |
| 230 */ | 228 */ |
| 231 void setWillReadDstColor() { fWillReadDstColor = true; } | 229 void setWillReadDstColor() { fWillReadDstColor = true; } |
| 232 | 230 |
| 233 /** | 231 /** |
| 234 * If the effect will generate a result that does not depend on the input co
lor value then it | 232 * If the effect will generate a result that does not depend on the input co
lor value then it |
| 235 * must call this function from its constructor. Otherwise, when its generat
ed backend-specific | 233 * must call this function from its constructor. Otherwise, when its generat
ed backend-specific |
| 236 * code might fail during variable binding due to unused variables. | 234 * code might fail during variable binding due to unused variables. |
| 237 */ | 235 */ |
| 238 void setWillNotUseInputColor() { fWillUseInputColor = false; } | 236 void setWillNotUseInputColor() { fWillUseInputColor = false; } |
| 239 | 237 |
| 240 private: | 238 private: |
| 239 SkSTArray<4, const GrCoordTransform*, true> fCoordTransforms; |
| 241 bool fWillReadDstColor; | 240 bool fWillReadDstColor; |
| 242 bool fWillUseInputColor; | 241 bool fWillUseInputColor; |
| 243 | 242 |
| 244 typedef GrProcessor INHERITED; | 243 typedef GrProcessor INHERITED; |
| 245 }; | 244 }; |
| 246 | 245 |
| 247 /** | 246 /** |
| 248 * This creates an effect outside of the effect memory pool. The effect's destru
ctor will be called | 247 * This creates an effect outside of the effect memory pool. The effect's destru
ctor will be called |
| 249 * at global destruction time. NAME will be the name of the created GrProcessor. | 248 * at global destruction time. NAME will be the name of the created GrProcessor. |
| 250 */ | 249 */ |
| 251 #define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS)
\ | 250 #define GR_CREATE_STATIC_FRAGMENT_PROCESSOR(NAME, EFFECT_CLASS, ARGS)
\ |
| 252 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage;
\ | 251 static SkAlignedSStorage<sizeof(EFFECT_CLASS)> g_##NAME##_Storage;
\ |
| 253 static GrFragmentProcessor*
\ | 252 static GrFragmentProcessor*
\ |
| 254 NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS);
\ | 253 NAME SkNEW_PLACEMENT_ARGS(g_##NAME##_Storage.get(), EFFECT_CLASS, ARGS);
\ |
| 255 static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME); | 254 static SkAutoTDestroy<GrFragmentProcessor> NAME##_ad(NAME); |
| 256 | 255 |
| 257 #endif | 256 #endif |
| OLD | NEW |