OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 GrDrawState_DEFINED | 8 #ifndef GrDrawState_DEFINED |
9 #define GrDrawState_DEFINED | 9 #define GrDrawState_DEFINED |
10 | 10 |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 /////////////////////////////////////////////////////////////////////////// | 202 /////////////////////////////////////////////////////////////////////////// |
203 /// @name Coverage | 203 /// @name Coverage |
204 //// | 204 //// |
205 | 205 |
206 /** | 206 /** |
207 * Sets a constant fractional coverage to be applied to the draw. The | 207 * Sets a constant fractional coverage to be applied to the draw. The |
208 * initial value (after construction or reset()) is 0xff. The constant | 208 * initial value (after construction or reset()) is 0xff. The constant |
209 * coverage is ignored when per-vertex coverage is provided. | 209 * coverage is ignored when per-vertex coverage is provided. |
210 */ | 210 */ |
211 void setCoverage(uint8_t coverage) { | 211 void setCoverage(uint8_t coverage) { |
212 fCoverage = GrColorPackRGBA(coverage, coverage, coverage, coverage); | 212 fCoverage = coverage; |
213 this->invalidateBlendOptFlags(); | 213 this->invalidateBlendOptFlags(); |
214 } | 214 } |
215 | 215 |
216 uint8_t getCoverage() const { return GrColorUnpackR(fCoverage); } | 216 uint8_t getCoverage() const { return fCoverage; } |
217 | 217 |
218 GrColor getCoverageColor() const { return fCoverage; } | 218 GrColor getCoverageColor() const { |
| 219 return GrColorPackRGBA(fCoverage, fCoverage, fCoverage, fCoverage); |
| 220 } |
219 | 221 |
220 /// @} | 222 /// @} |
221 | 223 |
222 /** | |
223 * This struct is here so that the GrDrawState can have multiple instances o
f state information. | |
224 * The use of this will come in a future revision when we want to keep track
of the original | |
225 * draw state as well as an optimized version of it. | |
226 */ | |
227 struct State { | |
228 State() { | |
229 this->reset(); | |
230 } | |
231 | |
232 State(const GrEffectStage* colorArray, int colorCount, | |
233 const GrEffectStage* coverageArray, int coverageCount) | |
234 : fColorStages(colorArray, colorCount), fCoverageStages(coverageArra
y, coverageCount) { | |
235 fSrcBlend = kOne_GrBlendCoeff; | |
236 fDstBlend = kZero_GrBlendCoeff; | |
237 } | |
238 | |
239 static bool HaveCompatibleState(const State& a, const State& b, bool exp
licitLocalCoords); | |
240 | |
241 void reset() { | |
242 fSrcBlend = kOne_GrBlendCoeff; | |
243 fDstBlend = kZero_GrBlendCoeff; | |
244 fColorStages.reset(); | |
245 fCoverageStages.reset(); | |
246 } | |
247 | |
248 GrBlendCoeff fSrcBlend; | |
249 GrBlendCoeff fDstBlend; | |
250 | |
251 typedef SkSTArray<4, GrEffectStage> EffectStageArray; | |
252 EffectStageArray fColorStages; | |
253 EffectStageArray fCoverageStages; | |
254 }; | |
255 | |
256 /////////////////////////////////////////////////////////////////////////// | 224 /////////////////////////////////////////////////////////////////////////// |
257 /// @name Effect Stages | 225 /// @name Effect Stages |
258 /// Each stage hosts a GrEffect. The effect produces an output color or cove
rage in the fragment | 226 /// Each stage hosts a GrEffect. The effect produces an output color or cove
rage in the fragment |
259 /// shader. Its inputs are the output from the previous stage as well as som
e variables | 227 /// shader. Its inputs are the output from the previous stage as well as som
e variables |
260 /// available to it in the fragment and vertex shader (e.g. the vertex posit
ion, the dst color, | 228 /// available to it in the fragment and vertex shader (e.g. the vertex posit
ion, the dst color, |
261 /// the fragment position, local coordinates). | 229 /// the fragment position, local coordinates). |
262 /// | 230 /// |
263 /// The stages are divided into two sets, color-computing and coverage-compu
ting. The final | 231 /// The stages are divided into two sets, color-computing and coverage-compu
ting. The final |
264 /// color stage produces the final pixel color. The coverage-computing stage
s function exactly | 232 /// color stage produces the final pixel color. The coverage-computing stage
s function exactly |
265 /// as the color-computing but the output of the final coverage stage is tre
ated as a fractional | 233 /// as the color-computing but the output of the final coverage stage is tre
ated as a fractional |
266 /// pixel coverage rather than as input to the src/dst color blend step. | 234 /// pixel coverage rather than as input to the src/dst color blend step. |
267 /// | 235 /// |
268 /// The input color to the first color-stage is either the constant color or
interpolated | 236 /// The input color to the first color-stage is either the constant color or
interpolated |
269 /// per-vertex colors. The input to the first coverage stage is either a con
stant coverage | 237 /// per-vertex colors. The input to the first coverage stage is either a con
stant coverage |
270 /// (usually full-coverage) or interpolated per-vertex coverage. | 238 /// (usually full-coverage) or interpolated per-vertex coverage. |
271 /// | 239 /// |
272 /// See the documentation of kCoverageDrawing_StateBit for information about
disabling the | 240 /// See the documentation of kCoverageDrawing_StateBit for information about
disabling the |
273 /// the color / coverage distinction. | 241 /// the color / coverage distinction. |
274 //// | 242 //// |
275 | 243 |
276 const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int a
ttr1 = -1) { | 244 const GrEffect* addColorEffect(const GrEffect* effect, int attr0 = -1, int a
ttr1 = -1) { |
277 SkASSERT(NULL != effect); | 245 SkASSERT(NULL != effect); |
278 SkNEW_APPEND_TO_TARRAY(&fState.fColorStages, GrEffectStage, (effect, att
r0, attr1)); | 246 SkNEW_APPEND_TO_TARRAY(&fColorStages, GrEffectStage, (effect, attr0, att
r1)); |
279 this->invalidateBlendOptFlags(); | 247 this->invalidateBlendOptFlags(); |
280 return effect; | 248 return effect; |
281 } | 249 } |
282 | 250 |
283 const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, in
t attr1 = -1) { | 251 const GrEffect* addCoverageEffect(const GrEffect* effect, int attr0 = -1, in
t attr1 = -1) { |
284 SkASSERT(NULL != effect); | 252 SkASSERT(NULL != effect); |
285 SkNEW_APPEND_TO_TARRAY(&fState.fCoverageStages, GrEffectStage, (effect,
attr0, attr1)); | 253 SkNEW_APPEND_TO_TARRAY(&fCoverageStages, GrEffectStage, (effect, attr0,
attr1)); |
286 this->invalidateBlendOptFlags(); | 254 this->invalidateBlendOptFlags(); |
287 return effect; | 255 return effect; |
288 } | 256 } |
289 | 257 |
290 /** | 258 /** |
291 * Creates a GrSimpleTextureEffect that uses local coords as texture coordin
ates. | 259 * Creates a GrSimpleTextureEffect that uses local coords as texture coordin
ates. |
292 */ | 260 */ |
293 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) { | 261 void addColorTextureEffect(GrTexture* texture, const SkMatrix& matrix) { |
294 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->un
ref(); | 262 this->addColorEffect(GrSimpleTextureEffect::Create(texture, matrix))->un
ref(); |
295 } | 263 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 void set(GrDrawState* ds); | 295 void set(GrDrawState* ds); |
328 | 296 |
329 bool isSet() const { return NULL != fDrawState; } | 297 bool isSet() const { return NULL != fDrawState; } |
330 | 298 |
331 private: | 299 private: |
332 GrDrawState* fDrawState; | 300 GrDrawState* fDrawState; |
333 int fColorEffectCnt; | 301 int fColorEffectCnt; |
334 int fCoverageEffectCnt; | 302 int fCoverageEffectCnt; |
335 }; | 303 }; |
336 | 304 |
337 int numColorStages() const { return fState.fColorStages.count(); } | 305 int numColorStages() const { return fColorStages.count(); } |
338 int numCoverageStages() const { return fState.fCoverageStages.count(); } | 306 int numCoverageStages() const { return fCoverageStages.count(); } |
339 int numTotalStages() const { return this->numColorStages() + this->numCovera
geStages(); } | 307 int numTotalStages() const { return this->numColorStages() + this->numCovera
geStages(); } |
340 | 308 |
341 const GrEffectStage& getColorStage(int stageIdx) const { return fState.fColo
rStages[stageIdx]; } | 309 const GrEffectStage& getColorStage(int stageIdx) const { return fColorStages
[stageIdx]; } |
342 const GrEffectStage& getCoverageStage(int stageIdx) const { return fState.fC
overageStages[stageIdx]; } | 310 const GrEffectStage& getCoverageStage(int stageIdx) const { return fCoverage
Stages[stageIdx]; } |
343 | 311 |
344 /** | 312 /** |
345 * Checks whether any of the effects will read the dst pixel color. | 313 * Checks whether any of the effects will read the dst pixel color. |
346 */ | 314 */ |
347 bool willEffectReadDstColor() const; | 315 bool willEffectReadDstColor() const; |
348 | 316 |
349 /// @} | 317 /// @} |
350 | 318 |
351 /////////////////////////////////////////////////////////////////////////// | 319 /////////////////////////////////////////////////////////////////////////// |
352 /// @name Blending | 320 /// @name Blending |
353 //// | 321 //// |
354 | 322 |
355 /** | 323 /** |
356 * Sets the blending function coefficients. | 324 * Sets the blending function coefficients. |
357 * | 325 * |
358 * The blend function will be: | 326 * The blend function will be: |
359 * D' = sat(S*srcCoef + D*dstCoef) | 327 * D' = sat(S*srcCoef + D*dstCoef) |
360 * | 328 * |
361 * where D is the existing destination color, S is the incoming source | 329 * where D is the existing destination color, S is the incoming source |
362 * color, and D' is the new destination color that will be written. sat() | 330 * color, and D' is the new destination color that will be written. sat() |
363 * is the saturation function. | 331 * is the saturation function. |
364 * | 332 * |
365 * @param srcCoef coefficient applied to the src color. | 333 * @param srcCoef coefficient applied to the src color. |
366 * @param dstCoef coefficient applied to the dst color. | 334 * @param dstCoef coefficient applied to the dst color. |
367 */ | 335 */ |
368 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { | 336 void setBlendFunc(GrBlendCoeff srcCoeff, GrBlendCoeff dstCoeff) { |
369 fState.fSrcBlend = srcCoeff; | 337 fSrcBlend = srcCoeff; |
370 fState.fDstBlend = dstCoeff; | 338 fDstBlend = dstCoeff; |
371 this->invalidateBlendOptFlags(); | 339 this->invalidateBlendOptFlags(); |
372 #ifdef SK_DEBUG | 340 #ifdef SK_DEBUG |
373 if (GrBlendCoeffRefsDst(dstCoeff)) { | 341 if (GrBlendCoeffRefsDst(dstCoeff)) { |
374 GrPrintf("Unexpected dst blend coeff. Won't work correctly with cove
rage stages.\n"); | 342 GrPrintf("Unexpected dst blend coeff. Won't work correctly with cove
rage stages.\n"); |
375 } | 343 } |
376 if (GrBlendCoeffRefsSrc(srcCoeff)) { | 344 if (GrBlendCoeffRefsSrc(srcCoeff)) { |
377 GrPrintf("Unexpected src blend coeff. Won't work correctly with cove
rage stages.\n"); | 345 GrPrintf("Unexpected src blend coeff. Won't work correctly with cove
rage stages.\n"); |
378 } | 346 } |
379 #endif | 347 #endif |
380 } | 348 } |
381 | 349 |
382 GrBlendCoeff getSrcBlendCoeff() const { return fState.fSrcBlend; } | 350 GrBlendCoeff getSrcBlendCoeff() const { return fSrcBlend; } |
383 GrBlendCoeff getDstBlendCoeff() const { return fState.fDstBlend; } | 351 GrBlendCoeff getDstBlendCoeff() const { return fDstBlend; } |
384 | 352 |
385 void getDstBlendCoeff(GrBlendCoeff* srcBlendCoeff, | 353 void getDstBlendCoeff(GrBlendCoeff* srcBlendCoeff, |
386 GrBlendCoeff* dstBlendCoeff) const { | 354 GrBlendCoeff* dstBlendCoeff) const { |
387 *srcBlendCoeff = fState.fSrcBlend; | 355 *srcBlendCoeff = fSrcBlend; |
388 *dstBlendCoeff = fState.fDstBlend; | 356 *dstBlendCoeff = fDstBlend; |
389 } | 357 } |
390 | 358 |
391 /** | 359 /** |
392 * Sets the blending function constant referenced by the following blending | 360 * Sets the blending function constant referenced by the following blending |
393 * coefficients: | 361 * coefficients: |
394 * kConstC_GrBlendCoeff | 362 * kConstC_GrBlendCoeff |
395 * kIConstC_GrBlendCoeff | 363 * kIConstC_GrBlendCoeff |
396 * kConstA_GrBlendCoeff | 364 * kConstA_GrBlendCoeff |
397 * kIConstA_GrBlendCoeff | 365 * kIConstA_GrBlendCoeff |
398 * | 366 * |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 void onReset(const SkMatrix* initialViewMatrix); | 770 void onReset(const SkMatrix* initialViewMatrix); |
803 | 771 |
804 BlendOptFlags calcBlendOpts(bool forceCoverage = false, | 772 BlendOptFlags calcBlendOpts(bool forceCoverage = false, |
805 GrBlendCoeff* srcCoeff = NULL, | 773 GrBlendCoeff* srcCoeff = NULL, |
806 GrBlendCoeff* dstCoeff = NULL) const; | 774 GrBlendCoeff* dstCoeff = NULL) const; |
807 | 775 |
808 // These fields are roughly sorted by decreasing likelihood of being differe
nt in op== | 776 // These fields are roughly sorted by decreasing likelihood of being differe
nt in op== |
809 SkAutoTUnref<GrRenderTarget> fRenderTarget; | 777 SkAutoTUnref<GrRenderTarget> fRenderTarget; |
810 GrColor fColor; | 778 GrColor fColor; |
811 SkMatrix fViewMatrix; | 779 SkMatrix fViewMatrix; |
| 780 GrBlendCoeff fSrcBlend; |
| 781 GrBlendCoeff fDstBlend; |
812 GrColor fBlendConstant; | 782 GrColor fBlendConstant; |
813 uint32_t fFlagBits; | 783 uint32_t fFlagBits; |
814 const GrVertexAttrib* fVAPtr; | 784 const GrVertexAttrib* fVAPtr; |
815 int fVACount; | 785 int fVACount; |
816 GrStencilSettings fStencilSettings; | 786 GrStencilSettings fStencilSettings; |
817 GrColor fCoverage; | 787 uint8_t fCoverage; |
818 DrawFace fDrawFace; | 788 DrawFace fDrawFace; |
819 | 789 |
820 State fState; | 790 typedef SkSTArray<4, GrEffectStage> EffectStageArray; |
| 791 EffectStageArray fColorStages; |
| 792 EffectStageArray fCoverageStages; |
821 | 793 |
822 uint32_t fHints; | 794 uint32_t fHints; |
823 | 795 |
824 mutable GrBlendCoeff fOptSrcBlend; | 796 mutable GrBlendCoeff fOptSrcBlend; |
825 mutable GrBlendCoeff fOptDstBlend; | 797 mutable GrBlendCoeff fOptDstBlend; |
826 mutable BlendOptFlags fBlendOptFlags; | 798 mutable BlendOptFlags fBlendOptFlags; |
827 | 799 |
828 // This is simply a different representation of info in fVertexAttribs and t
hus does | 800 // This is simply a different representation of info in fVertexAttribs and t
hus does |
829 // not need to be compared in op==. | 801 // not need to be compared in op==. |
830 int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt
]; | 802 int fFixedFunctionVertexAttribIndices[kGrFixedFunctionVertexAttribBindingCnt
]; |
831 | 803 |
832 // Some of the auto restore objects assume that no effects are removed durin
g their lifetime. | 804 // Some of the auto restore objects assume that no effects are removed durin
g their lifetime. |
833 // This is used to assert that this condition holds. | 805 // This is used to assert that this condition holds. |
834 SkDEBUGCODE(int fBlockEffectRemovalCnt;) | 806 SkDEBUGCODE(int fBlockEffectRemovalCnt;) |
835 | 807 |
836 /** | 808 /** |
837 * Sets vertex attributes for next draw. | 809 * Sets vertex attributes for next draw. |
838 * | 810 * |
839 * @param attribs the array of vertex attributes to set. | 811 * @param attribs the array of vertex attributes to set. |
840 * @param count the number of attributes being set, limited to kMaxVer
texAttribCnt. | 812 * @param count the number of attributes being set, limited to kMaxVer
texAttribCnt. |
841 */ | 813 */ |
842 void setVertexAttribs(const GrVertexAttrib attribs[], int count); | 814 void setVertexAttribs(const GrVertexAttrib attribs[], int count); |
843 | 815 |
844 typedef SkRefCnt INHERITED; | 816 typedef SkRefCnt INHERITED; |
845 }; | 817 }; |
846 | 818 |
847 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); | 819 GR_MAKE_BITFIELD_OPS(GrDrawState::BlendOptFlags); |
848 | 820 |
849 #endif | 821 #endif |
OLD | NEW |