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