1054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
2054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
3054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Redistribution and use in source and binary forms, with or without
4054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * modification, are permitted provided that the following conditions are
5054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * met:
6054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     * Redistributions of source code must retain the above copyright
7054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       notice, this list of conditions and the following disclaimer.
8054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     * Redistributions in binary form must reproduce the above
9054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       copyright notice, this list of conditions and the following
10054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       disclaimer in the documentation and/or other materials provided
11054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       with the distribution.
12054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *     * Neither the name of The Linux Foundation. nor the names of its
13054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       contributors may be used to endorse or promote products derived
14054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *       from this software without specific prior written permission.
15054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
16054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin *
28054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
29054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef __c2d2_h_
30054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define __c2d2_h_
31054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
32054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef __cplusplus
33054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjinextern "C" {
34054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
35054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
36054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifndef C2D_API
37054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define C2D_API /* define API export as needed */
38054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
39054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#if !defined(int32) && !defined(_INT32_DEFINED)
40054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef int                     int32;
41054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define _INT32_DEFINED
42054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
43054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#if !defined(uint32) && !defined(_UINT32_DEFINED)
44054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef unsigned int            uint32;
45054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define _UINT32_DEFINED
46054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
47054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
48054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
49054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*********************** Blit definitions *****************************/
50054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
51054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
52054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Status codes, returned by any blit function */
53054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
54054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_STATUS_OK              = 0,
55054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_STATUS_NOT_SUPPORTED   = 1,
56054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_STATUS_OUT_OF_MEMORY   = 2,
57054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_STATUS_INVALID_PARAM   = 3,
58054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_STATUS_SURFACE_IN_USE  = 4,
59054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_STATUS;
60054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
61054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
62054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Definitions of color format modes, used together with color formats */
63054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
64054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_PACK_INTO_32BIT   = (1 <<  8), /* pack into dword if set */
65054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_SWAP_ENDIANNESS   = (1 <<  9), /* swaps the order */
66054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_LINEAR_SPACE      = (1 << 10), /* linear color space */
67054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_PREMULTIPLIED     = (1 << 11), /* alpha premultiplied */
68054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_INVERT_ALPHA      = (1 << 12), /* inverts alpha */
69054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_DISABLE_ALPHA     = (1 << 13), /* disables alpha */
70054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_INTERLACED        = (1 << 14), /* YUV line-interlaced */
71054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_TRANSPARENT       = (1 << 15), /* YUV 1-bit alpha in Y */
72054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_MACROTILED        = (1 << 16), /* tiled in macro level */
73054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_TILED_4x4         = (1 << 17), /* 4x4 tiled format */
74054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_FORMAT_SWAP_RB           = (1 << 18), /* Swap R & B color components */
75054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_FORMAT_MODE;
76054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
77054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Definitions of supported RGB formats, used in C2D_RGB_SURFACE_DEF.
78054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The bits of each color channel are packed into a machine word
79054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * representing a single pixel from left to right (MSB to LSB) in the
80054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * order indicated by format name. For the sub-byte formats the pixels
81054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * are packed into bytes from left to right (MSbit to LSBit).
82054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_PACK_INTO_32BIT bit is set, the minimal
83054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * machine word used for pixel storage is 32-bit and the whole word
84054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * is reversed if endianness is swapped.
85054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_SWAP_ENDIANNESS bit is set, the order within a
86054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * minimal machine word representing a pixel
87054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * is reversed for both sub-byte and multi-byte formats.
88054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_LINEAR_SPACE bit is set, the color space of
89054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * the formats below is considered linear, if applicable.
90054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_PREMULTIPLIED bit is set, the color channels
91054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * are premultiplied with the alpha, if applicable.
92054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_INVERT_ALPHA bit is set, the alpha interpretation
93054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * is inverted: 0 - opaque, 1 - transparent, if applicable.
94054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_DISABLE_ALPHA bit is set, the alpha channel serves
95054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * as a placeholder and is ignored during blit, if applicable.
96054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_MACROTILED bit is set, the surface is in the
97054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * tiled format : 64x32 for 8bpp, 32x32 for 16bpp formats  */
98054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
99054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_1            = 0,   /* 1-bit alpha/color expansion */
100054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
101054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_2_PALETTE    = 1,   /* 2-bit indices for palette */
102054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_4_PALETTE    = 2,   /* 4-bit indices for palette */
103054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_8_PALETTE    = 3,   /* 8-bit indices for palette */
104054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
105054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_2_L          = 4,   /* 2-bit grayscale */
106054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_4_L          = 5,   /* 4-bit grayscale */
107054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_8_L          = 6,   /* 8-bit grayscale */
108054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
109054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_2_A          = 7,   /* 2-bit alpha only */
110054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_4_A          = 8,   /* 4-bit alpha only */
111054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_8_A          = 9,   /* 8-bit alpha only */
112054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
113054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_RGB      = 10,  /* 12-bit colors */
114054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_565_RGB      = 11,  /* 16-bit colors */
115054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_888_RGB      = 12,  /* 24-bit colors */
116054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
117054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_1555_ARGB    = 13,  /* 16-bit colors (1-bit alpha) */
118054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_4444_ARGB    = 14,  /* 16-bit colors (4-bit alpha) */
119054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_8565_ARGB    = 15,  /* 24-bit colors (8-bit alpha) */
120054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_8888_ARGB    = 16,  /* 32-bit colors (8-bit alpha) */
121054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
122054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_5551_RGBA    = 17,  /* 16-bit colors (1-bit alpha) */
123054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_4444_RGBA    = 18,  /* 16-bit colors (4-bit alpha) */
124054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_5658_RGBA    = 19,  /* 24-bit colors (8-bit alpha) */
125054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_8888_RGBA    = 20,  /* 32-bit colors (8-bit alpha) */
126054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
127054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* derived RGB color formats (base format + mode bits) */
128054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
129054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_RGB_FORMAT;
130054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
131054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Definitions of supported YUV formats, used in C2D_YUV_SURFACE_DEF.
132054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Each of Y,U,V channels usually takes 1 byte and therefore is
133054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * individually addressable. The definitions below show how Y,U,V
134054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * channels are packed into macropixels for each particular format.
135054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The order is from left (smaller byte addresses) to right (larger
136054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * byte addresses). The first three digits (4xx) denote the chroma
137054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * subsampling in standard YUV notation. The digits in the macropixel
138054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * denote that the whole block (from the previous digit or from the
139054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * beginning) has to be repeated the number of times. Underscores
140054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * between Y,U,V channels are used to describe separate planes for
141054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * planar YUV formats. Formats are mapped to numbers so that future
142054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * versions with various YUV permutations are easy to add.
143054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_INTERLACED bit is set, the line order is
144054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * interlaced: 0,2,4,...1,3,5... if applicable.
145054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If the C2D_FORMAT_TRANSPARENT bit is set, the least significant
146054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * bit of Y channel serves as alpha: 0 - transparent, 1 - opaque. */
147054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
148054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_YYUYYV   = 110, /* packed, 12-bit         */
149054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_YUYYVY   = 111, /* packed, 12-bit         */
150054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_UYYVYY   = 112, /* packed, 12-bit, "Y411" */
151054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_YUYV2Y4  = 116, /* packed, 12-bit         */
152054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_UYVY2Y4  = 117, /* packed, 12-bit, "Y41P" */
153054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
154054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_YUYV     = 120, /* packed, 16-bit, "YUY2" */
155054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_UYVY     = 121, /* packed, 16-bit, "UYVY" */
156054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_YVYU     = 122, /* packed, 16-bit, "YVYU" */
157054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_VYUY     = 123, /* packed, 16-bit         */
158054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
159054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_YUV      = 130, /* packed, 24-bit         */
160054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_UYV      = 131, /* packed, 24-bit, "IYU2" */
161054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_AYUV     = 136, /* packed, 24-bit, "AYUV" */
162054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
163054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_410_Y_UV     = 150, /* planar, Y + interleaved UV */
164054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y_UV     = 151, /* planar, Y + interleaved UV */
165054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_Y_UV     = 152, /* planar, Y + interleaved UV */
166054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_Y_UV     = 153, /* planar, Y + interleaved UV */
167054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_Y_UV     = 154, /* planar, Y + interleaved UV */
168054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
169054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_410_Y_VU     = 160, /* planar, Y + interleaved VU */
170054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y_VU     = 161, /* planar, Y + interleaved VU */
171054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_Y_VU     = 162, /* planar, Y + interleaved VU */
172054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_Y_VU     = 163, /* planar, Y + interleaved VU */
173054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_Y_VU     = 164, /* planar, Y + interleaved VU */
174054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
175054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_410_Y_U_V    = 170, /* planar, Y + U + V separate */
176054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y_U_V    = 171, /* planar, Y + U + V separate */
177054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_Y_V_U    = 172, /* planar, Y + V + U separate */
178054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_Y_U_V    = 173, /* planar, Y + U + V separate */
179054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_Y_U_V    = 174, /* planar, Y + U + V separate */
180054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_Y_U_V    = 175, /* planar, Y + U + V separate */
181054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
182054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_800_Y        = 190, /* planar, Y only, grayscale */
183054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
184054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    /* derived YUV color formats (base format + mode bits), FOURCC */
185054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
186054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y411     = 112,
187054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y41P     = 117,
188054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_IY41     = 117 | (1 << 14),
189054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y41T     = 117 | (1 << 15),
190054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
191054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_YUY2     = 120,
192054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_IUYV     = 121 | (1 << 14),
193054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_Y42T     = 121 | (1 << 15),
194054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_444_IYU2     = 131,
195054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
196054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_NV12     = 152,
197054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_NV21     = 162,
198054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
199054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_410_YUV9     = 170,
200054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_410_YVU9     = 170,
201054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_411_Y41B     = 171,
202054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_YV12     = 172,
203054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_IYUV     = 173,
204054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_420_I420     = 173,
205054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_YV16     = 174,
206054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_422_Y42B     = 174,
207054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
208054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_FORMAT_800_Y800     = 190,
209054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
210054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_YUV_FORMAT;
211054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
212054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
213054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Configuration bits, used in the config_mask field of C2D_OBJECT struct */
214054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
215054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SOURCE_RECT_BIT      = (1 <<  0), /* enables source_rect field */
216054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MIRROR_H_BIT         = (1 <<  1), /* enables horizontal flipping */
217054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MIRROR_V_BIT         = (1 <<  2), /* enables vertical flipping */
218054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SOURCE_TILE_BIT      = (1 <<  3), /* enables source surface tiling */
219054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_RECT_BIT      = (1 <<  4), /* enables target_rect field */
220054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ROTATE_BIT           = (1 <<  5), /* enables all rotation fields */
221054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SCISSOR_RECT_BIT     = (1 <<  6), /* enables scissor_rect field */
222054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MASK_SURFACE_BIT     = (1 <<  7), /* enables mask_surface_id field */
223054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MASK_ALIGN_BIT       = (1 <<  8), /* aligns mask to source_rect */
224054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MASK_SCALE_BIT       = (1 <<  9), /* enables mask surface scaling */
225054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MASK_TILE_BIT        = (1 << 10), /* enables mask surface tiling */
226054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_GLOBAL_ALPHA_BIT     = (1 << 11), /* enables global_alpha field */
227054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_COLOR_KEY_BIT        = (1 << 12), /* enables color_key field */
228054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_NO_PIXEL_ALPHA_BIT   = (1 << 13), /* disables source alpha channel */
229054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_NO_BILINEAR_BIT      = (1 << 14), /* disables bilinear on scaling */
230054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_NO_ANTIALIASING_BIT  = (1 << 15), /* disables antialiasing on edges */
231054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRAW_LINE_BIT        = (1 << 16), /* enables line drawing with source rectangle */
232054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRAW_LINE_NOLAST     = (1 << 17), /* disable last pixel draw for line */
233054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_SOURCE_CONFIG;
234054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
235054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
236054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Target configuration bits, defines rotation + mirroring.
237054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Mirror is applied prior to rotation if enabled. */
238054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
239054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_MIRROR_H        = (1 << 0), /* horizontal flip */
240054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_MIRROR_V        = (1 << 1), /* vertical flip */
241054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_ROTATE_0        = (0 << 2), /* no rotation */
242054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_ROTATE_90       = (1 << 2), /* 90 degree rotation */
243054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_ROTATE_180      = (2 << 2), /* 180 degree rotation */
244054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_ROTATE_270      = (3 << 2), /* 270 degree rotation, 90 + 180 */
245054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_MASK_ALIGN      = (1 << 4), /* aligns mask to target scissor */
246054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_MASK_SCALE      = (1 << 5), /* enables mask scaling */
247054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_MASK_TILE       = (1 << 6), /* enables mask tiling */
248054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_COLOR_KEY       = (1 << 7), /* enables target_color_key */
249054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET_NO_PIXEL_ALPHA  = (1 << 8), /* disables target alpha channel */
250054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_TARGET_CONFIG;
251054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
252054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define C2D_TARGET_ROTATION_MASK  (C2D_TARGET_ROTATE_90*3)
253054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
254054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Additional blend modes, can be used with both source and target configs.
255054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin   If none of the below is set, the default "SRC over DST" is applied. */
256054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
257054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_SRC_OVER   = (0  << 20), /* Default, Porter-Duff "SRC over DST" */
258054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_SRC        = (1  << 20), /* Porter-Duff "SRC" */
259054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_SRC_IN     = (2  << 20), /* Porter-Duff "SRC in DST" */
260054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_DST_IN     = (3  << 20), /* Porter-Duff "DST in SRC" */
261054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_SRC_OUT    = (4  << 20), /* Porter-Duff "SRC out DST" */
262054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_DST_OUT    = (5  << 20), /* Porter-Duff "DST out SRC" */
263054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_DST_OVER   = (6  << 20), /* Porter-Duff "DST over SRC" */
264054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_SRC_ATOP   = (7  << 20), /* Porter-Duff "SRC ATOP" */
265054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_DST_ATOP   = (8  << 20), /* Porter-Duff "DST ATOP" */
266054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_XOR        = (9  << 20), /* Xor */
267054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_MULTIPLY   = (10 << 20), /* OpenVG "MULTIPLY" */
268054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_SCREEN     = (11 << 20), /* OpenVG "SCREEN" */
269054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_DARKEN     = (12 << 20), /* OpenVG "DARKEN" */
270054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_LIGHTEN    = (13 << 20), /* OpenVG "LIGHTEN" */
271054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_ADDITIVE   = (14 << 20), /* OpenVG "ADDITIVE" */
272054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_DIRECT     = (15 << 20), /* Direct alpha blitting */
273054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_INVERTC    = (16 << 20), /* Invert color */
274054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_ALPHA_BLEND_NONE       = (1  << 25), /* disables alpha blending */
275054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_ALPHA_BLEND_MODE;
276054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
277054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Configuration bits, used in the config_mask field of C2D_OBJECT struct */
278054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
279054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_OVERRIDE_GLOBAL_TARGET_ROTATE_CONFIG = (1 << 27), /* Overrides TARGET Config */
280054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_OVERRIDE_TARGET_ROTATE_0             = (0 << 28), /* no rotation             */
281054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_OVERRIDE_TARGET_ROTATE_90            = (1 << 28), /* 90 degree rotation      */
282054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_OVERRIDE_TARGET_ROTATE_180           = (2 << 28), /* 180 degree rotation     */
283054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_OVERRIDE_TARGET_ROTATE_270           = (3 << 28), /* 270 degree rotation     */
284054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_SOURCE_TARGET_CONFIG;
285054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
286054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define C2D_OVERRIDE_SOURCE_CONFIG_TARGET_ROTATION_SHIFT_MASK  28
287054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#define C2D_OVERRIDE_TARGET_CONFIG_TARGET_ROTATION_SHIFT_MASK  2
288054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
289054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
290054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Surface caps enumeration */
291054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
292054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SOURCE          = (1 << 0), /* allows to use as a source */
293054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_TARGET          = (1 << 1), /* allows to use as a target */
294054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_MASK            = (1 << 2), /* allows to use as a mask */
295054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_PALETTE         = (1 << 3), /* allows to use as a palette */
296054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_SURFACE_BITS;
297054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
298054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Surface type enumeration */
299054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
300054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SURFACE_RGB_HOST        = 1, /* Host memory RGB surface */
301054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SURFACE_RGB_EXT         = 2, /* External memory RGB surface */
302054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SURFACE_YUV_HOST        = 3, /* Host memory YUV surface */
303054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SURFACE_YUV_EXT         = 4, /* External memory YUV surface */
304054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SURFACE_WITH_PHYS       = (1<<3), /* physical address already mapped */
305054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                        /* this bit is valid with HOST types */
306054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_SURFACE_WITH_PHYS_DUMMY = (1<<4), /* physical address already mapped */
307054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                        /* this bit is valid with HOST types */
308054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_SURFACE_TYPE;
309054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
310054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Structure for registering a RGB buffer as a blit surface */
311054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef struct {
312054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 format;   /* RGB color format plus additional mode bits */
313054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 width;    /* defines width in pixels */
314054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 height;   /* defines height in pixels */
315054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *buffer;   /* pointer to the RGB buffer */
316054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *phys;     /* physical address */
317054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32  stride;   /* defines stride in bytes, negative stride is allowed */
318054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_RGB_SURFACE_DEF;
319054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
320054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Structure for registering a YUV plane(s) as a blit surface */
321054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef struct {
322054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 format;   /* YUV color format plus additional mode bits */
323054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 width;    /* defines width in pixels */
324054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 height;   /* defines height in pixels */
325054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *plane0;  /* holds the whole buffer if YUV format is not planar */
326054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *phys0;   /* physical address */
327054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32  stride0; /* stride in bytes if YUV format is not planar */
328054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *plane1;  /* holds UV or VU plane for planar interleaved */
329054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *phys1;   /* physical address */
330054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32  stride1; /* stride for UV or VU plane for planar interleaved */
331054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *plane2;  /* holds the 3. plane, ignored if YUV format is not planar */
332054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    void  *phys2;    /* physical address */
333054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32  stride2; /* stride for the 3. plane, ignored if YUV format is not planar */
334054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_YUV_SURFACE_DEF;
335054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
336054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
337054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Rectangle definition */
338054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef struct {
339054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 x;        /* upper-left x */
340054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 y;        /* upper-left y */
341054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 width;    /* width */
342054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 height;   /* height */
343054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_RECT;
344054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
345054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* C2D_OBJECT encapsulates the blit parameters for a source surface.
346054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The fg_color defines color in target format for bits equal to 1
347054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * in the source C2D_COLOR_FORMAT_1 format. It also defines rendering
348054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * color for all alpha-only source formats. If the surface_id is 0
349054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * the fg_color defines a constant fill color used instead of the surface.
350054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The bg_color defines color in target format for bits equal to 0
351054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * in the source C2D_COLOR_FORMAT_1 format, otherwise both are ignored.
352054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The palette_id is used for all palette source formats, otherwise ignored.
353054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
354054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The source_rect first defines the content of the source surface,
355054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * it is then horizontally/vertically flipped if C2D_MIRROR_*_BIT is set,
356054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * then scaled with bilinear interpolation to exactly fit target_rect
357054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * or repeated across target_rect if C2D_SOURCE_TILE_BIT is set,
358054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * target_rect is then rotated clockwise by an arbitrary angle in degrees
359054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * around the rot_orig_x/y, defined relative to target_rect's top left point,
360054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * and then clipped to scissor_rect defined in target coordinate system.
361054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
362054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Finally alpha blending is applied before pixels get written into the target.
363054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Surface's pixel alpha is combined with mask alpha and with global alpha.
364054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Mask surface follows all transformations applied to the source surface.
365054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Source color key defines transparent color, applied together with alpha. */
366054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef struct C2D_OBJECT_STR {
367054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 surface_id;      /* source surface */
368054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
369054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 fg_color;        /* foreground color */
370054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 bg_color;        /* background color */
371054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 palette_id;      /* one-dimensional horizontal palette surface */
372054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
373054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 config_mask;     /* defines which fields below are enabled */
374054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
375054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_RECT source_rect;  /* region of the source surface,   16.16 fp */
376054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_RECT target_rect;  /* position and scaling in target, 16.16 fp */
377054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
378054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 rot_orig_x;       /* rotation origin relative to target_rect's... */
379054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 rot_orig_y;       /* ...top left point,     both are 16.16 fp */
380054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    int32 rotation;         /* clock-wise rotation in degrees, 16.16 fp */
381054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
382054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_RECT scissor_rect; /* defines the clip rectangle in target surface */
383054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
384054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 mask_surface_id; /* source alpha-mask surface */
385054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 global_alpha;    /* 0 = fully transparent, 255 = fully opaque */
386054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 color_key;       /* transparent color for the source surface */
387054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
388054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    struct C2D_OBJECT_STR *next; /* pointer to the next object or NULL */
389054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_OBJECT;
390054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
391054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Configuration bits, driver capabilities used by 2Dapplications */
392054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
393054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_GLOBAL_ALPHA_OP           = (1 << 0),
394054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_TILE_OP                   = (1 << 1),
395054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_COLOR_KEY_OP              = (1 << 2),
396054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_NO_PIXEL_ALPHA_OP         = (1 << 3),
397054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_TARGET_ROTATE_OP          = (1 << 4),
398054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_ANTI_ALIASING_OP          = (1 << 5), /* antialiasing */
399054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_BILINEAR_FILTER_OP        = (1 << 6),
400054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_LENS_CORRECTION_OP        = (1 << 7),
401054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_OVERRIDE_TARGET_ROTATE_OP = (1 << 8),
402054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_SHADER_BLOB_OP            = (1 << 9),
403054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_MASK_SURFACE_OP           = (1 << 10), /* mask surface */
404054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_MIRROR_H_OP               = (1 << 11), /* horizontal flip */
405054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_MIRROR_V_OP               = (1 << 12), /* vertical flip */
406054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_SCISSOR_RECT_OP           = (1 << 13),
407054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_SOURCE_RECT_OP            = (1 << 14),
408054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_TARGET_RECT_OP            = (1 << 15),
409054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_ROTATE_OP                 = (1 << 16), /* all rotations */
410054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_FLUSH_WITH_FENCE_FD_OP    = (1 << 17), /* all rotations */
411054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_SUPPORTS_ALL_CAPABILITIES_OP       = ((0xFFFFFFFF) >> (31 - 17)) /* mask for all capabilities supported */
412054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DRIVER_CAPABILITIES;
413054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
414054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* 2D driver workaround bits used by the 2D applications */
415054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
416054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_WORKAROUND_NONE  = 0, /* NO workaround */
417054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DRIVER_WORKAROUND_SWAP_UV_FOR_YUV_TARGET  = (1 << 0), /* Swap UV when this flag set */
418054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DRIVER_WORKAROUND;
419054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
420054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Structure to query Driver information */
421054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef struct {
422054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 capabilities_mask;
423054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 workaround_mask;
424054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 reserved1;
425054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 reserved2;
426054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32 reserved3;
427054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DRIVER_INFO;
428054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
429054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Structure to query Driver information */
430054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef struct {
431054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32          max_surface_template_needed;
432054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32          reserved1;
433054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32          reserved2;
434054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    uint32          reserved3;
435054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DRIVER_SETUP_INFO;
436054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
437054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
438054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/**************************** C2D API 2.0 ********************************/
439054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
440054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
441054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************
442054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Functions to create/destroy surfaces */
443054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
444054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Creates a generic blit surface according to its type.
445054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Pass a combination of desired surface bits according to planned usage.
446054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Accepted values for surface_bits may include bits from C2D_SURFACE_BITS,
447054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * and also from C2D_DISPLAY for compatibility with HW display controller.
448054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * For host memory types the memory is preallocated outside the API
449054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * and should remain valid until surface is destroyed.
450054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * For external memory types the memory is allocated within API.
451054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * On success, the non-zero surface identifier is returned.
452054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * All numbers greater that 0 are valid surface identifiers, 0 is invalid.
453054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
454054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Host memory RGB surface:
455054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_type       = C2D_SURFACE_RGB_HOST
456054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_definition = C2D_RGB_SURFACE_DEF
457054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * all fields in definition structure should be set
458054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
459054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * External memory RGB surface:
460054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_type       = C2D_SURFACE_RGB_EXT
461054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_definition = C2D_RGB_SURFACE_DEF
462054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * buffer field in definition structure is ignored
463054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
464054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Host memory YUV surface:
465054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_type       = C2D_SURFACE_YUV_HOST
466054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_definition = C2D_YUV_SURFACE_DEF
467054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * one or all plane and stride fields in definition structure
468054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * should be set depending on whether the format is planar or not
469054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
470054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * External memory YUV surface:
471054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_type       = C2D_SURFACE_YUV_EXT
472054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_definition = C2D_YUV_SURFACE_DEF
473054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * all plane and stride fields in definition structure are ignored */
474054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dCreateSurface( uint32 *surface_id,
475054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 surface_bits,
476054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_SURFACE_TYPE surface_type,
477054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         void *surface_definition );
478054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
479054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Requests properties of the specified surface. */
480054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dQuerySurface( uint32 surface_id,
481054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 *surface_bits,
482054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_SURFACE_TYPE *surface_type,
483054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 *width, uint32 *height,
484054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 *format );
485054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
486054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Destroys a generic blit surface.
487054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * For external memory surfaces also deallocates the memory.
488054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * It is safe to free any external resources associated with a given
489054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface on c2dCreateSurface call after this function returns. */
490054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dDestroySurface( uint32 surface_id );
491054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
492054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
493054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************
494054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Functions to modify/exchange surface data */
495054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
496054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* The format of fill_color is the same as color format being used
497054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * for specified surface. If fill_rect is NULL the whole surface is filled.
498054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Alpha-blending is not performed while filling.
499054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The operation is complete when function returns. */
500054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dFillSurface( uint32 surface_id,
501054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 fill_color,
502054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_RECT *fill_rect );
503054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
504054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Writes data located in host memory into the specified surface.
505054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The chunk of host memory is identified with surface_type and
506054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_definition, no surface registration needed in this case.
507054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Only C2D_SURFACE_RGB_HOST, C2D_SURFACE_YUV_HOST are accepted.
508054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If only part of the host memory buffer should be loaded, it should
509054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * be configured in surface_definition using width, height and stride.
510054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The x and y are defined in target surface coordinate space.
511054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Color conversion has to be done, if color formats differ.
512054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Alpha-blending is not performed while writing.
513054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The operation is complete when function returns. */
514054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dWriteSurface( uint32 surface_id,
515054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_SURFACE_TYPE surface_type,
516054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         void *surface_definition,
517054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         int32 x, int32 y );
518054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
519054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Reads data from the specified surface into the host memory.
520054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The chunk of host memory is identified with surface_type and
521054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * surface_definition, no surface registration needed in this case.
522054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Only C2D_SURFACE_RGB_HOST, C2D_SURFACE_YUV_HOST are accepted.
523054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If only part of the surface should be read, it should
524054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * be configured in surface_definition using width, height and stride.
525054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The x and y are defined in source surface coordinate space.
526054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Color conversion has to be done, if color formats differ.
527054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Alpha-blending is not performed while reading.
528054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The operation is complete when function returns. */
529054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dReadSurface( uint32 surface_id,
530054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_SURFACE_TYPE surface_type,
531054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         void *surface_definition,
532054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         int32 x, int32 y );
533054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
534054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Notifies c2d imlementation that surface has been updated from outside the API,
535054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * if updated_rect is NULL then the whole surface has been updated. */
536054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dSurfaceUpdated( uint32 surface_id,
537054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_RECT *updated_rect );
538054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
539054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Updates surface information.
540054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Could be called only for host surfaces set with parameter "C2D_SURFACE_WITH_PHYS".
541054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Count for surface planes have to be same than for already allocated surface */
542054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dUpdateSurface( uint32 surface_id,
543054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 surface_bits,
544054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_SURFACE_TYPE surface_type,
545054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         void *surface_definition );
546054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
547054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************
548054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Functions to do actual blit */
549054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
550054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Draw a list of blit objects into the given target.
551054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The target_config is a bitwise OR of values from C2D_TARGET_CONFIG.
552054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The target transformation creates the effect that target surface
553054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * is transformed before the blit and then transformed back
554054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * after blit, however no physical target transform is performed.
555054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The objects_list is a linked list of blit objects, no more
556054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * than num_objects is drawn from the given list.
557054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * If num_objects is 0, the whole list is drawn.
558054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The blit is not guaranteed to complete after function returns. */
559054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dDraw( uint32 target_id,
560054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 target_config, C2D_RECT *target_scissor,
561054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 target_mask_id, uint32 target_color_key,
562054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_OBJECT *objects_list, uint32 num_objects );
563054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
564054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
565054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* timstamp set in the blit commands flush */
566054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef void*                   c2d_ts_handle;
567054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
568054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Forces any pending blit to complete for a given target.
569054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Non-blocking. All input surfaces for this target except those
570054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * which are shared with other targets are expected to be immediately
571054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * writable after client has been waiting returned timestamp with
572054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * c2dWaitTimestamp funtion or c2dFinish has been called for same target */
573054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dFlush( uint32 target_id, c2d_ts_handle *timestamp);
574054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
575054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
576054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Waits the pending timestamp */
577054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dWaitTimestamp( c2d_ts_handle timestamp );
578054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
579054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
580054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Forces any pending blit to complete for a given target.
581054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Blocking version, returns when blit is done.
582054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * All input surfaces for this target except those which are shared with
583054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * other targets are expected to be immediately
584054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * writable after this function returns. */
585054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dFinish( uint32 target_id );
586054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
587054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
588054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
589054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/****************************** Display API **********************************/
590054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
591054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
592054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
593054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Display input enumeration */
594054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
595054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_INPUT_0      = 0,       /*!< default input */
596054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_INPUT_1      = (1<<16), /*!< Overlay 1     */
597054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_INPUT_2      = (1<<17), /*!< Overlay 2...    */
598054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DISPLAY_INPUT;
599054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
600054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
601054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/******************************************************************************
602054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Functions for display output. */
603054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
604054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Functionality described in this section is optional and is
605054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * provided only for the cases when blit HW
606054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * is tightly bound to the display controller. */
607054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
608054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Display enumeration, may also be used in surface caps */
609054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
610054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_MAIN         = (1 << 10), /* main display */
611054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_SECONDARY    = (1 << 11), /* secondary display */
612054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_TV_OUT       = (1 << 12), /* tv-out */
613054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DISPLAY;
614054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
615054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Display window enumeration */
616054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
617054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_OVERLAY      = C2D_DISPLAY_INPUT_1, /*!< Overlay window bit. This defines display input.
618054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                                When defined the surface is set on the overlay window
619054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                                                otherwise the surface is set on the background window. */
620054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DISPLAY_WINDOW;                    /*!< Window bit set with display parameter */
621054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
622054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
623054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Display update modes */
624054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjintypedef enum {
625054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_MODE_TEAR_SYNC   = (1 << 0), /* enables tearing sync */
626054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin    C2D_DISPLAY_MODE_SURF_REMOVE = (1 << 1), /* Remove surface from given display + input */
627054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin} C2D_DISPLAY_MODE;
628054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
629054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
630054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Sets the given surface as a current display front buffer.
631054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Several displays can be specified as an output if supported.
632054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Still only one input can be specified at a time fro display/displays.
633054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The surface remains shown until it gets replaced with another one. */
634054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dDisplaySetSurface( uint32 display,
635054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 surface_id, uint32 mode );
636054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
637054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Returns the current surface for a particular display.
638054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Only one display can be specified at a time.
639054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * The latest surface set with compDisplaySetSurface or
640054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * the default pre-allocated surface is returned. */
641054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dDisplayGetSurface( uint32 display,
642054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 *surface_id );
643054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
644054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Returns the properties for a particular display.
645054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Only one display can be specified at a time. */
646054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dDisplayGetProperties( uint32 display,
647054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 *width, uint32 *height,
648054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 *format );
649054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
650054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* Sets the properties for a particular display input.
651054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * Only one display + input can be specified at a time.
652054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * C2D_OBJECT used to set input rect(target rect),
653054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * blending operations, rotation...etc for display source */
654054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dDisplaySetObject( uint32 display,
655054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         uint32 target_config, uint32 target_color_key,
656054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin                         C2D_OBJECT * c2dObject, uint32 mode);
657054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
658054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* allows user to map a memory region to the gpu. only supported on linux
659054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * mem_fd is the fd of the memory region, hostptr is the host pointer to the region,
660054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * len and offset are the size and offset of the memory.
661054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * flags is one of the memory types supported by gsl
662054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * gpaddr is passed by refernce back to the user
663054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin */
664054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dMapAddr ( int mem_fd, void * hostptr, uint32 len, uint32 offset, uint32 flags, void ** gpuaddr);
665054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
666054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* allows user to unmap memory region mapped by c2dMapAddr.
667054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * gpaddr is the gpuaddr to unmap */
668054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dUnMapAddr (void * gpuaddr);
669054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
670054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* allows user to query driver capabilities.
671054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin * driver_info is the information about driver */
672054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dGetDriverCapabilities( C2D_DRIVER_INFO * driver_info);
673054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
674054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/* create a fence fd for the timestamp */
675054df959aef7dce630a7f41d4aba6626c130756bPatrick TjinC2D_API C2D_STATUS c2dCreateFenceFD( uint32 target_id, c2d_ts_handle timestamp, int32 *fd);
676054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
677054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin/*****************************************************************************/
678054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
679054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#ifdef __cplusplus
680054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin}
681054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif
682054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin
683054df959aef7dce630a7f41d4aba6626c130756bPatrick Tjin#endif /* __c2d2_h_ */
684