ANativeObjectBase.h revision 5e67f87430d581155c700bb33ac0b43ed5de20b7
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
2076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Copyright (C) 2009 The Android Open Source Project
3076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
4076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * you may not use this file except in compliance with the License.
6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * You may obtain a copy of the License at
7076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
8076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian *
10076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * Unless required by applicable law or agreed to in writing, software
11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * See the License for the specific language governing permissions and
14076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * limitations under the License.
15076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian */
16076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
17076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifndef ANDROID_ANDROID_NATIVES_H
18076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#define ANDROID_ANDROID_NATIVES_H
19076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
20076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <sys/types.h>
21076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <string.h>
22076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
23076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <hardware/gralloc.h>
24076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
25076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef __cplusplus
26076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianextern "C" {
27076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
28076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*****************************************************************************/
30076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
31076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#define ANDROID_NATIVE_MAKE_CONSTANT(a,b,c,d) \
32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    (((unsigned)(a)<<24)|((unsigned)(b)<<16)|((unsigned)(c)<<8)|(unsigned)(d))
33076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
34076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#define ANDROID_NATIVE_WINDOW_MAGIC \
35076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    ANDROID_NATIVE_MAKE_CONSTANT('_','w','n','d')
36076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
37076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#define ANDROID_NATIVE_BUFFER_MAGIC \
38076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    ANDROID_NATIVE_MAKE_CONSTANT('_','b','f','r')
39076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
40076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
41076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
42076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstruct android_native_buffer_t;
43076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
44cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopiantypedef struct android_native_rect_t
45cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian{
46cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int32_t left;
47cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int32_t top;
48cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int32_t right;
49cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int32_t bottom;
50cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian} android_native_rect_t;
51cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian
52076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
53076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
54238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopiantypedef struct android_native_base_t
55076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
56076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* a magic value defined by the actual EGL native type */
57076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int magic;
58076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
59076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* the sizeof() of the actual EGL native type */
60076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int version;
61076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
62076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    void* reserved[4];
63076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
64076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* reference-counting interface */
6537b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    void (*incRef)(struct android_native_base_t* base);
6637b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    void (*decRef)(struct android_native_base_t* base);
67238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopian} android_native_base_t;
68076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
69aa8c0ff7a36b4840dcf3e72c9696b86d192c4314Mathias Agopian// ---------------------------------------------------------------------------
70076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
71cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian/* attributes queriable with query() */
72cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopianenum {
73cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    NATIVE_WINDOW_WIDTH     = 0,
74cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    NATIVE_WINDOW_HEIGHT,
75cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    NATIVE_WINDOW_FORMAT,
76cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian};
77cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian
785221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian/* valid operations for the (*perform)() hook */
795221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopianenum {
80e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian    NATIVE_WINDOW_SET_USAGE  = 0,
81cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    NATIVE_WINDOW_CONNECT,
82cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    NATIVE_WINDOW_DISCONNECT,
83cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    NATIVE_WINDOW_SET_CROP,
84e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian};
85e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian
86e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian/* parameter for NATIVE_WINDOW_[DIS]CONNECT */
87e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopianenum {
88e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian    NATIVE_WINDOW_API_EGL = 1
895221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian};
905221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
91238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopiantypedef struct android_native_window_t
92076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
93076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef __cplusplus
94076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    android_native_window_t()
95076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        : flags(0), minSwapInterval(0), maxSwapInterval(0), xdpi(0), ydpi(0)
96076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    {
97076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        common.magic = ANDROID_NATIVE_WINDOW_MAGIC;
98076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        common.version = sizeof(android_native_window_t);
99076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        memset(common.reserved, 0, sizeof(common.reserved));
100076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
1015e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis
1025e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    // Implement the methods that sp<android_native_window_t> expects so that it
1035e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    // can be used to automatically refcount android_native_window_t's.
1045e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    void incStrong(const void* id) const {
1055e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis        common.incRef(const_cast<android_native_base_t*>(&common));
1065e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    }
1075e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    void decStrong(const void* id) const {
1085e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis        common.decRef(const_cast<android_native_base_t*>(&common));
1095e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    }
110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
111076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
112076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    struct android_native_base_t common;
113076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
114076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* flags describing some attributes of this surface or its updater */
115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const uint32_t flags;
116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
117076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* min swap interval supported by this updated */
118076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const int   minSwapInterval;
119076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
120076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* max swap interval supported by this updated */
121076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const int   maxSwapInterval;
122076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
123076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* horizontal and vertical resolution in DPI */
124076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const float xdpi;
125076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    const float ydpi;
126076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
127076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /* Some storage reserved for the OEM's driver. */
128076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    intptr_t    oem[4];
129076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
130076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
131076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /*
132076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * Set the swap interval for this surface.
133076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     *
134076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * Returns 0 on success or -errno on error.
135076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     */
13637b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    int     (*setSwapInterval)(struct android_native_window_t* window,
137076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                int interval);
138076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
139076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /*
140076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * hook called by EGL to acquire a buffer. After this call, the buffer
141076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * is not locked, so its content cannot be modified.
1420926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian     * this call may block if no buffers are available.
143076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     *
144076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * Returns 0 on success or -errno on error.
145076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     */
146cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    int     (*dequeueBuffer)(struct android_native_window_t* window,
147076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                struct android_native_buffer_t** buffer);
148076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
149076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    /*
150076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * hook called by EGL to lock a buffer. This MUST be called before modifying
151076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * the content of a buffer. The buffer must have been acquired with
152076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * dequeueBuffer first.
153076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     *
154076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * Returns 0 on success or -errno on error.
155076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     */
15637b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    int     (*lockBuffer)(struct android_native_window_t* window,
157076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                struct android_native_buffer_t* buffer);
158076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian   /*
159076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    * hook called by EGL when modifications to the render buffer are done.
160076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    * This unlocks and post the buffer.
161076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    *
162076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    * Buffers MUST be queued in the same order than they were dequeued.
163076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    *
164076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    * Returns 0 on success or -errno on error.
165076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    */
16637b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    int     (*queueBuffer)(struct android_native_window_t* window,
167076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                struct android_native_buffer_t* buffer);
168076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
169cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian    /*
170cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian     * hook used to retrieve information about the native window.
171cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian     *
172cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian     * Returns 0 on success or -errno on error.
173cb6b9041647b4f080324742eee5ce709960ff610Mathias Agopian     */
17437b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    int     (*query)(struct android_native_window_t* window,
1755221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian                int what, int* value);
1765221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
1775221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    /*
1785221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     * hook used to perform various operations on the surface.
1795221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     * (*perform)() is a generic mechanism to add functionality to
1805221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     * android_native_window_t while keeping backward binary compatibility.
1815221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     *
1825221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     * This hook should not be called directly, instead use the helper functions
1835221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     * defined below.
1845221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     *
185e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian     *  (*perform)() returns -ENOENT if the 'what' parameter is not supported
186e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian     *  by the surface's implementation.
187e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian     *
1885221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     * The valid operations are:
1895221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     *     NATIVE_WINDOW_SET_USAGE
190e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian     *     NATIVE_WINDOW_CONNECT
191e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian     *     NATIVE_WINDOW_DISCONNECT
192cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian     *     NATIVE_WINDOW_SET_CROP
1935221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     *
1945221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian     */
195076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
19637b2a3744c2045cbf15a50dc1312fdd8c67ae8b1Mathias Agopian    int     (*perform)(struct android_native_window_t* window,
1975221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian                int operation, ... );
1985221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
1995221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    void* reserved_proc[3];
200238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopian} android_native_window_t;
201076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
2025221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
2035221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian/*
2045221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *  native_window_set_usage() sets the intended usage flags for the next
2055221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *  buffers acquired with (*lockBuffer)() and on.
2065221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *  By default (if this function is never called), a usage of
2075221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *      GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE
2085221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *  is assumed.
2095221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *  Calling this function will usually cause following buffers to be
2105221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian *  reallocated.
2115221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian */
2125221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
213fae3e73b6157555e8605f8b0c1d5b0bcc5b5ea00Dima Zavinstatic inline int native_window_set_usage(
214238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopian        android_native_window_t* window, int usage)
2155221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian{
2165221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian    return window->perform(window, NATIVE_WINDOW_SET_USAGE, usage);
2175221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian}
2185221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
219e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian/*
220e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * native_window_connect(..., NATIVE_WINDOW_API_EGL) must be called
221e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * by EGL when the window is made current.
222e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * Returns -EINVAL if for some reason the window cannot be connected, which
223e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * can happen if it's connected to some other API.
224e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian */
225e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopianstatic inline int native_window_connect(
226e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian        android_native_window_t* window, int api)
227e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian{
228e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian    return window->perform(window, NATIVE_WINDOW_CONNECT, api);
229e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian}
230e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian
231e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian/*
232e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * native_window_disconnect(..., NATIVE_WINDOW_API_EGL) must be called
233e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * by EGL when the window is made not current.
234e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * An error is returned if for instance the window wasn't connected in the
235e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian * first place.
236e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian */
237e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopianstatic inline int native_window_disconnect(
238e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian        android_native_window_t* window, int api)
239e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian{
240e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian    return window->perform(window, NATIVE_WINDOW_DISCONNECT, api);
241e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian}
242e156e6478f8393dc519a903d48ef09b3eabf32adMathias Agopian
243cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian/*
244cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * native_window_set_crop(..., crop) sets which region of the next queued
245cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * buffers needs to be considered.
246cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * A buffer's crop region is scaled to match the surface's size.
247cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian *
248cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * The specified crop region applies to all buffers queued after it is called.
249cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian *
250cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * if 'crop' is NULL, subsequently queued buffers won't be cropped.
251cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian *
252cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * An error is returned if for instance the crop region is invalid,
253cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian * out of the buffer's bound or if the window is invalid.
254cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian */
255cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopianstatic inline int native_window_set_crop(
256cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian        android_native_window_t* window,
257cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian        android_native_rect_t const * crop)
258cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian{
259cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian    return window->perform(window, NATIVE_WINDOW_SET_CROP, crop);
260cc08e688f5b82b4ebd076ad138b2749e8c86ad5eMathias Agopian}
2615221271375f361b84a6eeec3d7086f223997fbb3Mathias Agopian
262aa8c0ff7a36b4840dcf3e72c9696b86d192c4314Mathias Agopian// ---------------------------------------------------------------------------
263076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
264076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* FIXME: this is legacy for pixmaps */
265238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopiantypedef struct egl_native_pixmap_t
266076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
267076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int32_t     version;    /* must be 32 */
268076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int32_t     width;
269076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int32_t     height;
270076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int32_t     stride;
271076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    uint8_t*    data;
272076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    uint8_t     format;
273076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    uint8_t     rfu[3];
274076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    union {
275076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    compressedFormat;
276076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        int32_t     vstride;
277076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    };
278076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int32_t     reserved;
279238a66e67b155d7e1fcdb19b672ffc0ae4a6fc94Mathias Agopian} egl_native_pixmap_t;
280076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
281076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*****************************************************************************/
282076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
283076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef __cplusplus
284076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
285076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif
286076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
287076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
288076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*****************************************************************************/
289076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
290076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#ifdef __cplusplus
291076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
292076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <utils/RefBase.h>
293076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
294076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiannamespace android {
295076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
296076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*
297076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * This helper class turns an EGL android_native_xxx type into a C++
298076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian * reference-counted object; with proper type conversions.
299076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian */
300076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiantemplate <typename NATIVE_TYPE, typename TYPE, typename REF>
301076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianclass EGLNativeBase : public NATIVE_TYPE, public REF
302076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
3035e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennispublic:
3045e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    // Disambiguate between the incStrong in REF and NATIVE_TYPE
3055e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    void incStrong(const void* id) const {
3065e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis        REF::incStrong(id);
3075e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    }
3085e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    void decStrong(const void* id) const {
3095e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis        REF::decStrong(id);
3105e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis    }
3115e67f87430d581155c700bb33ac0b43ed5de20b7Jamie Gennis
312076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianprotected:
313076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    typedef EGLNativeBase<NATIVE_TYPE, TYPE, REF> BASE;
314076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    EGLNativeBase() : NATIVE_TYPE(), REF() {
315076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        NATIVE_TYPE::common.incRef = incRef;
316076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        NATIVE_TYPE::common.decRef = decRef;
317076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
318076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static inline TYPE* getSelf(NATIVE_TYPE* self) {
319076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return static_cast<TYPE*>(self);
320076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
321076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static inline TYPE const* getSelf(NATIVE_TYPE const* self) {
322076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return static_cast<TYPE const *>(self);
323076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
324076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static inline TYPE* getSelf(android_native_base_t* base) {
325076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return getSelf(reinterpret_cast<NATIVE_TYPE*>(base));
326076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
327076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static inline TYPE const * getSelf(android_native_base_t const* base) {
328076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        return getSelf(reinterpret_cast<NATIVE_TYPE const*>(base));
329076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
330076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static void incRef(android_native_base_t* base) {
331076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLNativeBase* self = getSelf(base);
332076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        self->incStrong(self);
333076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
334076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    static void decRef(android_native_base_t* base) {
335076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        EGLNativeBase* self = getSelf(base);
336076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        self->decStrong(self);
337076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
338076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian};
339076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
340076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian} // namespace android
341076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif // __cplusplus
342076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
343076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/*****************************************************************************/
344076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
345076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#endif /* ANDROID_ANDROID_NATIVES_H */
346