Commit | Line | Data |
---|---|---|
d42e7319 JB |
1 | #include <ws.h> |
2 | #include "fbdev_window.h" | |
3 | #include <malloc.h> | |
4 | #include <assert.h> | |
5 | #include <fcntl.h> | |
6 | #include <stdio.h> | |
7 | #include <sys/stat.h> | |
8 | #include <unistd.h> | |
9 | #include <assert.h> | |
10 | extern "C" { | |
11 | #include <eglplatformcommon.h> | |
12 | }; | |
13 | ||
14 | #include "logging.h" | |
15 | ||
16 | static int inited = 0; | |
17 | static gralloc_module_t *gralloc = 0; | |
18 | static framebuffer_device_t *framebuffer = 0; | |
19 | static alloc_device_t *alloc = 0; | |
20 | static FbDevNativeWindow *_nativewindow = NULL; | |
21 | ||
22 | extern "C" int fbdevws_IsValidDisplay(EGLNativeDisplayType display) | |
23 | { | |
24 | if (__sync_fetch_and_add(&inited,1)==0) | |
25 | { | |
26 | int err; | |
27 | err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, (const hw_module_t **) &gralloc); | |
28 | if (gralloc==NULL) { | |
29 | fprintf(stderr, "failed to get gralloc module: (%s)\n",strerror(-err)); | |
30 | assert(0); | |
31 | } | |
32 | ||
33 | err = framebuffer_open((hw_module_t *) gralloc, &framebuffer); | |
34 | if (err) { | |
35 | fprintf(stderr, "ERROR: failed to open framebuffer: (%s)\n",strerror(-err)); | |
36 | assert(0); | |
37 | } | |
38 | TRACE("** framebuffer_open: status=(%s) format=x%x", strerror(-err), framebuffer->format); | |
39 | ||
40 | err = gralloc_open((const hw_module_t *) gralloc, &alloc); | |
41 | if (err) { | |
42 | fprintf(stderr, "ERROR: failed to open gralloc: (%s)\n",strerror(-err)); | |
43 | assert(0); | |
44 | } | |
45 | TRACE("** gralloc_open %p status=%s", gralloc, strerror(-err)); | |
46 | eglplatformcommon_init(gralloc, alloc); | |
47 | } | |
48 | ||
49 | return display == EGL_DEFAULT_DISPLAY; | |
50 | } | |
51 | ||
52 | extern "C" EGLNativeWindowType fbdevws_CreateWindow(EGLNativeWindowType win, EGLNativeDisplayType display) | |
53 | { | |
54 | assert (inited >= 1); | |
55 | assert (_nativewindow == NULL); | |
56 | ||
57 | _nativewindow = new FbDevNativeWindow(gralloc, alloc, framebuffer); | |
58 | _nativewindow->common.incRef(&_nativewindow->common); | |
59 | return (EGLNativeWindowType) static_cast<struct ANativeWindow *>(_nativewindow); | |
60 | } | |
61 | ||
62 | extern "C" void fbdevws_DestroyWindow(EGLNativeWindowType win) | |
63 | { | |
64 | assert (_nativewindow != NULL); | |
65 | assert (static_cast<FbDevNativeWindow *>((struct ANativeWindow *)win) == _nativewindow); | |
66 | ||
67 | _nativewindow->common.decRef(&_nativewindow->common); | |
68 | /* We are done with it, refcounting will delete the window when appropriate */ | |
69 | _nativewindow = NULL; | |
70 | } | |
71 | ||
72 | extern "C" __eglMustCastToProperFunctionPointerType fbdevws_eglGetProcAddress(const char *procname) | |
73 | { | |
74 | return eglplatformcommon_eglGetProcAddress(procname); | |
75 | } | |
76 | ||
77 | extern "C" void fbdevws_passthroughImageKHR(EGLContext *ctx, EGLenum *target, EGLClientBuffer *buffer, const EGLint **attrib_list) | |
78 | { | |
79 | eglplatformcommon_passthroughImageKHR(ctx, target, buffer, attrib_list); | |
80 | } | |
81 | ||
82 | struct ws_module ws_module_info = { | |
83 | fbdevws_IsValidDisplay, | |
84 | fbdevws_CreateWindow, | |
85 | fbdevws_DestroyWindow, | |
86 | fbdevws_eglGetProcAddress, | |
87 | fbdevws_passthroughImageKHR, | |
88 | eglplatformcommon_eglQueryString | |
89 | }; | |
90 | ||
91 | // vim:ts=4:sw=4:noexpandtab |