Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(725)

Side by Side Diff: include/gpu/GrXferProcessor.h

Issue 1170553002: Apply coverage in XP base class when using dst reads (Closed) Base URL: https://skia.googlesource.com/skia.git@upload2_reenablebea
Patch Set: names Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/effects/SkArithmeticMode_gpu.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 * Barriers for blending. When a shader reads the dst directly, an Xfer barrier is sometimes 83 * Barriers for blending. When a shader reads the dst directly, an Xfer barrier is sometimes
84 * required after a pixel has been written, before it can be safely read again. 84 * required after a pixel has been written, before it can be safely read again.
85 */ 85 */
86 enum GrXferBarrierType { 86 enum GrXferBarrierType {
87 kTexture_GrXferBarrierType, //<! Required when a shader reads and renders to the same texture. 87 kTexture_GrXferBarrierType, //<! Required when a shader reads and renders to the same texture.
88 kBlend_GrXferBarrierType, //<! Required by certain blend extensions. 88 kBlend_GrXferBarrierType, //<! Required by certain blend extensions.
89 }; 89 };
90 90
91 /** 91 /**
92 * GrXferProcessor is responsible for implementing the xfer mode that blends the src color and dst 92 * GrXferProcessor is responsible for implementing the xfer mode that blends the src color and dst
93 * color. It does this by emitting fragment shader code and controlling the fixe d-function blend 93 * color, and for applying any coverage. It does this by emitting fragment shade r code and
94 * state. The inputs to its shader code are the final computed src color and fra ctional pixel 94 * controlling the fixed-function blend state. When dual-source blending is avai lable, it may also
95 * coverage. The GrXferProcessor's shader code writes the fragment shader output color that goes 95 * write a seconday fragment shader output color. GrXferProcessor has two modes of operation:
96 * into the fixed-function blend. When dual-source blending is available, it may also write a 96 *
97 * seconday fragment shader output color. When allowed by the backend API, the G rXferProcessor may 97 * Dst read: When allowed by the backend API, or when supplied a texture of the destination, the
98 * read the destination color. The GrXferProcessor is responsible for setting th e blend coefficients 98 * GrXferProcessor may read the destination color. While operating in this mode, the subclass only
99 * and blend constant color. 99 * provides shader code that blends the src and dst colors, and the base class a pplies coverage.
100 *
101 * No dst read: When not performing a dst read, the subclass is given full contr ol of the fixed-
102 * function blend state and/or secondary output, and is responsible to apply cov erage on its own.
100 * 103 *
101 * A GrXferProcessor is never installed directly into our draw state, but instea d is created from a 104 * A GrXferProcessor is never installed directly into our draw state, but instea d is created from a
102 * GrXPFactory once we have finalized the state of our draw. 105 * GrXPFactory once we have finalized the state of our draw.
103 */ 106 */
104 class GrXferProcessor : public GrProcessor { 107 class GrXferProcessor : public GrProcessor {
105 public: 108 public:
106 /** 109 /**
107 * A texture that contains the dst pixel values and an integer coord offset from device space 110 * A texture that contains the dst pixel values and an integer coord offset from device space
108 * to the space of the texture. Depending on GPU capabilities a DstTexture m ay be used by a 111 * to the space of the texture. Depending on GPU capabilities a DstTexture m ay be used by a
109 * GrXferProcessor for blending in the fragment shader. 112 * GrXferProcessor for blending in the fragment shader.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 224
222 SkDEBUGCODE(SkString dump() const;) 225 SkDEBUGCODE(SkString dump() const;)
223 226
224 GrBlendEquation fEquation; 227 GrBlendEquation fEquation;
225 GrBlendCoeff fSrcBlend; 228 GrBlendCoeff fSrcBlend;
226 GrBlendCoeff fDstBlend; 229 GrBlendCoeff fDstBlend;
227 GrColor fBlendConstant; 230 GrColor fBlendConstant;
228 bool fWriteColor; 231 bool fWriteColor;
229 }; 232 };
230 233
231 void getBlendInfo(BlendInfo* blendInfo) const { 234 void getBlendInfo(BlendInfo* blendInfo) const;
232 blendInfo->reset();
233 this->onGetBlendInfo(blendInfo);
234 }
235 235
236 bool willReadDstColor() const { return fWillReadDstColor; } 236 bool willReadDstColor() const { return fWillReadDstColor; }
237 237
238 /** 238 /**
239 * Returns the texture to be used as the destination when reading the dst in the fragment 239 * Returns the texture to be used as the destination when reading the dst in the fragment
240 * shader. If the returned texture is NULL then the XP is either not reading the dst or we have 240 * shader. If the returned texture is NULL then the XP is either not reading the dst or we have
241 * extentions that support framebuffer fetching and thus don't need a copy o f the dst texture. 241 * extentions that support framebuffer fetching and thus don't need a copy o f the dst texture.
242 */ 242 */
243 const GrTexture* getDstTexture() const { return fDstTexture.getTexture(); } 243 const GrTexture* getDstTexture() const { return fDstTexture.getTexture(); }
244 244
245 /** 245 /**
246 * Returns the offset in device coords to use when accessing the dst texture to get the dst 246 * Returns the offset in device coords to use when accessing the dst texture to get the dst
247 * pixel color in the shader. This value is only valid if getDstTexture() != NULL. 247 * pixel color in the shader. This value is only valid if getDstTexture() != NULL.
248 */ 248 */
249 const SkIPoint& dstTextureOffset() const { 249 const SkIPoint& dstTextureOffset() const {
250 SkASSERT(this->getDstTexture()); 250 SkASSERT(this->getDstTexture());
251 return fDstTextureOffset; 251 return fDstTextureOffset;
252 } 252 }
253 253
254 /** 254 /**
255 * Returns whether or not the XP will look at coverage when doing its blendi ng. 255 * Returns whether or not the XP will look at coverage when doing its blendi ng.
256 */ 256 */
257 bool readsCoverage() const { return fReadsCoverage; } 257 bool readsCoverage() const { return fReadsCoverage; }
258 258
259 /** 259 /**
260 * Returns whether or not this xferProcossor will set a secondary output to be used with dual 260 * Returns whether or not this xferProcossor will set a secondary output to be used with dual
261 * source blending. 261 * source blending.
262 */ 262 */
263 virtual bool hasSecondaryOutput() const { return false; } 263 bool hasSecondaryOutput() const;
264 264
265 /** Returns true if this and other processor conservatively draw identically . It can only return 265 /** Returns true if this and other processor conservatively draw identically . It can only return
266 true when the two processor are of the same subclass (i.e. they return t he same object from 266 true when the two processor are of the same subclass (i.e. they return t he same object from
267 from getFactory()). 267 from getFactory()).
268 268
269 A return value of true from isEqual() should not be used to test whether the processor would 269 A return value of true from isEqual() should not be used to test whether the processor would
270 generate the same shader code. To test for identical code generation use getGLProcessorKey*/ 270 generate the same shader code. To test for identical code generation use getGLProcessorKey*/
271 271
272 bool isEqual(const GrXferProcessor& that) const { 272 bool isEqual(const GrXferProcessor& that) const {
273 if (this->classID() != that.classID()) { 273 if (this->classID() != that.classID()) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 * If not using a texture barrier, retrieves whether the subclass will requi re a different type 310 * If not using a texture barrier, retrieves whether the subclass will requi re a different type
311 * of barrier. 311 * of barrier.
312 */ 312 */
313 virtual bool onWillNeedXferBarrier(const GrRenderTarget*, 313 virtual bool onWillNeedXferBarrier(const GrRenderTarget*,
314 const GrCaps&, 314 const GrCaps&,
315 GrXferBarrierType* outBarrierType SK_UNUS ED) const { 315 GrXferBarrierType* outBarrierType SK_UNUS ED) const {
316 return false; 316 return false;
317 } 317 }
318 318
319 /** 319 /**
320 * Retrieves the hardware blend state required by this Xfer processor. The B lendInfo struct 320 * If we are not performing a dst read, returns whether the subclass will se t a secondary
321 * comes initialized to default values, so the Xfer processor only needs to set the state it 321 * output. When using dst reads, the base class disables the secondary outpu t and this method
322 * needs. It may not even need to override this method at all. 322 * will not be called.
323 */
324 virtual bool onHasSecondaryOutput() const { return false; }
325
326 /**
327 * If we are not performing a dst read, retrieves the fixed-function blend s tate required by the
328 * subclass. When using dst reads, the base class disables fixed-function bl ending and this
329 * method will not be called. The BlendInfo struct comes initialized to "no blending".
323 */ 330 */
324 virtual void onGetBlendInfo(BlendInfo*) const {} 331 virtual void onGetBlendInfo(BlendInfo*) const {}
325 332
326 virtual bool onIsEqual(const GrXferProcessor&) const = 0; 333 virtual bool onIsEqual(const GrXferProcessor&) const = 0;
327 334
328 bool fWillReadDstColor; 335 bool fWillReadDstColor;
329 bool fReadsCoverage; 336 bool fReadsCoverage;
330 SkIPoint fDstTextureOffset; 337 SkIPoint fDstTextureOffset;
331 GrTextureAccess fDstTexture; 338 GrTextureAccess fDstTexture;
332 339
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 enum { 445 enum {
439 kIllegalXPFClassID = 0, 446 kIllegalXPFClassID = 0,
440 }; 447 };
441 static int32_t gCurrXPFClassID; 448 static int32_t gCurrXPFClassID;
442 449
443 typedef GrProgramElement INHERITED; 450 typedef GrProgramElement INHERITED;
444 }; 451 };
445 452
446 #endif 453 #endif
447 454
OLDNEW
« no previous file with comments | « no previous file | src/effects/SkArithmeticMode_gpu.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698