Chromium Code Reviews| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 * seconday fragment shader output color. When allowed by the backend API, the G rXferProcessor may | 101 * seconday fragment shader output color. When allowed by the backend API, the G rXferProcessor may |
| 102 * read the destination color. The GrXferProcessor is responsible for setting th e blend coefficients | 102 * read the destination color. The GrXferProcessor is responsible for setting th e blend coefficients |
| 103 * and blend constant color. | 103 * and blend constant color. |
| 104 * | 104 * |
| 105 * A GrXferProcessor is never installed directly into our draw state, but instea d is created from a | 105 * A GrXferProcessor is never installed directly into our draw state, but instea d is created from a |
| 106 * GrXPFactory once we have finalized the state of our draw. | 106 * GrXPFactory once we have finalized the state of our draw. |
| 107 */ | 107 */ |
| 108 class GrXferProcessor : public GrProcessor { | 108 class GrXferProcessor : public GrProcessor { |
| 109 public: | 109 public: |
| 110 /** | 110 /** |
| 111 * A texture that contains the dst pixel values and an integer coord offset from device space | |
| 112 * to the space of the texture. Depending on GPU capabilities a DstTexture m ay be used by a | |
| 113 * GrXferProcessor for blending in the fragment shader. | |
| 114 */ | |
| 115 class DstTexture { | |
| 116 public: | |
| 117 DstTexture() { fOffset.set(0, 0); } | |
| 118 | |
| 119 DstTexture(const DstTexture& other) { | |
| 120 *this = other; | |
| 121 } | |
| 122 | |
| 123 DstTexture(GrTexture* texture, const SkIPoint& offset) | |
| 124 : fTexture(SkSafeRef(texture)) | |
| 125 , fOffset(offset) { | |
| 126 } | |
| 127 | |
| 128 DstTexture& operator=(const DstTexture& other) { | |
| 129 fTexture.reset(SkSafeRef(other.fTexture.get())); | |
| 130 fOffset = other.fOffset; | |
| 131 return *this; | |
| 132 } | |
| 133 | |
| 134 const SkIPoint& offset() const { return fOffset; } | |
| 135 | |
| 136 void setOffset(const SkIPoint& offset) { fOffset = offset; } | |
| 137 void setOffset(int ox, int oy) { fOffset.set(ox, oy); } | |
| 138 | |
| 139 GrTexture* texture() const { return fTexture.get(); } | |
| 140 | |
| 141 GrTexture* setTexture(GrTexture* texture) { | |
| 142 fTexture.reset(SkSafeRef(texture)); | |
| 143 return texture; | |
| 144 } | |
| 145 | |
| 146 private: | |
| 147 SkAutoTUnref<GrTexture> fTexture; | |
| 148 SkIPoint fOffset; | |
| 149 }; | |
| 150 | |
| 151 /** | |
| 111 * Sets a unique key on the GrProcessorKeyBuilder calls onGetGLProcessorKey( ...) to get the | 152 * Sets a unique key on the GrProcessorKeyBuilder calls onGetGLProcessorKey( ...) to get the |
| 112 * specific subclass's key. | 153 * specific subclass's key. |
| 113 */ | 154 */ |
| 114 void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) con st; | 155 void getGLProcessorKey(const GrGLSLCaps& caps, GrProcessorKeyBuilder* b) con st; |
| 115 | 156 |
| 116 /** Returns a new instance of the appropriate *GL* implementation class | 157 /** Returns a new instance of the appropriate *GL* implementation class |
| 117 for the given GrXferProcessor; caller is responsible for deleting | 158 for the given GrXferProcessor; caller is responsible for deleting |
| 118 the object. */ | 159 the object. */ |
| 119 virtual GrGLXferProcessor* createGLInstance() const = 0; | 160 virtual GrGLXferProcessor* createGLInstance() const = 0; |
| 120 | 161 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 200 this->onGetBlendInfo(blendInfo); | 241 this->onGetBlendInfo(blendInfo); |
| 201 } | 242 } |
| 202 | 243 |
| 203 bool willReadDstColor() const { return fWillReadDstColor; } | 244 bool willReadDstColor() const { return fWillReadDstColor; } |
| 204 | 245 |
| 205 /** | 246 /** |
| 206 * Returns the texture to be used as the destination when reading the dst in the fragment | 247 * Returns the texture to be used as the destination when reading the dst in the fragment |
| 207 * shader. If the returned texture is NULL then the XP is either not reading the dst or we have | 248 * shader. If the returned texture is NULL then the XP is either not reading the dst or we have |
| 208 * extentions that support framebuffer fetching and thus don't need a copy o f the dst texture. | 249 * extentions that support framebuffer fetching and thus don't need a copy o f the dst texture. |
| 209 */ | 250 */ |
| 210 const GrTexture* getDstCopyTexture() const { return fDstCopy.getTexture(); } | 251 const GrTexture* getDstTexture() const { return fDstTexture.getTexture(); } |
| 211 | 252 |
| 212 /** | 253 /** |
| 213 * Returns the offset into the DstCopyTexture to use when reading it in the shader. This value | 254 * Returns the offset in device coords to use when accessing the dst texture to get the dst |
| 214 * is only valid if getDstCopyTexture() != NULL. | 255 * pixel color in the shader. This value is only valid if getDstTexture() != NULL. |
| 215 */ | 256 */ |
| 216 const SkIPoint& dstCopyTextureOffset() const { | 257 const SkIPoint& dstTextureOffset() const { |
| 217 SkASSERT(this->getDstCopyTexture()); | 258 SkASSERT(this->getDstTexture()); |
| 218 return fDstCopyTextureOffset; | 259 return fDstTextureOffset; |
| 219 } | 260 } |
| 220 | 261 |
| 221 /** | 262 /** |
| 222 * Returns whether or not the XP will look at coverage when doing its blendi ng. | 263 * Returns whether or not the XP will look at coverage when doing its blendi ng. |
| 223 */ | 264 */ |
| 224 bool readsCoverage() const { return fReadsCoverage; } | 265 bool readsCoverage() const { return fReadsCoverage; } |
| 225 | 266 |
| 226 /** | 267 /** |
| 227 * Returns whether or not this xferProcossor will set a secondary output to be used with dual | 268 * Returns whether or not this xferProcossor will set a secondary output to be used with dual |
| 228 * source blending. | 269 * source blending. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 239 bool isEqual(const GrXferProcessor& that) const { | 280 bool isEqual(const GrXferProcessor& that) const { |
| 240 if (this->classID() != that.classID()) { | 281 if (this->classID() != that.classID()) { |
| 241 return false; | 282 return false; |
| 242 } | 283 } |
| 243 if (this->fWillReadDstColor != that.fWillReadDstColor) { | 284 if (this->fWillReadDstColor != that.fWillReadDstColor) { |
| 244 return false; | 285 return false; |
| 245 } | 286 } |
| 246 if (this->fReadsCoverage != that.fReadsCoverage) { | 287 if (this->fReadsCoverage != that.fReadsCoverage) { |
| 247 return false; | 288 return false; |
| 248 } | 289 } |
| 249 if (this->fDstCopy.getTexture() != that.fDstCopy.getTexture()) { | 290 if (this->fDstTexture.getTexture() != that.fDstTexture.getTexture()) { |
| 250 return false; | 291 return false; |
| 251 } | 292 } |
| 252 if (this->fDstCopyTextureOffset != that.fDstCopyTextureOffset) { | 293 if (this->fDstTextureOffset != that.fDstTextureOffset) { |
| 253 return false; | 294 return false; |
| 254 } | 295 } |
| 255 return this->onIsEqual(that); | 296 return this->onIsEqual(that); |
| 256 } | 297 } |
| 257 | 298 |
| 258 protected: | 299 protected: |
| 259 GrXferProcessor(); | 300 GrXferProcessor(); |
| 260 GrXferProcessor(const GrDeviceCoordTexture* dstCopy, bool willReadDstColor); | 301 GrXferProcessor(const DstTexture*, bool willReadDstColor); |
| 261 | 302 |
| 262 private: | 303 private: |
| 263 virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, | 304 virtual OptFlags onGetOptimizations(const GrProcOptInfo& colorPOI, |
| 264 const GrProcOptInfo& coveragePOI, | 305 const GrProcOptInfo& coveragePOI, |
| 265 bool doesStencilWrite, | 306 bool doesStencilWrite, |
| 266 GrColor* overrideColor, | 307 GrColor* overrideColor, |
| 267 const GrDrawTargetCaps& caps) = 0; | 308 const GrDrawTargetCaps& caps) = 0; |
| 268 | 309 |
| 269 /** | 310 /** |
| 270 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate d with this xfer | 311 * Sets a unique key on the GrProcessorKeyBuilder that is directly associate d with this xfer |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 287 * Retrieves the hardware blend state required by this Xfer processor. The B lendInfo struct | 328 * 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 | 329 * 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. | 330 * needs. It may not even need to override this method at all. |
| 290 */ | 331 */ |
| 291 virtual void onGetBlendInfo(BlendInfo*) const {} | 332 virtual void onGetBlendInfo(BlendInfo*) const {} |
| 292 | 333 |
| 293 virtual bool onIsEqual(const GrXferProcessor&) const = 0; | 334 virtual bool onIsEqual(const GrXferProcessor&) const = 0; |
| 294 | 335 |
| 295 bool fWillReadDstColor; | 336 bool fWillReadDstColor; |
| 296 bool fReadsCoverage; | 337 bool fReadsCoverage; |
| 297 SkIPoint fDstCopyTextureOffset; | 338 SkIPoint fDstTextureOffset; |
|
egdaniel
2015/05/18 19:07:13
Do we want to keep saving the Offset and Texture s
| |
| 298 GrTextureAccess fDstCopy; | 339 GrTextureAccess fDstTexture; |
| 299 | 340 |
| 300 typedef GrFragmentProcessor INHERITED; | 341 typedef GrFragmentProcessor INHERITED; |
| 301 }; | 342 }; |
| 302 | 343 |
| 303 GR_MAKE_BITFIELD_OPS(GrXferProcessor::OptFlags); | 344 GR_MAKE_BITFIELD_OPS(GrXferProcessor::OptFlags); |
| 304 | 345 |
| 305 /////////////////////////////////////////////////////////////////////////////// | 346 /////////////////////////////////////////////////////////////////////////////// |
| 306 | 347 |
| 307 /** | 348 /** |
| 308 * We install a GrXPFactory (XPF) early on in the pipeline before all the final draw information is | 349 * We install a GrXPFactory (XPF) early on in the pipeline before all the final draw information is |
| 309 * known (e.g. whether there is fractional pixel coverage, will coverage be 1 or 4 channel, is the | 350 * known (e.g. whether there is fractional pixel coverage, will coverage be 1 or 4 channel, is the |
| 310 * draw opaque, etc.). Once the state of the draw is finalized, we use the XPF a long with all the | 351 * draw opaque, etc.). Once the state of the draw is finalized, we use the XPF a long with all the |
| 311 * draw information to create a GrXferProcessor (XP) which can implement the des ired blending for | 352 * draw information to create a GrXferProcessor (XP) which can implement the des ired blending for |
| 312 * the draw. | 353 * the draw. |
| 313 * | 354 * |
| 314 * Before the XP is created, the XPF is able to answer queries about what functi onality the XPs it | 355 * 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 | 356 * 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. | 357 * blend with the destination color. |
| 317 */ | 358 */ |
| 318 class GrXPFactory : public SkRefCnt { | 359 class GrXPFactory : public SkRefCnt { |
| 319 public: | 360 public: |
| 361 typedef GrXferProcessor::DstTexture DstTexture; | |
| 320 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, | 362 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI, |
| 321 const GrProcOptInfo& coveragePOI, | 363 const GrProcOptInfo& coveragePOI, |
| 322 const GrDeviceCoordTexture* dstCopy, | 364 const DstTexture*, |
| 323 const GrDrawTargetCaps& caps) const; | 365 const GrDrawTargetCaps& caps) const; |
| 324 | 366 |
| 325 /** | 367 /** |
| 326 * This function returns true if the GrXferProcessor generated from this fac tory will be able to | 368 * 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 | 369 * correctly blend when using RGB coverage. The knownColor and knownColorFla gs represent the |
| 328 * final computed color from the color stages. | 370 * final computed color from the color stages. |
| 329 */ | 371 */ |
| 330 virtual bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlag s) const = 0; | 372 virtual bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlag s) const = 0; |
| 331 | 373 |
| 332 struct InvariantOutput { | 374 struct InvariantOutput { |
| 333 bool fWillBlendWithDst; | 375 bool fWillBlendWithDst; |
| 334 GrColor fBlendedColor; | 376 GrColor fBlendedColor; |
| 335 uint32_t fBlendedColorFlags; | 377 uint32_t fBlendedColorFlags; |
| 336 }; | 378 }; |
| 337 | 379 |
| 338 /** | 380 /** |
| 339 * This function returns known information about the output of the xfer proc essor produced by | 381 * 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 | 382 * this xp factory. The invariant color information returned by this functio n refers to the |
| 341 * final color produced after all blending. | 383 * final color produced after all blending. |
| 342 */ | 384 */ |
| 343 virtual void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcO ptInfo& coveragePOI, | 385 virtual void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcO ptInfo& coveragePOI, |
| 344 InvariantOutput*) const = 0; | 386 InvariantOutput*) const = 0; |
| 345 | 387 |
| 346 bool willNeedDstCopy(const GrDrawTargetCaps& caps, const GrProcOptInfo& colo rPOI, | 388 bool willNeedDstTexture(const GrDrawTargetCaps& caps, const GrProcOptInfo& c olorPOI, |
| 347 const GrProcOptInfo& coveragePOI) const; | 389 const GrProcOptInfo& coveragePOI) const; |
| 348 | 390 |
| 349 bool isEqual(const GrXPFactory& that) const { | 391 bool isEqual(const GrXPFactory& that) const { |
| 350 if (this->classID() != that.classID()) { | 392 if (this->classID() != that.classID()) { |
| 351 return false; | 393 return false; |
| 352 } | 394 } |
| 353 return this->onIsEqual(that); | 395 return this->onIsEqual(that); |
| 354 } | 396 } |
| 355 | 397 |
| 356 /** | 398 /** |
| 357 * Helper for down-casting to a GrXPFactory subclass | 399 * Helper for down-casting to a GrXPFactory subclass |
| 358 */ | 400 */ |
| 359 template <typename T> const T& cast() const { return *static_cast<const T*>( this); } | 401 template <typename T> const T& cast() const { return *static_cast<const T*>( this); } |
| 360 | 402 |
| 361 uint32_t classID() const { SkASSERT(kIllegalXPFClassID != fClassID); return fClassID; } | 403 uint32_t classID() const { SkASSERT(kIllegalXPFClassID != fClassID); return fClassID; } |
| 362 | 404 |
| 363 protected: | 405 protected: |
| 364 GrXPFactory() : fClassID(kIllegalXPFClassID) {} | 406 GrXPFactory() : fClassID(kIllegalXPFClassID) {} |
| 365 | 407 |
| 366 template <typename XPF_SUBCLASS> void initClassID() { | 408 template <typename XPF_SUBCLASS> void initClassID() { |
| 367 static uint32_t kClassID = GenClassID(); | 409 static uint32_t kClassID = GenClassID(); |
| 368 fClassID = kClassID; | 410 fClassID = kClassID; |
| 369 } | 411 } |
| 370 | 412 |
| 371 uint32_t fClassID; | 413 uint32_t fClassID; |
| 372 | 414 |
| 373 private: | 415 private: |
| 374 virtual GrXferProcessor* onCreateXferProcessor(const GrDrawTargetCaps& caps, | 416 virtual GrXferProcessor* onCreateXferProcessor(const GrDrawTargetCaps& caps, |
| 375 const GrProcOptInfo& colorPOI , | 417 const GrProcOptInfo& colorPOI , |
| 376 const GrProcOptInfo& coverage POI, | 418 const GrProcOptInfo& coverage POI, |
| 377 const GrDeviceCoordTexture* d stCopy) const = 0; | 419 const DstTexture*) const = 0; |
| 378 /** | 420 /** |
| 379 * Returns true if the XP generated by this factory will explicitly read ds t in the fragment | 421 * Returns true if the XP generated by this factory will explicitly read ds t in the fragment |
| 380 * shader. | 422 * shader. |
| 381 */ | 423 */ |
| 382 virtual bool willReadDstColor(const GrDrawTargetCaps& caps, | 424 virtual bool willReadDstColor(const GrDrawTargetCaps& caps, |
| 383 const GrProcOptInfo& colorPOI, | 425 const GrProcOptInfo& colorPOI, |
| 384 const GrProcOptInfo& coveragePOI) const = 0; | 426 const GrProcOptInfo& coveragePOI) const = 0; |
| 385 | 427 |
| 386 virtual bool onIsEqual(const GrXPFactory&) const = 0; | 428 virtual bool onIsEqual(const GrXPFactory&) const = 0; |
| 387 | 429 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 400 enum { | 442 enum { |
| 401 kIllegalXPFClassID = 0, | 443 kIllegalXPFClassID = 0, |
| 402 }; | 444 }; |
| 403 static int32_t gCurrXPFClassID; | 445 static int32_t gCurrXPFClassID; |
| 404 | 446 |
| 405 typedef GrProgramElement INHERITED; | 447 typedef GrProgramElement INHERITED; |
| 406 }; | 448 }; |
| 407 | 449 |
| 408 #endif | 450 #endif |
| 409 | 451 |
| OLD | NEW |