• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2010 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 
11 #ifndef GrTypes_DEFINED
12 #define GrTypes_DEFINED
13 
14 #include "SkTypes.h"
15 #include "GrConfig.h"
16 
17 ////////////////////////////////////////////////////////////////////////////////
18 
19 /**
20  * Defines overloaded bitwise operators to make it easier to use an enum as a
21  * bitfield.
22  */
23 #define GR_MAKE_BITFIELD_OPS(X) \
24     inline X operator | (X a, X b) { \
25         return (X) (+a | +b); \
26     } \
27     \
28     inline X operator & (X a, X b) { \
29         return (X) (+a & +b); \
30     } \
31     template <typename T> \
32     inline X operator & (T a, X b) { \
33         return (X) (+a & +b); \
34     } \
35     template <typename T> \
36     inline X operator & (X a, T b) { \
37         return (X) (+a & +b); \
38     } \
39 
40 #define GR_DECL_BITFIELD_OPS_FRIENDS(X) \
41     friend X operator | (X a, X b); \
42     \
43     friend X operator & (X a, X b); \
44     \
45     template <typename T> \
46     friend X operator & (T a, X b); \
47     \
48     template <typename T> \
49     friend X operator & (X a, T b); \
50 ////////////////////////////////////////////////////////////////////////////////
51 
52 
53 /**
54  *  Macro to round n up to the next multiple of 4, or return it unchanged if
55  *  n is already a multiple of 4
56  */
57 #define GrALIGN4(n)     SkAlign4(n)
58 #define GrIsALIGN4(n)   SkIsAlign4(n)
59 
GrMin(const T & a,const T & b)60 template <typename T> const T& GrMin(const T& a, const T& b) {
61 	return (a < b) ? a : b;
62 }
63 
GrMax(const T & a,const T & b)64 template <typename T> const T& GrMax(const T& a, const T& b) {
65 	return (b < a) ? a : b;
66 }
67 
68 // compile time versions of min/max
69 #define GR_CT_MAX(a, b) (((b) < (a)) ? (a) : (b))
70 #define GR_CT_MIN(a, b) (((b) < (a)) ? (b) : (a))
71 
72 /**
73  *  divide, rounding up
74  */
GrIDivRoundUp(int x,int y)75 static inline int32_t GrIDivRoundUp(int x, int y) {
76     GrAssert(y > 0);
77     return (x + (y-1)) / y;
78 }
GrUIDivRoundUp(uint32_t x,uint32_t y)79 static inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) {
80     return (x + (y-1)) / y;
81 }
GrSizeDivRoundUp(size_t x,uint32_t y)82 static inline size_t GrSizeDivRoundUp(size_t x, uint32_t y) {
83     return (x + (y-1)) / y;
84 }
85 
86 /**
87  *  align up
88  */
GrUIAlignUp(uint32_t x,uint32_t alignment)89 static inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) {
90     return GrUIDivRoundUp(x, alignment) * alignment;
91 }
GrSizeAlignUp(size_t x,uint32_t alignment)92 static inline uint32_t GrSizeAlignUp(size_t x, uint32_t alignment) {
93     return GrSizeDivRoundUp(x, alignment) * alignment;
94 }
95 
96 /**
97  * amount of pad needed to align up
98  */
GrUIAlignUpPad(uint32_t x,uint32_t alignment)99 static inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) {
100     return (alignment - x % alignment) % alignment;
101 }
GrSizeAlignUpPad(size_t x,uint32_t alignment)102 static inline size_t GrSizeAlignUpPad(size_t x, uint32_t alignment) {
103     return (alignment - x % alignment) % alignment;
104 }
105 
106 /**
107  *  align down
108  */
GrUIAlignDown(uint32_t x,uint32_t alignment)109 static inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) {
110     return (x / alignment) * alignment;
111 }
GrSizeAlignDown(size_t x,uint32_t alignment)112 static inline uint32_t GrSizeAlignDown(size_t x, uint32_t alignment) {
113     return (x / alignment) * alignment;
114 }
115 
116 /**
117  *  Count elements in an array
118  */
119 #define GR_ARRAY_COUNT(array)  SK_ARRAY_COUNT(array)
120 
121 //!< allocate a block of memory, will never return NULL
122 extern void* GrMalloc(size_t bytes);
123 
124 //!< free block allocated by GrMalloc. ptr may be NULL
125 extern void GrFree(void* ptr);
126 
Gr_bzero(void * dst,size_t size)127 static inline void Gr_bzero(void* dst, size_t size) {
128     memset(dst, 0, size);
129 }
130 
131 ///////////////////////////////////////////////////////////////////////////////
132 
133 /**
134  *  Return the number of leading zeros in n
135  */
136 extern int Gr_clz(uint32_t n);
137 
138 /**
139  *  Return true if n is a power of 2
140  */
GrIsPow2(unsigned n)141 static inline bool GrIsPow2(unsigned n) {
142     return n && 0 == (n & (n - 1));
143 }
144 
145 /**
146  *  Return the next power of 2 >= n.
147  */
GrNextPow2(uint32_t n)148 static inline uint32_t GrNextPow2(uint32_t n) {
149     return n ? (1 << (32 - Gr_clz(n - 1))) : 1;
150 }
151 
GrNextPow2(int n)152 static inline int GrNextPow2(int n) {
153     GrAssert(n >= 0); // this impl only works for non-neg.
154     return n ? (1 << (32 - Gr_clz(n - 1))) : 1;
155 }
156 
157 ///////////////////////////////////////////////////////////////////////////////
158 
159 /**
160  *  16.16 fixed point type
161  */
162 typedef int32_t GrFixed;
163 
164 #if GR_DEBUG
165 
GrToS16(intptr_t x)166 static inline int16_t GrToS16(intptr_t x) {
167     GrAssert((int16_t)x == x);
168     return (int16_t)x;
169 }
170 
171 #else
172 
173 #define GrToS16(x)  x
174 
175 #endif
176 
177 
178 ///////////////////////////////////////////////////////////////////////////////
179 
180 /**
181  * Possible 3D APIs that may be used by Ganesh.
182  */
183 enum GrEngine {
184     kOpenGL_Shaders_GrEngine,
185     kOpenGL_Fixed_GrEngine,
186 };
187 
188 /**
189  * Engine-specific 3D context handle
190  *      GrGLInterface* for OpenGL. If NULL will use the default GL interface.
191  */
192 typedef intptr_t GrPlatform3DContext;
193 
194 ///////////////////////////////////////////////////////////////////////////////
195 
196 /**
197  * Type used to describe format of vertices in arrays
198  * Values are defined in GrDrawTarget
199  */
200 typedef int GrVertexLayout;
201 
202 /**
203 * Geometric primitives used for drawing.
204 */
205 enum GrPrimitiveType {
206     kTriangles_PrimitiveType,
207     kTriangleStrip_PrimitiveType,
208     kTriangleFan_PrimitiveType,
209     kPoints_PrimitiveType,
210     kLines_PrimitiveType,     // 1 pix wide only
211     kLineStrip_PrimitiveType  // 1 pix wide only
212 };
213 
GrIsPrimTypeLines(GrPrimitiveType type)214 static inline bool GrIsPrimTypeLines(GrPrimitiveType type) {
215     return kLines_PrimitiveType == type || kLineStrip_PrimitiveType == type;
216 }
217 
GrIsPrimTypeTris(GrPrimitiveType type)218 static inline bool GrIsPrimTypeTris(GrPrimitiveType type) {
219     return kTriangles_PrimitiveType == type     ||
220            kTriangleStrip_PrimitiveType == type ||
221            kTriangleFan_PrimitiveType == type;
222 }
223 
224 /**
225  * Coeffecients for alpha-blending.
226  */
227 enum GrBlendCoeff {
228     kZero_BlendCoeff,    //<! 0
229     kOne_BlendCoeff,     //<! 1
230     kSC_BlendCoeff,      //<! src color
231     kISC_BlendCoeff,     //<! one minus src color
232     kDC_BlendCoeff,      //<! dst color
233     kIDC_BlendCoeff,     //<! one minus dst color
234     kSA_BlendCoeff,      //<! src alpha
235     kISA_BlendCoeff,     //<! one minus src alpha
236     kDA_BlendCoeff,      //<! dst alpha
237     kIDA_BlendCoeff,     //<! one minus dst alpha
238     kConstC_BlendCoeff,  //<! constant color
239     kIConstC_BlendCoeff, //<! one minus constant color
240     kConstA_BlendCoeff,  //<! constant color alpha
241     kIConstA_BlendCoeff, //<! one minus constant color alpha
242 
243     kPublicBlendCoeffCount
244 };
245 
246 /**
247  *  Formats for masks, used by the font cache.
248  *  Important that these are 0-based.
249  */
250 enum GrMaskFormat {
251     kA8_GrMaskFormat,    //!< 1-byte per pixel
252     kA565_GrMaskFormat,  //!< 2-bytes per pixel
253     kA888_GrMaskFormat,  //!< 4-bytes per pixel
254 
255     kCount_GrMaskFormats //!< used to allocate arrays sized for mask formats
256 };
257 
258 /**
259  *  Return the number of bytes-per-pixel for the specified mask format.
260  */
GrMaskFormatBytesPerPixel(GrMaskFormat format)261 static inline int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
262     GrAssert((unsigned)format <= 2);
263     // kA8   (0) -> 1
264     // kA565 (1) -> 2
265     // kA888 (2) -> 4
266     return 1 << (int)format;
267 }
268 
269 /**
270  * Pixel configurations.
271  *
272  * Unpremultiplied configs are intended for converting pixel data in and out
273  * from skia. Surfaces with these configs have limited support. As an input
274  * (GrPaint texture) the corresponding GrSamplerState must have its filter set
275  * to kNearest_Filter. Otherwise, the draw will fail. When the render target
276  * has an unpremultiplied config draws must use blend coeffs 1,0 (AKA src-mode).
277  * Other coeffs will cause the draw to fail.
278  */
279 enum GrPixelConfig {
280     kUnknown_GrPixelConfig,
281     kAlpha_8_GrPixelConfig,
282     kIndex_8_GrPixelConfig,
283     kRGB_565_GrPixelConfig,
284     /**
285      * Premultiplied
286      */
287     kRGBA_4444_GrPixelConfig,
288     /**
289      * Premultiplied. Byte order is r,g,b,a
290      */
291     kRGBA_8888_PM_GrPixelConfig,
292     /**
293      * Unpremultiplied. Byte order is r,g,b,a
294      */
295     kRGBA_8888_UPM_GrPixelConfig,
296     /**
297      * Premultiplied. Byte order is b,g,r,a
298      */
299     kBGRA_8888_PM_GrPixelConfig,
300     /**
301      * Unpremultiplied. Byte order is b,g,r,a
302      */
303     kBGRA_8888_UPM_GrPixelConfig,
304 
305     kGrPixelConfigCount
306 };
307 
308 // Aliases for pixel configs that match skia's byte order
309 #ifndef SK_CPU_LENDIAN
310     #error "Skia gpu currently assumes little endian"
311 #endif
312 #if 24 == SK_A32_SHIFT && 16 == SK_R32_SHIFT && \
313      8 == SK_G32_SHIFT &&  0 == SK_B32_SHIFT
314     static const GrPixelConfig kSkia8888_PM_GrPixelConfig = kBGRA_8888_PM_GrPixelConfig;
315     static const GrPixelConfig kSkia8888_UPM_GrPixelConfig = kBGRA_8888_UPM_GrPixelConfig;
316 #elif 24 == SK_A32_SHIFT && 16 == SK_B32_SHIFT && \
317        8 == SK_G32_SHIFT &&  0 == SK_R32_SHIFT
318     static const GrPixelConfig kSkia8888_PM_GrPixelConfig = kRGBA_8888_PM_GrPixelConfig;
319     static const GrPixelConfig kSkia8888_UPM_GrPixelConfig = kRGBA_8888_UPM_GrPixelConfig;
320 #else
321     #error "SK_*32_SHIFT values must correspond to GL_BGRA or GL_RGBA format."
322 #endif
323 
324 // WebKit is relying on this old name for the native skia PM config. This will
325 // be deleted ASAP because it is so similar to kRGBA_PM_8888_GrPixelConfig but
326 // has a different interpretation when skia is compiled BGRA.
327 static const GrPixelConfig kRGBA_8888_GrPixelConfig = kSkia8888_PM_GrPixelConfig;
328 
329 // Returns true if the pixel config has 8bit r,g,b,a components in that byte
330 // order
GrPixelConfigIsRGBA8888(GrPixelConfig config)331 static inline bool GrPixelConfigIsRGBA8888(GrPixelConfig config) {
332     switch (config) {
333         case kRGBA_8888_PM_GrPixelConfig:
334         case kRGBA_8888_UPM_GrPixelConfig:
335             return true;
336         default:
337             return false;
338     }
339 }
340 
341 // Returns true if the pixel config has 8bit b,g,r,a components in that byte
342 // order
GrPixelConfigIsBGRA8888(GrPixelConfig config)343 static inline bool GrPixelConfigIsBGRA8888(GrPixelConfig config) {
344     switch (config) {
345         case kBGRA_8888_PM_GrPixelConfig:
346         case kBGRA_8888_UPM_GrPixelConfig:
347             return true;
348         default:
349             return false;
350     }
351 }
352 
353 // Returns true if the pixel config is 32 bits per pixel
GrPixelConfigIs32Bit(GrPixelConfig config)354 static inline bool GrPixelConfigIs32Bit(GrPixelConfig config) {
355     switch (config) {
356         case kRGBA_8888_PM_GrPixelConfig:
357         case kRGBA_8888_UPM_GrPixelConfig:
358         case kBGRA_8888_PM_GrPixelConfig:
359         case kBGRA_8888_UPM_GrPixelConfig:
360             return true;
361         default:
362             return false;
363     }
364 }
365 
366 // Takes a config and returns the equivalent config with the R and B order
367 // swapped if such a config exists. Otherwise, kUnknown_GrPixelConfig
GrPixelConfigSwapRAndB(GrPixelConfig config)368 static inline GrPixelConfig GrPixelConfigSwapRAndB(GrPixelConfig config) {
369     switch (config) {
370         case kBGRA_8888_PM_GrPixelConfig:
371             return kRGBA_8888_PM_GrPixelConfig;
372         case kBGRA_8888_UPM_GrPixelConfig:
373             return kRGBA_8888_UPM_GrPixelConfig;
374         case kRGBA_8888_PM_GrPixelConfig:
375             return kBGRA_8888_PM_GrPixelConfig;
376         case kRGBA_8888_UPM_GrPixelConfig:
377             return kBGRA_8888_UPM_GrPixelConfig;
378         default:
379             return kUnknown_GrPixelConfig;
380     }
381 }
382 
GrBytesPerPixel(GrPixelConfig config)383 static inline size_t GrBytesPerPixel(GrPixelConfig config) {
384     switch (config) {
385         case kAlpha_8_GrPixelConfig:
386         case kIndex_8_GrPixelConfig:
387             return 1;
388         case kRGB_565_GrPixelConfig:
389         case kRGBA_4444_GrPixelConfig:
390             return 2;
391         case kRGBA_8888_PM_GrPixelConfig:
392         case kRGBA_8888_UPM_GrPixelConfig:
393         case kBGRA_8888_PM_GrPixelConfig:
394         case kBGRA_8888_UPM_GrPixelConfig:
395             return 4;
396         default:
397             return 0;
398     }
399 }
400 
GrPixelConfigIsOpaque(GrPixelConfig config)401 static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
402     switch (config) {
403         case kRGB_565_GrPixelConfig:
404             return true;
405         default:
406             return false;
407     }
408 }
409 
410 /**
411  * Premultiplied alpha is the usual for skia. Therefore, configs that are
412  * ambiguous (alpha-only or color-only) are considered premultiplied.
413  */
GrPixelConfigIsUnpremultiplied(GrPixelConfig config)414 static inline bool GrPixelConfigIsUnpremultiplied(GrPixelConfig config) {
415     switch (config) {
416         case kRGBA_8888_UPM_GrPixelConfig:
417         case kBGRA_8888_UPM_GrPixelConfig:
418             return true;
419         default:
420             return false;
421     }
422 }
423 
GrPixelConfigIsAlphaOnly(GrPixelConfig config)424 static inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
425     switch (config) {
426         case kAlpha_8_GrPixelConfig:
427             return true;
428         default:
429             return false;
430     }
431 }
432 
433 /**
434  * DEPRECATED: This will be removed as soon as WebKit no longer references
435  * this (former) enum value.
436  */
437 static const int kNone_GrAALevel = 0;
438 
439 /**
440  * Optional bitfield flags that can be passed to createTexture.
441  */
442 enum GrTextureFlags {
443     kNone_GrTextureFlags            = 0x0,
444     /**
445      * Creates a texture that can be rendered to as a GrRenderTarget. Use
446      * GrTexture::asRenderTarget() to access.
447      */
448     kRenderTarget_GrTextureFlagBit  = 0x1,
449     /**
450      * By default all render targets have an associated stencil buffer that
451      * may be required for path filling. This flag overrides stencil buffer
452      * creation.
453      * MAKE THIS PRIVATE?
454      */
455     kNoStencil_GrTextureFlagBit     = 0x2,
456     /**
457      * Hint that the CPU may modify this texture after creation.
458      */
459     kDynamicUpdate_GrTextureFlagBit = 0x4,
460 };
461 
462 GR_MAKE_BITFIELD_OPS(GrTextureFlags)
463 
464 enum {
465    /**
466     *  For Index8 pixel config, the colortable must be 256 entries
467     */
468     kGrColorTableSize = 256 * 4 //sizeof(GrColor)
469 };
470 
471 /**
472  * Describes a texture to be created.
473  */
474 struct GrTextureDesc {
475     GrTextureFlags         fFlags;  //!< bitfield of TextureFlags
476     int                    fWidth;  //!< Width of the texture
477     int                    fHeight; //!< Height of the texture
478 
479     /**
480      * Format of source data of the texture. Not guaraunteed to be the same as
481      * internal format used by 3D API.
482      */
483     GrPixelConfig          fConfig;
484 
485     /**
486      * The number of samples per pixel or 0 to disable full scene AA. This only
487      * applies if the kRenderTarget_GrTextureFlagBit is set. The actual number
488      * of samples may not exactly match the request. The request will be rounded
489      * up to the next supported sample count, or down if it is larger than the
490      * max supportex count.
491      */
492     union {
493         /**
494          * This field has two names for legacy reasons. Use the fSampleCnt name.
495          * fAALevel is deprecated and will be removed as soon as WebKit no
496          * longer uses it.
497          */
498         int fSampleCnt;
499         int fAALevel;
500     };
501 };
502 
503 /**
504  * Set Operations used to construct clips.
505  */
506 enum GrSetOp {
507     kReplace_SetOp,
508     kIntersect_SetOp,
509     kUnion_SetOp,
510     kXor_SetOp,
511     kDifference_SetOp,
512     kReverseDifference_SetOp,
513 };
514 
515 /**
516  * Clips are composed from these objects.
517  */
518 enum GrClipType {
519     kRect_ClipType,
520     kPath_ClipType
521 };
522 
523 /**
524  * Commands used to describe a path. Each command
525  * is accompanied by some number of points.
526  */
527 enum GrPathCmd {
528     kMove_PathCmd,      //!< Starts a new subpath at
529                         //   at the returned point
530                         // 1 point
531     kLine_PathCmd,      //!< Adds a line segment
532                         // 2 points
533     kQuadratic_PathCmd, //!< Adds a quadratic segment
534                         // 3 points
535     kCubic_PathCmd,     //!< Adds a cubic segment
536                         // 4 points
537     kClose_PathCmd,     //!< Closes the current subpath
538                         //   by connecting a line to the
539                         //   starting point.
540                         // 0 points
541     kEnd_PathCmd        //!< Indicates the end of the last subpath
542                         //   when iterating
543                         // 0 points.
544 };
545 
546 /**
547  * Gets the number of points associated with a path command.
548  */
NumPathCmdPoints(GrPathCmd cmd)549 static int inline NumPathCmdPoints(GrPathCmd cmd) {
550     static const int gNumPoints[] = {
551         1, 2, 3, 4, 0, 0
552     };
553     return gNumPoints[cmd];
554 }
555 
556 /**
557  * Path filling rules
558  */
559 enum GrPathFill {
560     kWinding_PathFill,
561     kEvenOdd_PathFill,
562     kInverseWinding_PathFill,
563     kInverseEvenOdd_PathFill,
564     kHairLine_PathFill,
565 
566     kPathFillCount
567 };
568 
GrNonInvertedFill(GrPathFill fill)569 static inline GrPathFill GrNonInvertedFill(GrPathFill fill) {
570     static const GrPathFill gNonInvertedFills[] = {
571         kWinding_PathFill, // kWinding_PathFill
572         kEvenOdd_PathFill, // kEvenOdd_PathFill
573         kWinding_PathFill, // kInverseWinding_PathFill
574         kEvenOdd_PathFill, // kInverseEvenOdd_PathFill
575         kHairLine_PathFill,// kHairLine_PathFill
576     };
577     GR_STATIC_ASSERT(0 == kWinding_PathFill);
578     GR_STATIC_ASSERT(1 == kEvenOdd_PathFill);
579     GR_STATIC_ASSERT(2 == kInverseWinding_PathFill);
580     GR_STATIC_ASSERT(3 == kInverseEvenOdd_PathFill);
581     GR_STATIC_ASSERT(4 == kHairLine_PathFill);
582     GR_STATIC_ASSERT(5 == kPathFillCount);
583     return gNonInvertedFills[fill];
584 }
585 
GrIsFillInverted(GrPathFill fill)586 static inline bool GrIsFillInverted(GrPathFill fill) {
587     static const bool gIsFillInverted[] = {
588         false, // kWinding_PathFill
589         false, // kEvenOdd_PathFill
590         true,  // kInverseWinding_PathFill
591         true,  // kInverseEvenOdd_PathFill
592         false, // kHairLine_PathFill
593     };
594     GR_STATIC_ASSERT(0 == kWinding_PathFill);
595     GR_STATIC_ASSERT(1 == kEvenOdd_PathFill);
596     GR_STATIC_ASSERT(2 == kInverseWinding_PathFill);
597     GR_STATIC_ASSERT(3 == kInverseEvenOdd_PathFill);
598     GR_STATIC_ASSERT(4 == kHairLine_PathFill);
599     GR_STATIC_ASSERT(5 == kPathFillCount);
600     return gIsFillInverted[fill];
601 }
602 
603 ///////////////////////////////////////////////////////////////////////////////
604 
605 // opaque type for 3D API object handles
606 typedef intptr_t GrPlatform3DObject;
607 
608 /**
609  * Gr can wrap an existing texture created by the client with a GrTexture
610  * object. The client is responsible for ensuring that the texture lives at
611  * least as long as the GrTexture object wrapping it. We require the client to
612  * explicitly provide information about the texture, such as width, height,
613  * and pixel config, rather than querying the 3D APIfor these values. We expect
614  * these to be immutable even if the 3D API doesn't require this (OpenGL).
615  *
616  * Textures that are also render targets are supported as well. Gr will manage
617  * any ancillary 3D API (stencil buffer, FBO id, etc) objects necessary for
618  * Gr to draw into the render target. To access the render target object
619  * call GrTexture::asRenderTarget().
620  *
621  * If in addition to the render target flag, the caller also specifies a sample
622  * count Gr will create an MSAA buffer that resolves into the texture. Gr auto-
623  * resolves when it reads from the texture. The client can explictly resolve
624  * using the GrRenderTarget interface.
625  */
626 
627 enum GrPlatformTextureFlags {
628     /**
629      * No flags enabled
630      */
631     kNone_GrPlatformTextureFlag              = 0x0,
632     /**
633      * Indicates that the texture is also a render target, and thus should have
634      * a GrRenderTarget object.
635      *
636      * D3D (future): client must have created the texture with flags that allow
637      * it to be used as a render target.
638      */
639     kRenderTarget_GrPlatformTextureFlag      = 0x1,
640 };
641 GR_MAKE_BITFIELD_OPS(GrPlatformTextureFlags)
642 
643 struct GrPlatformTextureDesc {
GrPlatformTextureDescGrPlatformTextureDesc644     GrPlatformTextureDesc() { memset(this, 0, sizeof(*this)); }
645     GrPlatformTextureFlags          fFlags;
646     int                             fWidth;         //<! width in pixels
647     int                             fHeight;        //<! height in pixels
648     GrPixelConfig                   fConfig;        //<! color format
649     /**
650      * If the render target flag is set and sample count is greater than 0
651      * then Gr will create an MSAA buffer that resolves to the texture.
652      */
653     int                             fSampleCnt;
654     /**
655      * Handle to the 3D API object.
656      * OpenGL: Texture ID.
657      */
658     GrPlatform3DObject              fTextureHandle;
659 };
660 
661 ///////////////////////////////////////////////////////////////////////////////
662 
663 /**
664  * Gr can wrap an existing render target created by the client in the 3D API
665  * with a GrRenderTarget object. The client is responsible for ensuring that the
666  * underlying 3D API object lives at least as long as the GrRenderTarget object
667  * wrapping it. We require the client to explicitly provide information about
668  * the target, such as width, height, and pixel config rather than querying the
669  * 3D API for these values. We expect these properties to be immutable even if
670  * the 3D API doesn't require this (OpenGL).
671  */
672 
673 struct GrPlatformRenderTargetDesc {
GrPlatformRenderTargetDescGrPlatformRenderTargetDesc674     GrPlatformRenderTargetDesc() { memset(this, 0, sizeof(*this)); }
675     int                             fWidth;         //<! width in pixels
676     int                             fHeight;        //<! height in pixels
677     GrPixelConfig                   fConfig;        //<! color format
678     /**
679      * The number of samples per pixel. Gr uses this to influence decisions
680      * about applying other forms of antialiasing.
681      */
682     int                             fSampleCnt;
683     /**
684      * Number of bits of stencil per-pixel.
685      */
686     int                             fStencilBits;
687     /**
688      * Handle to the 3D API object.
689      * OpenGL: FBO ID
690      */
691     GrPlatform3DObject              fRenderTargetHandle;
692 };
693 
694 
695 ///////////////////////////////////////////////////////////////////////////////
696 
697 // this is included only to make it easy to use this debugging facility
698 #include "GrInstanceCounter.h"
699 
700 #endif
701