aboutsummaryrefslogtreecommitdiffstats
path: root/src/android/ffi.rs
blob: 123a3f0b93ac849c162a6edbb3d71508df5be77f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#![allow(dead_code)]
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]

use libc;

pub type EGLBoolean = libc::c_int;
pub type EGLint = i32;
pub type EGLDisplay = *const libc::c_void;
pub type EGLConfig = *const libc::c_void;
pub type EGLSurface = *const libc::c_void;
pub type EGLContext = *const libc::c_void;

pub type NativePixmapType = *const libc::c_void;     // FIXME: egl_native_pixmap_t instead
pub type NativeWindowType = *const ANativeWindow;

pub static EGL_DEFAULT_DISPLAY: EGLint = 0;
/*pub static EGL_NO_CONTEXT: EGLContext = { use std::ptr; ptr::null() };
pub static EGL_NO_DISPLAY: EGLDisplay = { use std::ptr; ptr::null() };
pub static EGL_NO_SURFACE: EGLSurface = { use std::ptr; ptr::null() };*/

pub static EGL_VERSION_1_0: EGLint = 1;
pub static EGL_VERSION_1_1: EGLint = 1;

pub static EGL_FALSE: EGLint = 0;
pub static EGL_TRUE: EGLint = 1;

pub static EGL_SUCCESS: EGLint = 0x3000;
pub static EGL_NOT_INITIALIZED: EGLint = 0x3001;
pub static EGL_BAD_ACCESS: EGLint = 0x3002;
pub static EGL_BAD_ALLOC: EGLint = 0x3003;
pub static EGL_BAD_ATTRIBUTE: EGLint = 0x3004;
pub static EGL_BAD_CONFIG: EGLint = 0x3005;
pub static EGL_BAD_CONTEXT: EGLint = 0x3006;
pub static EGL_BAD_CURRENT_SURFACE: EGLint = 0x3007;
pub static EGL_BAD_DISPLAY: EGLint = 0x3008;
pub static EGL_BAD_MATCH: EGLint = 0x3009;
pub static EGL_BAD_NATIVE_PIXMAP: EGLint = 0x300A;
pub static EGL_BAD_NATIVE_WINDOW: EGLint = 0x300B;
pub static EGL_BAD_PARAMETER: EGLint = 0x300C;
pub static EGL_BAD_SURFACE: EGLint = 0x300D;
pub static EGL_CONTEXT_LOST: EGLint = 0x300E;

pub static EGL_BUFFER_SIZE: EGLint = 0x3020;
pub static EGL_ALPHA_SIZE: EGLint = 0x3021;
pub static EGL_BLUE_SIZE: EGLint = 0x3022;
pub static EGL_GREEN_SIZE: EGLint = 0x3023;
pub static EGL_RED_SIZE: EGLint = 0x3024;
pub static EGL_DEPTH_SIZE: EGLint = 0x3025;
pub static EGL_STENCIL_SIZE: EGLint = 0x3026;
pub static EGL_CONFIG_CAVEAT: EGLint = 0x3027;
pub static EGL_CONFIG_ID: EGLint = 0x3028;
pub static EGL_LEVEL: EGLint = 0x3029;
pub static EGL_MAX_PBUFFER_HEIGHT: EGLint = 0x302A;
pub static EGL_MAX_PBUFFER_PIXELS: EGLint = 0x302B;
pub static EGL_MAX_PBUFFER_WIDTH: EGLint = 0x302C;
pub static EGL_NATIVE_RENDERABLE: EGLint = 0x302D;
pub static EGL_NATIVE_VISUAL_ID: EGLint = 0x302E;
pub static EGL_NATIVE_VISUAL_TYPE: EGLint = 0x302F;
/*pub static EGL_PRESERVED_RESOURCES: EGLint = 0x3030;*/
pub static EGL_SAMPLES: EGLint = 0x3031;
pub static EGL_SAMPLE_BUFFERS: EGLint = 0x3032;
pub static EGL_SURFACE_TYPE: EGLint = 0x3033;
pub static EGL_TRANSPARENT_TYPE: EGLint = 0x3034;
pub static EGL_TRANSPARENT_BLUE_VALUE: EGLint = 0x3035;
pub static EGL_TRANSPARENT_GREEN_VALUE: EGLint = 0x3036;
pub static EGL_TRANSPARENT_RED_VALUE: EGLint = 0x3037;
pub static EGL_NONE: EGLint = 0x3038   /* Also a config value */;
pub static EGL_BIND_TO_TEXTURE_RGB: EGLint = 0x3039;
pub static EGL_BIND_TO_TEXTURE_RGBA: EGLint = 0x303A;
pub static EGL_MIN_SWAP_INTERVAL: EGLint = 0x303B;
pub static EGL_MAX_SWAP_INTERVAL: EGLint = 0x303C;


pub static EGL_DONT_CARE: EGLint = -1;
pub static EGL_SLOW_CONFIG: EGLint = 0x3050   /* EGL_CONFIG_CAVEAT value */;
pub static EGL_NON_CONFORMANT_CONFIG: EGLint = 0x3051   /* " */;
pub static EGL_TRANSPARENT_RGB: EGLint = 0x3052   /* EGL_TRANSPARENT_TYPE value */;
pub static EGL_NO_TEXTURE: EGLint = 0x305C   /* EGL_TEXTURE_FORMAT/TARGET value */;
pub static EGL_TEXTURE_RGB: EGLint = 0x305D   /* EGL_TEXTURE_FORMAT value */;
pub static EGL_TEXTURE_RGBA: EGLint = 0x305E   /* " */;
pub static EGL_TEXTURE_2D: EGLint = 0x305F   /* EGL_TEXTURE_TARGET value */;

pub static EGL_PBUFFER_BIT: EGLint = 0x01 /* EGL_SURFACE_TYPE mask bit */;
pub static EGL_PIXMAP_BIT: EGLint = 0x02 /* " */;
pub static EGL_WINDOW_BIT: EGLint = 0x04 /* " */;

pub static EGL_VENDOR: EGLint = 0x3053   /* eglQueryString target */;
pub static EGL_VERSION: EGLint = 0x3054   /* " */;
pub static EGL_EXTENSIONS: EGLint = 0x3055   /* " */;

pub static EGL_HEIGHT: EGLint = 0x3056;
pub static EGL_WIDTH: EGLint = 0x3057;
pub static EGL_LARGEST_PBUFFER: EGLint = 0x3058;
pub static EGL_TEXTURE_FORMAT: EGLint = 0x3080   /* For pbuffers bound as textures */;
pub static EGL_TEXTURE_TARGET: EGLint = 0x3081   /* " */;
pub static EGL_MIPMAP_TEXTURE: EGLint = 0x3082   /* " */;
pub static EGL_MIPMAP_LEVEL: EGLint = 0x3083   /* " */;

pub static EGL_BACK_BUFFER: EGLint = 0x3084;

pub static EGL_DRAW: EGLint = 0x3059;
pub static EGL_READ: EGLint = 0x305A;

pub static EGL_CORE_NATIVE_ENGINE: EGLint = 0x305B;

#[link(name = "android")]
#[link(name = "EGL")]
#[link(name = "GLESv2")]
extern {
    pub fn eglGetError() -> EGLint;

    pub fn eglGetDisplay(display: *const ()/*NativeDisplayType*/) -> EGLDisplay;
    pub fn eglInitialize(dpy: EGLDisplay, major: *mut EGLint, minor: *mut EGLint) -> EGLBoolean;
    pub fn eglTerminate(dpy: EGLDisplay) -> EGLBoolean;
    pub fn eglQueryString(dpy: EGLDisplay, name: EGLint) -> *const libc::c_char;
    pub fn eglGetProcAddress(procname: *const libc::c_char) -> *const ();

    pub fn eglGetConfigs(dpy: EGLDisplay, configs: *mut EGLConfig, config_size: EGLint,
        num_config: *mut EGLint) -> EGLBoolean;
    pub fn eglChooseConfig(dpy: EGLDisplay, attrib_list: *const EGLint, configs: *mut EGLConfig,
        config_size: EGLint, num_config: *mut EGLint) -> EGLBoolean;
    pub fn eglGetConfigAttrib(dpy: EGLDisplay, config: EGLConfig, attribute: EGLint,
        value: *mut EGLint) -> EGLBoolean;

    pub fn eglCreateWindowSurface(dpy: EGLDisplay, config: EGLConfig, window: NativeWindowType, attrib_list: *const EGLint) -> EGLSurface;
    pub fn eglCreatePixmapSurface(dpy: EGLDisplay, config: EGLConfig, pixmap: NativePixmapType, attrib_list: *const EGLint) -> EGLSurface;
    pub fn eglCreatePbufferSurface(dpy: EGLDisplay, config: EGLConfig,
        attrib_list: *const EGLint) -> EGLSurface;
    pub fn eglDestroySurface(dpy: EGLDisplay, surface: EGLSurface) -> EGLBoolean;
    pub fn eglQuerySurface(dpy: EGLDisplay, surface: EGLSurface, attribute: EGLint,
        value: *mut EGLint) -> EGLBoolean;

    pub fn eglSurfaceAttrib(dpy: EGLDisplay, surface: EGLSurface, attribute: EGLint,
        value: EGLint) -> EGLBoolean;
    pub fn eglBindTexImage(dpy: EGLDisplay, surface: EGLSurface, buffer: EGLint) -> EGLBoolean;
    pub fn eglReleaseTexImage(dpy: EGLDisplay, surface: EGLSurface, buffer: EGLint) -> EGLBoolean;

    pub fn eglSwapInterval(dpy: EGLDisplay, interval: EGLint) -> EGLBoolean;

    pub fn eglCreateContext(dpy: EGLDisplay, config: EGLConfig, share_list: EGLContext,
        attrib_list: *const EGLint) -> EGLContext;
    pub fn eglDestroyContext(dpy: EGLDisplay, ctx: EGLContext) -> EGLBoolean;
    pub fn eglMakeCurrent(dpy: EGLDisplay, draw: EGLSurface, read: EGLSurface,
        ctx: EGLContext) -> EGLBoolean;
    pub fn eglGetCurrentContext() -> EGLContext;
    pub fn eglGetCurrentSurface(readdraw: EGLint) -> EGLSurface;
    pub fn eglGetCurrentDisplay() -> EGLDisplay;
    pub fn eglQueryContext(dpy: EGLDisplay, ctx: EGLContext, attribute: EGLint,
        value: *mut EGLint) -> EGLBoolean;

    pub fn eglWaitGL() -> EGLBoolean;
    pub fn eglWaitNative(engine: EGLint) -> EGLBoolean;
    pub fn eglSwapBuffers(dpy: EGLDisplay, draw: EGLSurface) -> EGLBoolean;
    //pub fn eglCopyBuffers(dpy: EGLDisplay, surface: EGLSurface, target: NativePixmapType) -> EGLBoolean;
}

/**
 * asset_manager.h
 */
pub type AAssetManager = ();

/**
 * native_window.h
 */
pub type ANativeWindow = ();

extern {
    pub fn ANativeWindow_getHeight(window: *const ANativeWindow) -> libc::int32_t;
    pub fn ANativeWindow_getWidth(window: *const ANativeWindow) -> libc::int32_t;
}

/**
 * native_activity.h
 */
pub type JavaVM = ();
pub type JNIEnv = ();
pub type jobject = *const libc::c_void;

pub type AInputQueue = ();  // FIXME: wrong
pub type ARect = ();  // FIXME: wrong

#[repr(C)]
pub struct ANativeActivity {
    pub callbacks: *mut ANativeActivityCallbacks,
    pub vm: *mut JavaVM,
    pub env: *mut JNIEnv,
    pub clazz: jobject,
    pub internalDataPath: *const libc::c_char,
    pub externalDataPath: *const libc::c_char,
    pub sdkVersion: libc::int32_t,
    pub instance: *mut libc::c_void,
    pub assetManager: *mut AAssetManager,
    pub obbPath: *const libc::c_char,
}

#[repr(C)]
pub struct ANativeActivityCallbacks {
    pub onStart: extern fn(*mut ANativeActivity),
    pub onResume: extern fn(*mut ANativeActivity),
    pub onSaveInstanceState: extern fn(*mut ANativeActivity, *mut libc::size_t),
    pub onPause: extern fn(*mut ANativeActivity),
    pub onStop: extern fn(*mut ANativeActivity),
    pub onDestroy: extern fn(*mut ANativeActivity),
    pub onWindowFocusChanged: extern fn(*mut ANativeActivity, libc::c_int),
    pub onNativeWindowCreated: extern fn(*mut ANativeActivity, *const ANativeWindow),
    pub onNativeWindowResized: extern fn(*mut ANativeActivity, *const ANativeWindow),
    pub onNativeWindowRedrawNeeded: extern fn(*mut ANativeActivity, *const ANativeWindow),
    pub onNativeWindowDestroyed: extern fn(*mut ANativeActivity, *const ANativeWindow),
    pub onInputQueueCreated: extern fn(*mut ANativeActivity, *mut AInputQueue),
    pub onInputQueueDestroyed: extern fn(*mut ANativeActivity, *mut AInputQueue),
    pub onContentRectChanged: extern fn(*mut ANativeActivity, *const ARect),
    pub onConfigurationChanged: extern fn(*mut ANativeActivity),
    pub onLowMemory: extern fn(*mut ANativeActivity),
}

/**
 * looper.h
 */
pub type ALooper = ();

#[link(name = "android")]
extern {
    pub fn ALooper_forThread() -> *const ALooper;
    pub fn ALooper_acquire(looper: *const ALooper);
    pub fn ALooper_release(looper: *const ALooper);
    pub fn ALooper_prepare(opts: libc::c_int) -> *const ALooper;
    pub fn ALooper_pollOnce(timeoutMillis: libc::c_int, outFd: *mut libc::c_int,
        outEvents: *mut libc::c_int, outData: *mut *mut libc::c_void) -> libc::c_int;
    pub fn ALooper_pollAll(timeoutMillis: libc::c_int, outFd: *mut libc::c_int,
        outEvents: *mut libc::c_int, outData: *mut *mut libc::c_void) -> libc::c_int;
    pub fn ALooper_wake(looper: *const ALooper);
    pub fn ALooper_addFd(looper: *const ALooper, fd: libc::c_int, ident: libc::c_int,
        events: libc::c_int, callback: ALooper_callbackFunc, data: *mut libc::c_void)
        -> libc::c_int;
    pub fn ALooper_removeFd(looper: *const ALooper, fd: libc::c_int) -> libc::c_int;
}

pub static ALOOPER_PREPARE_ALLOW_NON_CALLBACKS: libc::c_int = 1 << 0;

pub static ALOOPER_POLL_WAKE: libc::c_int = -1;
pub static ALOOPER_POLL_CALLBACK: libc::c_int = -2;
pub static ALOOPER_POLL_TIMEOUT: libc::c_int = -3;
pub static ALOOPER_POLL_ERROR: libc::c_int = -4;

pub static ALOOPER_EVENT_INPUT: libc::c_int = 1 << 0;
pub static ALOOPER_EVENT_OUTPUT: libc::c_int = 1 << 1;
pub static ALOOPER_EVENT_ERROR: libc::c_int = 1 << 2;
pub static ALOOPER_EVENT_HANGUP: libc::c_int = 1 << 3;
pub static ALOOPER_EVENT_INVALID: libc::c_int = 1 << 4;

pub type ALooper_callbackFunc = extern fn(libc::c_int, libc::c_int, *mut libc::c_void) -> libc::c_int;