| 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 |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 * its state to reflected the given blend optimizations. If the XP needs to
see a specific input | 160 * its state to reflected the given blend optimizations. If the XP needs to
see a specific input |
| 161 * color to blend correctly, it will set the OverrideColor flag and the outp
ut parameter | 161 * color to blend correctly, it will set the OverrideColor flag and the outp
ut parameter |
| 162 * overrideColor will be the required value that should be passed into the X
P. | 162 * overrideColor will be the required value that should be passed into the X
P. |
| 163 * A caller who calls this function on a XP is required to honor the returne
d OptFlags | 163 * A caller who calls this function on a XP is required to honor the returne
d OptFlags |
| 164 * and color values for its draw. | 164 * and color values for its draw. |
| 165 */ | 165 */ |
| 166 OptFlags getOptimizations(const GrProcOptInfo& colorPOI, | 166 OptFlags getOptimizations(const GrProcOptInfo& colorPOI, |
| 167 const GrProcOptInfo& coveragePOI, | 167 const GrProcOptInfo& coveragePOI, |
| 168 bool doesStencilWrite, | 168 bool doesStencilWrite, |
| 169 GrColor* overrideColor, | 169 GrColor* overrideColor, |
| 170 const GrDrawTargetCaps& caps); | 170 const GrCaps& caps); |
| 171 | 171 |
| 172 /** | 172 /** |
| 173 * Returns whether this XP will require an Xfer barrier on the given rt. If
true, outBarrierType | 173 * Returns whether this XP will require an Xfer barrier on the given rt. If
true, outBarrierType |
| 174 * is updated to contain the type of barrier needed. | 174 * is updated to contain the type of barrier needed. |
| 175 */ | 175 */ |
| 176 bool willNeedXferBarrier(const GrRenderTarget* rt, | 176 bool willNeedXferBarrier(const GrRenderTarget* rt, |
| 177 const GrDrawTargetCaps& caps, | 177 const GrCaps& caps, |
| 178 GrXferBarrierType* outBarrierType) const; | 178 GrXferBarrierType* outBarrierType) const; |
| 179 | 179 |
| 180 struct BlendInfo { | 180 struct BlendInfo { |
| 181 void reset() { | 181 void reset() { |
| 182 fEquation = kAdd_GrBlendEquation; | 182 fEquation = kAdd_GrBlendEquation; |
| 183 fSrcBlend = kOne_GrBlendCoeff; | 183 fSrcBlend = kOne_GrBlendCoeff; |
| 184 fDstBlend = kZero_GrBlendCoeff; | 184 fDstBlend = kZero_GrBlendCoeff; |
| 185 fBlendConstant = 0; | 185 fBlendConstant = 0; |
| 186 fWriteColor = true; | 186 fWriteColor = true; |
| 187 } | 187 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 | 257 |
| 258 protected: | 258 protected: |
| 259 GrXferProcessor(); | 259 GrXferProcessor(); |
| 260 GrXferProcessor(const GrDeviceCoordTexture* dstCopy, bool willReadDstColor); | 260 GrXferProcessor(const GrDeviceCoordTexture* dstCopy, bool willReadDstColor); |
| 261 | 261 |
| 262 private: | 262 private: |
| 263 virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, | 263 virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, |
| 264 const GrProcOptInfo& coveragePOI, | 264 const GrProcOptInfo& coveragePOI, |
| 265 bool doesStencilWrite, | 265 bool doesStencilWrite, |
| 266 GrColor* overrideColor, | 266 GrColor* overrideColor, |
| 267 const GrDrawTargetCaps& caps) = 0; | 267 const GrCaps& caps) = 0; |
| 268 | 268 |
| 269 /** | 269 /** |
| 270 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate
d with this xfer | 270 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate
d with this xfer |
| 271 * processor's GL backend implementation. | 271 * processor's GL backend implementation. |
| 272 */ | 272 */ |
| 273 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, | 273 virtual void onGetGLProcessorKey(const GrGLSLCaps& caps, |
| 274 GrProcessorKeyBuilder* b) const = 0; | 274 GrProcessorKeyBuilder* b) const = 0; |
| 275 | 275 |
| 276 /** | 276 /** |
| 277 * If not using a texture barrier, retrieves whether the subclass will requi
re a different type | 277 * If not using a texture barrier, retrieves whether the subclass will requi
re a different type |
| 278 * of barrier. | 278 * of barrier. |
| 279 */ | 279 */ |
| 280 virtual bool onWillNeedXferBarrier(const GrRenderTarget*, | 280 virtual bool onWillNeedXferBarrier(const GrRenderTarget*, |
| 281 const GrDrawTargetCaps&, | 281 const GrCaps&, |
| 282 GrXferBarrierType* outBarrierType SK_UNUS
ED) const { | 282 GrXferBarrierType* outBarrierType SK_UNUS
ED) const { |
| 283 return false; | 283 return false; |
| 284 } | 284 } |
| 285 | 285 |
| 286 /** | 286 /** |
| 287 * Retrieves the hardware blend state required by this Xfer processor. The B
lendInfo struct | 287 * Retrieves the hardware blend state required by this Xfer processor. The B
lendInfo struct |
| 288 * comes initialized to default values, so the Xfer processor only needs to
set the state it | 288 * comes initialized to default values, so the Xfer processor only needs to
set the state it |
| 289 * needs. It may not even need to override this method at all. | 289 * needs. It may not even need to override this method at all. |
| 290 */ | 290 */ |
| 291 virtual void onGetBlendInfo(BlendInfo*) const {} | 291 virtual void onGetBlendInfo(BlendInfo*) const {} |
| (...skipping 21 matching lines...) Expand all Loading... |
| 313 * | 313 * |
| 314 * Before the XP is created, the XPF is able to answer queries about what functi
onality the XPs it | 314 * Before the XP is created, the XPF is able to answer queries about what functi
onality the XPs it |
| 315 * creates will have. For example, can it create an XP that supports RGB coverag
e or will the XP | 315 * creates will have. For example, can it create an XP that supports RGB coverag
e or will the XP |
| 316 * blend with the destination color. | 316 * blend with the destination color. |
| 317 */ | 317 */ |
| 318 class GrXPFactory : public SkRefCnt { | 318 class GrXPFactory : public SkRefCnt { |
| 319 public: | 319 public: |
| 320 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, | 320 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, |
| 321 const GrProcOptInfo& coveragePOI, | 321 const GrProcOptInfo& coveragePOI, |
| 322 const GrDeviceCoordTexture* dstCopy, | 322 const GrDeviceCoordTexture* dstCopy, |
| 323 const GrDrawTargetCaps& caps) const; | 323 const GrCaps& caps) const; |
| 324 | 324 |
| 325 /** | 325 /** |
| 326 * This function returns true if the GrXferProcessor generated from this fac
tory will be able to | 326 * This function returns true if the GrXferProcessor generated from this fac
tory will be able to |
| 327 * correctly blend when using RGB coverage. The knownColor and knownColorFla
gs represent the | 327 * correctly blend when using RGB coverage. The knownColor and knownColorFla
gs represent the |
| 328 * final computed color from the color stages. | 328 * final computed color from the color stages. |
| 329 */ | 329 */ |
| 330 virtual bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlag
s) const = 0; | 330 virtual bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlag
s) const = 0; |
| 331 | 331 |
| 332 struct InvariantOutput { | 332 struct InvariantOutput { |
| 333 bool fWillBlendWithDst; | 333 bool fWillBlendWithDst; |
| 334 GrColor fBlendedColor; | 334 GrColor fBlendedColor; |
| 335 uint32_t fBlendedColorFlags; | 335 uint32_t fBlendedColorFlags; |
| 336 }; | 336 }; |
| 337 | 337 |
| 338 /** | 338 /** |
| 339 * This function returns known information about the output of the xfer proc
essor produced by | 339 * This function returns known information about the output of the xfer proc
essor produced by |
| 340 * this xp factory. The invariant color information returned by this functio
n refers to the | 340 * this xp factory. The invariant color information returned by this functio
n refers to the |
| 341 * final color produced after all blending. | 341 * final color produced after all blending. |
| 342 */ | 342 */ |
| 343 virtual void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcO
ptInfo& coveragePOI, | 343 virtual void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcO
ptInfo& coveragePOI, |
| 344 InvariantOutput*) const = 0; | 344 InvariantOutput*) const = 0; |
| 345 | 345 |
| 346 bool willNeedDstCopy(const GrDrawTargetCaps& caps, const GrProcOptInfo& colo
rPOI, | 346 bool willNeedDstCopy(const GrCaps& caps, const GrProcOptInfo& colorPOI, |
| 347 const GrProcOptInfo& coveragePOI) const; | 347 const GrProcOptInfo& coveragePOI) const; |
| 348 | 348 |
| 349 bool isEqual(const GrXPFactory& that) const { | 349 bool isEqual(const GrXPFactory& that) const { |
| 350 if (this->classID() != that.classID()) { | 350 if (this->classID() != that.classID()) { |
| 351 return false; | 351 return false; |
| 352 } | 352 } |
| 353 return this->onIsEqual(that); | 353 return this->onIsEqual(that); |
| 354 } | 354 } |
| 355 | 355 |
| 356 /** | 356 /** |
| 357 * Helper for down-casting to a GrXPFactory subclass | 357 * Helper for down-casting to a GrXPFactory subclass |
| 358 */ | 358 */ |
| 359 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } | 359 template <typename T> const T& cast() const { return *static_cast<const T*>(
this); } |
| 360 | 360 |
| 361 uint32_t classID() const { SkASSERT(kIllegalXPFClassID != fClassID); return
fClassID; } | 361 uint32_t classID() const { SkASSERT(kIllegalXPFClassID != fClassID); return
fClassID; } |
| 362 | 362 |
| 363 protected: | 363 protected: |
| 364 GrXPFactory() : fClassID(kIllegalXPFClassID) {} | 364 GrXPFactory() : fClassID(kIllegalXPFClassID) {} |
| 365 | 365 |
| 366 template <typename XPF_SUBCLASS> void initClassID() { | 366 template <typename XPF_SUBCLASS> void initClassID() { |
| 367 static uint32_t kClassID = GenClassID(); | 367 static uint32_t kClassID = GenClassID(); |
| 368 fClassID = kClassID; | 368 fClassID = kClassID; |
| 369 } | 369 } |
| 370 | 370 |
| 371 uint32_t fClassID; | 371 uint32_t fClassID; |
| 372 | 372 |
| 373 private: | 373 private: |
| 374 virtual GrXferProcessor* onCreateXferProcessor(const GrDrawTargetCaps& caps, | 374 virtual GrXferProcessor* onCreateXferProcessor(const GrCaps& caps, |
| 375 const GrProcOptInfo& colorPOI
, | 375 const GrProcOptInfo& colorPOI
, |
| 376 const GrProcOptInfo& coverage
POI, | 376 const GrProcOptInfo& coverage
POI, |
| 377 const GrDeviceCoordTexture* d
stCopy) const = 0; | 377 const GrDeviceCoordTexture* d
stCopy) const = 0; |
| 378 /** | 378 /** |
| 379 * Returns true if the XP generated by this factory will explicitly read ds
t in the fragment | 379 * Returns true if the XP generated by this factory will explicitly read ds
t in the fragment |
| 380 * shader. | 380 * shader. |
| 381 */ | 381 */ |
| 382 virtual bool willReadDstColor(const GrDrawTargetCaps& caps, | 382 virtual bool willReadDstColor(const GrCaps& caps, |
| 383 const GrProcOptInfo& colorPOI, | 383 const GrProcOptInfo& colorPOI, |
| 384 const GrProcOptInfo& coveragePOI) const = 0; | 384 const GrProcOptInfo& coveragePOI) const = 0; |
| 385 | 385 |
| 386 virtual bool onIsEqual(const GrXPFactory&) const = 0; | 386 virtual bool onIsEqual(const GrXPFactory&) const = 0; |
| 387 | 387 |
| 388 static uint32_t GenClassID() { | 388 static uint32_t GenClassID() { |
| 389 // fCurrXPFactoryID has been initialized to kIllegalXPFactoryID. The | 389 // fCurrXPFactoryID has been initialized to kIllegalXPFactoryID. The |
| 390 // atomic inc returns the old value not the incremented value. So we add | 390 // atomic inc returns the old value not the incremented value. So we add |
| 391 // 1 to the returned value. | 391 // 1 to the returned value. |
| 392 uint32_t id = static_cast<uint32_t>(sk_atomic_inc(&gCurrXPFClassID)) + 1
; | 392 uint32_t id = static_cast<uint32_t>(sk_atomic_inc(&gCurrXPFClassID)) + 1
; |
| 393 if (!id) { | 393 if (!id) { |
| 394 SkFAIL("This should never wrap as it should only be called once for
each GrXPFactory " | 394 SkFAIL("This should never wrap as it should only be called once for
each GrXPFactory " |
| 395 "subclass."); | 395 "subclass."); |
| 396 } | 396 } |
| 397 return id; | 397 return id; |
| 398 } | 398 } |
| 399 | 399 |
| 400 enum { | 400 enum { |
| 401 kIllegalXPFClassID = 0, | 401 kIllegalXPFClassID = 0, |
| 402 }; | 402 }; |
| 403 static int32_t gCurrXPFClassID; | 403 static int32_t gCurrXPFClassID; |
| 404 | 404 |
| 405 typedef GrProgramElement INHERITED; | 405 typedef GrProgramElement INHERITED; |
| 406 }; | 406 }; |
| 407 | 407 |
| 408 #endif | 408 #endif |
| 409 | 409 |
| OLD | NEW |