105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrTypes_DEFINED
1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrTypes_DEFINED
1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkTypes.h"
1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrConfig.h"
1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger////////////////////////////////////////////////////////////////////////////////
1835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
1935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
2035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Defines overloaded bitwise operators to make it easier to use an enum as a
2135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * bitfield.
2235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
2335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger#define GR_MAKE_BITFIELD_OPS(X) \
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    inline X operator | (X a, X b) { \
2535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a | +b); \
2635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
2735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    \
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    inline X operator & (X a, X b) { \
2935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a & +b); \
3035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
3135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    template <typename T> \
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    inline X operator & (T a, X b) { \
3335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a & +b); \
3435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
3535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    template <typename T> \
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    inline X operator & (X a, T b) { \
3735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger        return (X) (+a & +b); \
3835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    } \
3935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GR_DECL_BITFIELD_OPS_FRIENDS(X) \
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend X operator | (X a, X b); \
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    \
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend X operator & (X a, X b); \
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    \
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    template <typename T> \
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend X operator & (T a, X b); \
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    \
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    template <typename T> \
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    friend X operator & (X a, T b); \
5035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger////////////////////////////////////////////////////////////////////////////////
5135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
5235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Macro to round n up to the next multiple of 4, or return it unchanged if
5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  n is already a multiple of 4
5605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define GrALIGN4(n)     SkAlign4(n)
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define GrIsALIGN4(n)   SkIsAlign4(n)
5905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertemplate <typename T> const T& GrMin(const T& a, const T& b) {
6105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger	return (a < b) ? a : b;
6205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
6305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertemplate <typename T> const T& GrMax(const T& a, const T& b) {
6505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger	return (b < a) ? a : b;
6605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
6705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// compile time versions of min/max
6905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GR_CT_MAX(a, b) (((b) < (a)) ? (a) : (b))
7005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GR_CT_MIN(a, b) (((b) < (a)) ? (b) : (a))
7105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
7205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
7305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  divide, rounding up
7405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline int32_t GrIDivRoundUp(int x, int y) {
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(y > 0);
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return (x + (y-1)) / y;
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
7905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIDivRoundUp(uint32_t x, uint32_t y) {
8005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x + (y-1)) / y;
8105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
8205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline size_t GrSizeDivRoundUp(size_t x, uint32_t y) {
8305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x + (y-1)) / y;
8405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
8505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
8605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
8705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  align up
8805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
8905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIAlignUp(uint32_t x, uint32_t alignment) {
9005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return GrUIDivRoundUp(x, alignment) * alignment;
9105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
9205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrSizeAlignUp(size_t x, uint32_t alignment) {
9305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return GrSizeDivRoundUp(x, alignment) * alignment;
9405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
9505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
9605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
9705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * amount of pad needed to align up
9805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
9905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIAlignUpPad(uint32_t x, uint32_t alignment) {
10005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (alignment - x % alignment) % alignment;
10105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
10205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline size_t GrSizeAlignUpPad(size_t x, uint32_t alignment) {
10305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (alignment - x % alignment) % alignment;
10405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
10505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
10605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
10705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  align down
10805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
10905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrUIAlignDown(uint32_t x, uint32_t alignment) {
11005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x / alignment) * alignment;
11105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
11205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrSizeAlignDown(size_t x, uint32_t alignment) {
11305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (x / alignment) * alignment;
11405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
11505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
11605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
11705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Count elements in an array
11805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
1190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define GR_ARRAY_COUNT(array)  SK_ARRAY_COUNT(array)
12005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//!< allocate a block of memory, will never return NULL
12205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern void* GrMalloc(size_t bytes);
12305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger//!< free block allocated by GrMalloc. ptr may be NULL
12505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern void GrFree(void* ptr);
12605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
12705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline void Gr_bzero(void* dst, size_t size) {
12805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    memset(dst, 0, size);
12905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
13005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
13205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
13405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Return the number of leading zeros in n
13505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
13605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerextern int Gr_clz(uint32_t n);
13705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
13805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
13905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Return true if n is a power of 2
14005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
14105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline bool GrIsPow2(unsigned n) {
14205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return n && 0 == (n & (n - 1));
14305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
14405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
14505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
14605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  Return the next power of 2 >= n.
14705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
14805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline uint32_t GrNextPow2(uint32_t n) {
14905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return n ? (1 << (32 - Gr_clz(n - 1))) : 1;
15005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
15105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline int GrNextPow2(int n) {
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert(n >= 0); // this impl only works for non-neg.
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return n ? (1 << (32 - Gr_clz(n - 1))) : 1;
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
15705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
15805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
15905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
16005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger *  16.16 fixed point type
16105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
16205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergertypedef int32_t GrFixed;
16305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#if GR_DEBUG
16505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
16605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic inline int16_t GrToS16(intptr_t x) {
16705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GrAssert((int16_t)x == x);
16805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return (int16_t)x;
16905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
17005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#else
17205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrToS16(x)  x
17405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
17605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
17735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
17805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
17905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
18005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
18135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Possible 3D APIs that may be used by Ganesh.
18205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
18335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum GrEngine {
18435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kOpenGL_Shaders_GrEngine,
18535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kOpenGL_Fixed_GrEngine,
18687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
18787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
18835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
18935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Engine-specific 3D context handle
1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *      GrGLInterface* for OpenGL. If NULL will use the default GL interface.
19135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
19235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergertypedef intptr_t GrPlatform3DContext;
19335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
19487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
19587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
19605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
19705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Type used to describe format of vertices in arrays
19805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Values are defined in GrDrawTarget
19905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
20035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergertypedef int GrVertexLayout;
20105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
20205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
20305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger* Geometric primitives used for drawing.
20405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger*/
20505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrPrimitiveType {
20605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kTriangles_PrimitiveType,
20705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kTriangleStrip_PrimitiveType,
20805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kTriangleFan_PrimitiveType,
20905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kPoints_PrimitiveType,
2101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kLines_PrimitiveType,     // 1 pix wide only
2111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kLineStrip_PrimitiveType  // 1 pix wide only
21205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
21305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
21487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrIsPrimTypeLines(GrPrimitiveType type) {
21587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return kLines_PrimitiveType == type || kLineStrip_PrimitiveType == type;
21687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
21787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
21887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrIsPrimTypeTris(GrPrimitiveType type) {
21987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return kTriangles_PrimitiveType == type     ||
22087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger           kTriangleStrip_PrimitiveType == type ||
22187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger           kTriangleFan_PrimitiveType == type;
22287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
22387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
22405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
22505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Coeffecients for alpha-blending.
22605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
22705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrBlendCoeff {
22805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kZero_BlendCoeff,    //<! 0
22905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kOne_BlendCoeff,     //<! 1
23005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kSC_BlendCoeff,      //<! src color
23105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kISC_BlendCoeff,     //<! one minus src color
23205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDC_BlendCoeff,      //<! dst color
23305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kIDC_BlendCoeff,     //<! one minus dst color
23405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kSA_BlendCoeff,      //<! src alpha
23505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kISA_BlendCoeff,     //<! one minus src alpha
23605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDA_BlendCoeff,      //<! dst alpha
23705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kIDA_BlendCoeff,     //<! one minus dst alpha
238137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kConstC_BlendCoeff,  //<! constant color
239137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kIConstC_BlendCoeff, //<! one minus constant color
240137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kConstA_BlendCoeff,  //<! constant color alpha
241137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger    kIConstA_BlendCoeff, //<! one minus constant color alpha
242137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
2430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    kPublicBlendCoeffCount
244137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger};
245137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
246137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger/**
247137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger *  Formats for masks, used by the font cache.
248137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger *  Important that these are 0-based.
249137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger */
250137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerenum GrMaskFormat {
2511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kA8_GrMaskFormat,    //!< 1-byte per pixel
2521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kA565_GrMaskFormat,  //!< 2-bytes per pixel
2531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kA888_GrMaskFormat,  //!< 4-bytes per pixel
2541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
2551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kCount_GrMaskFormats //!< used to allocate arrays sized for mask formats
25605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
257137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger
258137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger/**
259137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger *  Return the number of bytes-per-pixel for the specified mask format.
260137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger */
261137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerstatic inline int GrMaskFormatBytesPerPixel(GrMaskFormat format) {
2621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrAssert((unsigned)format <= 2);
2631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // kA8   (0) -> 1
2641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // kA565 (1) -> 2
2651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // kA888 (2) -> 4
2661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    return 1 << (int)format;
267137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenberger}
26805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
26905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
27087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger * Pixel configurations.
2711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
2721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Unpremultiplied configs are intended for converting pixel data in and out
2731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * from skia. Surfaces with these configs have limited support. As an input
2741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * (GrPaint texture) the corresponding GrSamplerState must have its filter set
2751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * to kNearest_Filter. Otherwise, the draw will fail. When the render target
2761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * has an unpremultiplied config draws must use blend coeffs 1,0 (AKA src-mode).
2771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Other coeffs will cause the draw to fail.
27887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger */
27987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerenum GrPixelConfig {
28087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kUnknown_GrPixelConfig,
28187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kAlpha_8_GrPixelConfig,
28287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kIndex_8_GrPixelConfig,
28387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    kRGB_565_GrPixelConfig,
2841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Premultiplied
2861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kRGBA_4444_GrPixelConfig,
2881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Premultiplied. Byte order is r,g,b,a
2901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kRGBA_8888_PM_GrPixelConfig,
2921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Unpremultiplied. Byte order is r,g,b,a
2941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kRGBA_8888_UPM_GrPixelConfig,
2961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
2971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Premultiplied. Byte order is b,g,r,a
2981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
2991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kBGRA_8888_PM_GrPixelConfig,
3001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
3011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Unpremultiplied. Byte order is b,g,r,a
3021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
3031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kBGRA_8888_UPM_GrPixelConfig,
3044f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
3054f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    kGrPixelConfigCount
30687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
30787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Aliases for pixel configs that match skia's byte order
3091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef SK_CPU_LENDIAN
3101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #error "Skia gpu currently assumes little endian"
3111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
3121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#if 24 == SK_A32_SHIFT && 16 == SK_R32_SHIFT && \
3131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     8 == SK_G32_SHIFT &&  0 == SK_B32_SHIFT
3141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrPixelConfig kSkia8888_PM_GrPixelConfig = kBGRA_8888_PM_GrPixelConfig;
3151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrPixelConfig kSkia8888_UPM_GrPixelConfig = kBGRA_8888_UPM_GrPixelConfig;
3161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#elif 24 == SK_A32_SHIFT && 16 == SK_B32_SHIFT && \
3171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger       8 == SK_G32_SHIFT &&  0 == SK_R32_SHIFT
3181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrPixelConfig kSkia8888_PM_GrPixelConfig = kRGBA_8888_PM_GrPixelConfig;
3191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static const GrPixelConfig kSkia8888_UPM_GrPixelConfig = kRGBA_8888_UPM_GrPixelConfig;
3201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else
3211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #error "SK_*32_SHIFT values must correspond to GL_BGRA or GL_RGBA format."
3221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
3231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// WebKit is relying on this old name for the native skia PM config. This will
3251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// be deleted ASAP because it is so similar to kRGBA_PM_8888_GrPixelConfig but
3261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// has a different interpretation when skia is compiled BGRA.
3271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const GrPixelConfig kRGBA_8888_GrPixelConfig = kSkia8888_PM_GrPixelConfig;
3281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Returns true if the pixel config has 8bit r,g,b,a components in that byte
3301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// order
3311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline bool GrPixelConfigIsRGBA8888(GrPixelConfig config) {
3321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (config) {
3331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_PM_GrPixelConfig:
3341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_UPM_GrPixelConfig:
3351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
3361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
3381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Returns true if the pixel config has 8bit b,g,r,a components in that byte
3421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// order
3431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline bool GrPixelConfigIsBGRA8888(GrPixelConfig config) {
3441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (config) {
3451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_PM_GrPixelConfig:
3461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_UPM_GrPixelConfig:
3471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
3481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
3501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Returns true if the pixel config is 32 bits per pixel
3541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline bool GrPixelConfigIs32Bit(GrPixelConfig config) {
3551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (config) {
3561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_PM_GrPixelConfig:
3571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_UPM_GrPixelConfig:
3581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_PM_GrPixelConfig:
3591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_UPM_GrPixelConfig:
3601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
3611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
3631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
3661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Takes a config and returns the equivalent config with the R and B order
3671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// swapped if such a config exists. Otherwise, kUnknown_GrPixelConfig
3681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline GrPixelConfig GrPixelConfigSwapRAndB(GrPixelConfig config) {
3691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (config) {
3701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_PM_GrPixelConfig:
3711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kRGBA_8888_PM_GrPixelConfig;
3721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_UPM_GrPixelConfig:
3731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kRGBA_8888_UPM_GrPixelConfig;
3741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_PM_GrPixelConfig:
3751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kBGRA_8888_PM_GrPixelConfig;
3761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_UPM_GrPixelConfig:
3771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kBGRA_8888_UPM_GrPixelConfig;
3781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
3791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return kUnknown_GrPixelConfig;
3801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
3811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
3821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
38387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline size_t GrBytesPerPixel(GrPixelConfig config) {
38487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (config) {
38587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kAlpha_8_GrPixelConfig:
38687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kIndex_8_GrPixelConfig:
38787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 1;
38887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGB_565_GrPixelConfig:
38987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGBA_4444_GrPixelConfig:
39087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 2;
3911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_PM_GrPixelConfig:
3921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_UPM_GrPixelConfig:
3931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_PM_GrPixelConfig:
3941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_UPM_GrPixelConfig:
39587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 4;
39687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default:
39787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return 0;
39887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
39987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
40087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
40187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
40287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (config) {
40387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kRGB_565_GrPixelConfig:
4041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return true;
4051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        default:
4061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            return false;
4071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
4081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
4091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
4101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/**
4111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Premultiplied alpha is the usual for skia. Therefore, configs that are
4121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * ambiguous (alpha-only or color-only) are considered premultiplied.
4131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
4141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline bool GrPixelConfigIsUnpremultiplied(GrPixelConfig config) {
4151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    switch (config) {
4161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kRGBA_8888_UPM_GrPixelConfig:
4171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        case kBGRA_8888_UPM_GrPixelConfig:
41887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return true;
41987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default:
42087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return false;
42187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
42287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
42387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
42487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic inline bool GrPixelConfigIsAlphaOnly(GrPixelConfig config) {
42587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    switch (config) {
42687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        case kAlpha_8_GrPixelConfig:
42787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return true;
42887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        default:
42987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            return false;
43087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
43187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
43287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
43387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger/**
4344f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * DEPRECATED: This will be removed as soon as WebKit no longer references
4354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger * this (former) enum value.
4364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger */
4374f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenbergerstatic const int kNone_GrAALevel = 0;
43835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
43935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
44035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Optional bitfield flags that can be passed to createTexture.
44135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
44235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum GrTextureFlags {
44335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kNone_GrTextureFlags            = 0x0,
44435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
44535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Creates a texture that can be rendered to as a GrRenderTarget. Use
44635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * GrTexture::asRenderTarget() to access.
44735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
44835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kRenderTarget_GrTextureFlagBit  = 0x1,
44935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
45035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * By default all render targets have an associated stencil buffer that
45135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * may be required for path filling. This flag overrides stencil buffer
45235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * creation.
45335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * MAKE THIS PRIVATE?
45435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
45535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kNoStencil_GrTextureFlagBit     = 0x2,
45635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
45735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Hint that the CPU may modify this texture after creation.
45835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
45935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kDynamicUpdate_GrTextureFlagBit = 0x4,
46035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
46135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
46235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek SollenbergerGR_MAKE_BITFIELD_OPS(GrTextureFlags)
46335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
46435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerenum {
46535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger   /**
46635e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    *  For Index8 pixel config, the colortable must be 256 entries
46735e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    */
46835e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    kGrColorTableSize = 256 * 4 //sizeof(GrColor)
46935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
47035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
47135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
47235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger * Describes a texture to be created.
47335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger */
47435e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenbergerstruct GrTextureDesc {
47535e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    GrTextureFlags         fFlags;  //!< bitfield of TextureFlags
4761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                    fWidth;  //!< Width of the texture
4771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                    fHeight; //!< Height of the texture
4784f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
47935e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger    /**
48035e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * Format of source data of the texture. Not guaraunteed to be the same as
48135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     * internal format used by 3D API.
48235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger     */
4831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPixelConfig          fConfig;
4844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
4854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    /**
4864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * The number of samples per pixel or 0 to disable full scene AA. This only
4874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * applies if the kRenderTarget_GrTextureFlagBit is set. The actual number
4884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * of samples may not exactly match the request. The request will be rounded
4894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * up to the next supported sample count, or down if it is larger than the
4904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     * max supportex count.
4914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     */
4924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    union {
4934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        /**
4944f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         * This field has two names for legacy reasons. Use the fSampleCnt name.
4954f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         * fAALevel is deprecated and will be removed as soon as WebKit no
4964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         * longer uses it.
4974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger         */
4984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        int fSampleCnt;
4994f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger        int fAALevel;
5004f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    };
50135e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger};
50235e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger
50335e2e62b55598210f6999fc2ea26ff8f41446ffeDerek Sollenberger/**
50405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Set Operations used to construct clips.
50505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
50605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrSetOp {
50705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kReplace_SetOp,
50805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kIntersect_SetOp,
50905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kUnion_SetOp,
51005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kXor_SetOp,
51105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kDifference_SetOp,
51205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kReverseDifference_SetOp,
51305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
51405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
51505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
51605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Clips are composed from these objects.
51705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
51805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrClipType {
51905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kRect_ClipType,
52005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kPath_ClipType
52105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
52205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
52305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
52405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Commands used to describe a path. Each command
52505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * is accompanied by some number of points.
52605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
52705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrPathCmd {
52805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kMove_PathCmd,      //!< Starts a new subpath at
52905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   at the returned point
53005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 1 point
53105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kLine_PathCmd,      //!< Adds a line segment
53205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 2 points
53305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kQuadratic_PathCmd, //!< Adds a quadratic segment
53405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 3 points
53505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kCubic_PathCmd,     //!< Adds a cubic segment
53605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 4 points
53705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kClose_PathCmd,     //!< Closes the current subpath
53805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   by connecting a line to the
53905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   starting point.
54005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 0 points
54105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kEnd_PathCmd        //!< Indicates the end of the last subpath
54205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        //   when iterating
54305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger                        // 0 points.
54405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
54505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
54605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
54705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Gets the number of points associated with a path command.
54805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
54905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerstatic int inline NumPathCmdPoints(GrPathCmd cmd) {
55005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static const int gNumPoints[] = {
55105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        1, 2, 3, 4, 0, 0
55205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
55305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gNumPoints[cmd];
55405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
55505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
55605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger/**
55705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Path filling rules
55805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */
55905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerenum GrPathFill {
56005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kWinding_PathFill,
56105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kEvenOdd_PathFill,
56205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kInverseWinding_PathFill,
56305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kInverseEvenOdd_PathFill,
56405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kHairLine_PathFill,
56505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
56605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    kPathFillCount
56705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger};
56805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline GrPathFill GrNonInvertedFill(GrPathFill fill) {
57005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static const GrPathFill gNonInvertedFills[] = {
57105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kWinding_PathFill, // kWinding_PathFill
57205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kEvenOdd_PathFill, // kEvenOdd_PathFill
57305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kWinding_PathFill, // kInverseWinding_PathFill
57405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kEvenOdd_PathFill, // kInverseEvenOdd_PathFill
57505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        kHairLine_PathFill,// kHairLine_PathFill
57605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
57705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(0 == kWinding_PathFill);
57805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(1 == kEvenOdd_PathFill);
57905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(2 == kInverseWinding_PathFill);
58005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(3 == kInverseEvenOdd_PathFill);
58105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(4 == kHairLine_PathFill);
58205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(5 == kPathFillCount);
58305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gNonInvertedFills[fill];
58405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
58505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
5861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic inline bool GrIsFillInverted(GrPathFill fill) {
58705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    static const bool gIsFillInverted[] = {
58805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        false, // kWinding_PathFill
58905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        false, // kEvenOdd_PathFill
59005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        true,  // kInverseWinding_PathFill
59105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        true,  // kInverseEvenOdd_PathFill
59205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        false, // kHairLine_PathFill
59305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    };
59405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(0 == kWinding_PathFill);
59505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(1 == kEvenOdd_PathFill);
59605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(2 == kInverseWinding_PathFill);
59705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(3 == kInverseEvenOdd_PathFill);
59805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(4 == kHairLine_PathFill);
59905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    GR_STATIC_ASSERT(5 == kPathFillCount);
60005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    return gIsFillInverted[fill];
60105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}
60205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
60305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
60405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
6051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// opaque type for 3D API object handles
6061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergertypedef intptr_t GrPlatform3DObject;
6071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/**
6091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Gr can wrap an existing texture created by the client with a GrTexture
6101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * object. The client is responsible for ensuring that the texture lives at
6111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * least as long as the GrTexture object wrapping it. We require the client to
6121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * explicitly provide information about the texture, such as width, height,
6131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * and pixel config, rather than querying the 3D APIfor these values. We expect
6141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * these to be immutable even if the 3D API doesn't require this (OpenGL).
6151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
6161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Textures that are also render targets are supported as well. Gr will manage
6171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * any ancillary 3D API (stencil buffer, FBO id, etc) objects necessary for
6181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Gr to draw into the render target. To access the render target object
6191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * call GrTexture::asRenderTarget().
6201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
6211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * If in addition to the render target flag, the caller also specifies a sample
6221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * count Gr will create an MSAA buffer that resolves into the texture. Gr auto-
6231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * resolves when it reads from the texture. The client can explictly resolve
6241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * using the GrRenderTarget interface.
6251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
6261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerenum GrPlatformTextureFlags {
6281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * No flags enabled
6301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kNone_GrPlatformTextureFlag              = 0x0,
6321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Indicates that the texture is also a render target, and thus should have
6341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * a GrRenderTarget object.
6351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
6361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * D3D (future): client must have created the texture with flags that allow
6371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * it to be used as a render target.
6381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    kRenderTarget_GrPlatformTextureFlag      = 0x1,
6401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
6411cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerGR_MAKE_BITFIELD_OPS(GrPlatformTextureFlags)
6421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstruct GrPlatformTextureDesc {
6441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPlatformTextureDesc() { memset(this, 0, sizeof(*this)); }
6451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPlatformTextureFlags          fFlags;
6461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fWidth;         //<! width in pixels
6471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fHeight;        //<! height in pixels
6481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPixelConfig                   fConfig;        //<! color format
6491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * If the render target flag is set and sample count is greater than 0
6511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * then Gr will create an MSAA buffer that resolves to the texture.
6521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fSampleCnt;
6541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Handle to the 3D API object.
6561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * OpenGL: Texture ID.
6571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPlatform3DObject              fTextureHandle;
6591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
6601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
6621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/**
6641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Gr can wrap an existing render target created by the client in the 3D API
6651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * with a GrRenderTarget object. The client is responsible for ensuring that the
6661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * underlying 3D API object lives at least as long as the GrRenderTarget object
6671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * wrapping it. We require the client to explicitly provide information about
6681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * the target, such as width, height, and pixel config rather than querying the
6691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 3D API for these values. We expect these properties to be immutable even if
6701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * the 3D API doesn't require this (OpenGL).
6711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
6721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
6731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstruct GrPlatformRenderTargetDesc {
6741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPlatformRenderTargetDesc() { memset(this, 0, sizeof(*this)); }
6751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fWidth;         //<! width in pixels
6761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fHeight;        //<! height in pixels
6771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPixelConfig                   fConfig;        //<! color format
6781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * The number of samples per pixel. Gr uses this to influence decisions
6801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * about applying other forms of antialiasing.
6811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fSampleCnt;
6831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Number of bits of stencil per-pixel.
6851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    int                             fStencilBits;
6871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
6881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * Handle to the 3D API object.
6891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * OpenGL: FBO ID
6901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
6911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GrPlatform3DObject              fRenderTargetHandle;
6921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
6931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
69487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
69587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
69687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
69705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger// this is included only to make it easy to use this debugging facility
69805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#include "GrInstanceCounter.h"
69905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
70005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif
701