| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 GrXferProcessor_DEFINED | 8 #ifndef GrXferProcessor_DEFINED |
| 9 #define GrXferProcessor_DEFINED | 9 #define GrXferProcessor_DEFINED |
| 10 | 10 |
| 11 #include "GrBlend.h" | 11 #include "GrBlend.h" |
| 12 #include "GrColor.h" | 12 #include "GrColor.h" |
| 13 #include "GrProcessor.h" | 13 #include "GrProcessor.h" |
| 14 #include "GrTexture.h" | 14 #include "GrTexture.h" |
| 15 #include "GrTypes.h" | 15 #include "GrTypes.h" |
| 16 #include "SkXfermode.h" | 16 #include "SkXfermode.h" |
| 17 | 17 |
| 18 class GrShaderCaps; | 18 class GrShaderCaps; |
| 19 class GrGLSLCaps; | 19 class GrGLSLCaps; |
| 20 class GrGLSLXferProcessor; | 20 class GrGLSLXferProcessor; |
| 21 class GrProcOptInfo; | 21 class GrProcOptInfo; |
| 22 struct GrPipelineOptimizations; |
| 22 | 23 |
| 23 /** | 24 /** |
| 24 * Barriers for blending. When a shader reads the dst directly, an Xfer barrier
is sometimes | 25 * Barriers for blending. When a shader reads the dst directly, an Xfer barrier
is sometimes |
| 25 * required after a pixel has been written, before it can be safely read again. | 26 * required after a pixel has been written, before it can be safely read again. |
| 26 */ | 27 */ |
| 27 enum GrXferBarrierType { | 28 enum GrXferBarrierType { |
| 28 kNone_GrXferBarrierType = 0, //<! No barrier is required | 29 kNone_GrXferBarrierType = 0, //<! No barrier is required |
| 29 kTexture_GrXferBarrierType, //<! Required when a shader reads and renders t
o the same texture. | 30 kTexture_GrXferBarrierType, //<! Required when a shader reads and renders t
o the same texture. |
| 30 kBlend_GrXferBarrierType, //<! Required by certain blend extensions. | 31 kBlend_GrXferBarrierType, //<! Required by certain blend extensions. |
| 31 }; | 32 }; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 | 135 |
| 135 /** | 136 /** |
| 136 * Determines which optimizations (as described by the ptFlags above) can be
performed by | 137 * Determines which optimizations (as described by the ptFlags above) can be
performed by |
| 137 * the draw with this xfer processor. If this function is called, the xfer p
rocessor may change | 138 * the draw with this xfer processor. If this function is called, the xfer p
rocessor may change |
| 138 * its state to reflected the given blend optimizations. If the XP needs to
see a specific input | 139 * its state to reflected the given blend optimizations. If the XP needs to
see a specific input |
| 139 * color to blend correctly, it will set the OverrideColor flag and the outp
ut parameter | 140 * color to blend correctly, it will set the OverrideColor flag and the outp
ut parameter |
| 140 * overrideColor will be the required value that should be passed into the X
P. | 141 * overrideColor will be the required value that should be passed into the X
P. |
| 141 * A caller who calls this function on a XP is required to honor the returne
d OptFlags | 142 * A caller who calls this function on a XP is required to honor the returne
d OptFlags |
| 142 * and color values for its draw. | 143 * and color values for its draw. |
| 143 */ | 144 */ |
| 144 OptFlags getOptimizations(const GrProcOptInfo& colorPOI, | 145 OptFlags getOptimizations(const GrPipelineOptimizations& optimizations, |
| 145 const GrProcOptInfo& coveragePOI, | |
| 146 bool doesStencilWrite, | 146 bool doesStencilWrite, |
| 147 GrColor* overrideColor, | 147 GrColor* overrideColor, |
| 148 const GrCaps& caps); | 148 const GrCaps& caps); |
| 149 | 149 |
| 150 /** | 150 /** |
| 151 * Returns whether this XP will require an Xfer barrier on the given rt. If
true, outBarrierType | 151 * Returns whether this XP will require an Xfer barrier on the given rt. If
true, outBarrierType |
| 152 * is updated to contain the type of barrier needed. | 152 * is updated to contain the type of barrier needed. |
| 153 */ | 153 */ |
| 154 GrXferBarrierType xferBarrierType(const GrRenderTarget* rt, const GrCaps& ca
ps) const; | 154 GrXferBarrierType xferBarrierType(const GrRenderTarget* rt, const GrCaps& ca
ps) const; |
| 155 | 155 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 return this->onIsEqual(that); | 239 return this->onIsEqual(that); |
| 240 } | 240 } |
| 241 | 241 |
| 242 protected: | 242 protected: |
| 243 GrXferProcessor(); | 243 GrXferProcessor(); |
| 244 GrXferProcessor(const DstTexture*, bool willReadDstColor, bool hasMixedSampl
es); | 244 GrXferProcessor(const DstTexture*, bool willReadDstColor, bool hasMixedSampl
es); |
| 245 | 245 |
| 246 private: | 246 private: |
| 247 void notifyRefCntIsZero() const final {} | 247 void notifyRefCntIsZero() const final {} |
| 248 | 248 |
| 249 virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, | 249 virtual OptFlags onGetOptimizations(const GrPipelineOptimizations& optimizat
ions, |
| 250 const GrProcOptInfo& coveragePOI, | |
| 251 bool doesStencilWrite, | 250 bool doesStencilWrite, |
| 252 GrColor* overrideColor, | 251 GrColor* overrideColor, |
| 253 const GrCaps& caps) = 0; | 252 const GrCaps& caps) = 0; |
| 254 | 253 |
| 255 /** | 254 /** |
| 256 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate
d with this xfer | 255 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate
d with this xfer |
| 257 * processor's GL backend implementation. | 256 * processor's GL backend implementation. |
| 258 */ | 257 */ |
| 259 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 258 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
| 260 GrProcessorKeyBuilder* b) const = 0; | 259 GrProcessorKeyBuilder* b) const = 0; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 * draw information to create a GrXferProcessor (XP) which can implement the des
ired blending for | 303 * draw information to create a GrXferProcessor (XP) which can implement the des
ired blending for |
| 305 * the draw. | 304 * the draw. |
| 306 * | 305 * |
| 307 * Before the XP is created, the XPF is able to answer queries about what functi
onality the XPs it | 306 * Before the XP is created, the XPF is able to answer queries about what functi
onality the XPs it |
| 308 * creates will have. For example, can it create an XP that supports RGB coverag
e or will the XP | 307 * creates will have. For example, can it create an XP that supports RGB coverag
e or will the XP |
| 309 * blend with the destination color. | 308 * blend with the destination color. |
| 310 */ | 309 */ |
| 311 class GrXPFactory : public SkRefCnt { | 310 class GrXPFactory : public SkRefCnt { |
| 312 public: | 311 public: |
| 313 typedef GrXferProcessor::DstTexture DstTexture; | 312 typedef GrXferProcessor::DstTexture DstTexture; |
| 314 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, | 313 GrXferProcessor* createXferProcessor(const GrPipelineOptimizations& optimiza
tions, |
| 315 const GrProcOptInfo& coveragePOI, | |
| 316 bool hasMixedSamples, | 314 bool hasMixedSamples, |
| 317 const DstTexture*, | 315 const DstTexture*, |
| 318 const GrCaps& caps) const; | 316 const GrCaps& caps) const; |
| 319 /** | 317 /** |
| 320 * Known color information after blending, but before accounting for any cov
erage. | 318 * Known color information after blending, but before accounting for any cov
erage. |
| 321 */ | 319 */ |
| 322 struct InvariantBlendedColor { | 320 struct InvariantBlendedColor { |
| 323 bool fWillBlendWithDst; | 321 bool fWillBlendWithDst; |
| 324 GrColor fKnownColor; | 322 GrColor fKnownColor; |
| 325 GrColorComponentFlags fKnownColorFlags; | 323 GrColorComponentFlags fKnownColorFlags; |
| 326 }; | 324 }; |
| 327 | 325 |
| 328 /** | 326 /** |
| 329 * Returns information about the output color, produced by XPs from this fac
tory, that will be | 327 * Returns information about the output color, produced by XPs from this fac
tory, that will be |
| 330 * known after blending. Note that we can conflate coverage and color, so th
e actual values | 328 * known after blending. Note that we can conflate coverage and color, so th
e actual values |
| 331 * written to pixels with partial coverage may not always seem consistent wi
th the invariant | 329 * written to pixels with partial coverage may not always seem consistent wi
th the invariant |
| 332 * information returned by this function. | 330 * information returned by this function. |
| 333 */ | 331 */ |
| 334 virtual void getInvariantBlendedColor(const GrProcOptInfo& colorPOI, | 332 virtual void getInvariantBlendedColor(const GrProcOptInfo& colorPOI, |
| 335 InvariantBlendedColor*) const = 0; | 333 InvariantBlendedColor*) const = 0; |
| 336 | 334 |
| 337 bool willNeedDstTexture(const GrCaps& caps, const GrProcOptInfo& colorPOI, | 335 bool willNeedDstTexture(const GrCaps& caps, const GrPipelineOptimizations& o
ptimizations, |
| 338 const GrProcOptInfo& coveragePOI, bool hasMixedSampl
es) const; | 336 bool hasMixedSamples) const; |
| 339 | 337 |
| 340 bool isEqual(const GrXPFactory& that) const { | 338 bool isEqual(const GrXPFactory& that) const { |
| 341 if (this->classID() != that.classID()) { | 339 if (this->classID() != that.classID()) { |
| 342 return false; | 340 return false; |
| 343 } | 341 } |
| 344 return this->onIsEqual(that); | 342 return this->onIsEqual(that); |
| 345 } | 343 } |
| 346 | 344 |
| 347 /** | 345 /** |
| 348 * Helper for down-casting to a GrXPFactory subclass | 346 * Helper for down-casting to a GrXPFactory subclass |
| 349 */ | 347 */ |
| 350 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } | 348 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } |
| 351 | 349 |
| 352 uint32_t classID() const { SkASSERT(kIllegalXPFClassID != fClassID); return
fClassID; } | 350 uint32_t classID() const { SkASSERT(kIllegalXPFClassID != fClassID); return
fClassID; } |
| 353 | 351 |
| 354 protected: | 352 protected: |
| 355 GrXPFactory() : fClassID(kIllegalXPFClassID) {} | 353 GrXPFactory() : fClassID(kIllegalXPFClassID) {} |
| 356 | 354 |
| 357 template <typename XPF_SUBCLASS> void initClassID() { | 355 template <typename XPF_SUBCLASS> void initClassID() { |
| 358 static uint32_t kClassID = GenClassID(); | 356 static uint32_t kClassID = GenClassID(); |
| 359 fClassID = kClassID; | 357 fClassID = kClassID; |
| 360 } | 358 } |
| 361 | 359 |
| 362 uint32_t fClassID; | 360 uint32_t fClassID; |
| 363 | 361 |
| 364 private: | 362 private: |
| 365 virtual GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, | 363 virtual GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, |
| 366 const GrProcOptInfo& colorPOI
, | 364 const GrPipelineOptimizations
& optimizations, |
| 367 const GrProcOptInfo& coverage
POI, | |
| 368 bool hasMixedSamples, | 365 bool hasMixedSamples, |
| 369 const DstTexture*) const = 0; | 366 const DstTexture*) const = 0; |
| 370 /** | 367 /** |
| 371 * Returns true if the XP generated by this factory will explicitly read ds
t in the fragment | 368 * Returns true if the XP generated by this factory will explicitly read ds
t in the fragment |
| 372 * shader. | 369 * shader. |
| 373 */ | 370 */ |
| 374 virtual bool willReadDstColor(const GrCaps& caps, | 371 virtual bool willReadDstColor(const GrCaps& caps, |
| 375 const GrProcOptInfo& colorPOI, | 372 const GrPipelineOptimizations& optimizations, |
| 376 const GrProcOptInfo& coveragePOI, | |
| 377 bool hasMixedSamples) const = 0; | 373 bool hasMixedSamples) const = 0; |
| 378 | 374 |
| 379 virtual bool onIsEqual(const GrXPFactory&) const = 0; | 375 virtual bool onIsEqual(const GrXPFactory&) const = 0; |
| 380 | 376 |
| 381 static uint32_t GenClassID() { | 377 static uint32_t GenClassID() { |
| 382 // fCurrXPFactoryID has been initialized to kIllegalXPFactoryID. The | 378 // fCurrXPFactoryID has been initialized to kIllegalXPFactoryID. The |
| 383 // atomic inc returns the old value not the incremented value. So we add | 379 // atomic inc returns the old value not the incremented value. So we add |
| 384 // 1 to the returned value. | 380 // 1 to the returned value. |
| 385 uint32_t id = static_cast<uint32_t>(sk_atomic_inc(&gCurrXPFClassID)) + 1
; | 381 uint32_t id = static_cast<uint32_t>(sk_atomic_inc(&gCurrXPFClassID)) + 1
; |
| 386 if (!id) { | 382 if (!id) { |
| 387 SkFAIL("This should never wrap as it should only be called once for
each GrXPFactory " | 383 SkFAIL("This should never wrap as it should only be called once for
each GrXPFactory " |
| 388 "subclass."); | 384 "subclass."); |
| 389 } | 385 } |
| 390 return id; | 386 return id; |
| 391 } | 387 } |
| 392 | 388 |
| 393 enum { | 389 enum { |
| 394 kIllegalXPFClassID = 0, | 390 kIllegalXPFClassID = 0, |
| 395 }; | 391 }; |
| 396 static int32_t gCurrXPFClassID; | 392 static int32_t gCurrXPFClassID; |
| 397 | 393 |
| 398 typedef GrProgramElement INHERITED; | 394 typedef GrProgramElement INHERITED; |
| 399 }; | 395 }; |
| 400 | 396 |
| 401 #endif | 397 #endif |
| 402 | 398 |
| OLD | NEW |