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 |