1 /*
2  *
3  */
4 #ifndef HAVE_EGL_PROTOTYPES
5 #define HAVE_EGL_PROTOTYPES
6 
7 #include "../EGL/egl.h"
8 #include "../EGL/eglext.h"
9 
10 #if !defined(EGL_DRM_MASTER_FD_EXT)
11 #define EGL_DRM_MASTER_FD_EXT 0x333C
12 #endif
13 
14 #if !defined(EGL_CONSUMER_AUTO_ACQUIRE_EXT)
15 #define EGL_CONSUMER_AUTO_ACQUIRE_EXT 0x332B
16 #endif
17 
18 #if !defined(EGL_DRM_FLIP_EVENT_DATA_NV)
19 #define EGL_DRM_FLIP_EVENT_DATA_NV 0x33E
20 #endif
21 
22 /*
23  * Dynamically load all EGL function use, and look them up with dlsym if we're
24  * dynamically linked against the EGL library already (for the devices where an
25  * explicit library isn't defined). Since we synch a copy of the KHR EGL
26  * headers there shouldn't be a conflict with the locally defined ones.
27  */
28 typedef void* GLeglImageOES;
29 typedef void (EGLAPIENTRY* PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)(EGLenum target, GLeglImageOES image);
30 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLCHOOSECONFIGPROC)(EGLDisplay dpy, const EGLint *attrib_list,	EGLConfig *configs, EGLint config_size,	EGLint *num_config);
31 typedef EGLContext  (EGLAPIENTRY* PFNEGLCREATECONTEXTPROC)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
32 typedef EGLSurface  (EGLAPIENTRY* PFNEGLCREATEWINDOWSURFACEPROC)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
33 typedef EGLint      (EGLAPIENTRY* PFNEGLGETERRORPROC)(void);
34 typedef EGLDisplay  (EGLAPIENTRY* PFNEGLGETDISPLAYPROC)(EGLNativeDisplayType display_id);
35 typedef void* (EGLAPIENTRY* PFNEGLGETPROCADDRESSPROC)(const char *procname);
36 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLINITIALIZEPROC)
37 	(EGLDisplay dpy, EGLint *major, EGLint *minor);
38 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLMAKECURRENTPROC)
39 	(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
40 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLDESTROYCONTEXTPROC)
41 	(EGLDisplay dpy, EGLContext ctx);
42 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLDESTROYSURFACEPROC)
43 	(EGLDisplay dpy, EGLSurface surface);
44 typedef const char* (EGLAPIENTRY* PGNEGLQUERYSTRINGPROC)
45 	(EGLDisplay dpy, EGLint name);
46 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLSWAPBUFFERSPROC)
47 	(EGLDisplay dpy, EGLSurface surface);
48 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLSWAPINTERVALPROC)
49 	(EGLDisplay dpy, EGLint interval);
50 typedef EGLBoolean  (EGLAPIENTRY* PFNEGLTERMINATEPROC)
51 	(EGLDisplay dpy);
52 typedef EGLBoolean (EGLAPIENTRY* PFNEGLBINDAPIPROC)(EGLenum);
53 typedef EGLBoolean (EGLAPIENTRY* PFNEGLGETCONFIGSPROC)
54 	(EGLDisplay, EGLConfig*, EGLint, EGLint*);
55 typedef const char* (EGLAPIENTRY* PFNEGLQUERYSTRINGPROC)(EGLDisplay, EGLenum);
56 typedef EGLBoolean (EGLAPIENTRY* PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC)(EGLDisplay,
57 	EGLStreamKHR, const EGLAttrib*);
58 typedef EGLBoolean (EGLAPIENTRY* PFNEGLGETCONFIGATTRIBPROC)(EGLDisplay, EGLConfig, EGLint, EGLint*);
59 
60 struct egl_env {
61 /* EGLImage */
62 	PFNEGLCREATEIMAGEKHRPROC create_image;
63 	PFNEGLDESTROYIMAGEKHRPROC destroy_image;
64 	PFNGLEGLIMAGETARGETTEXTURE2DOESPROC image_target_texture2D;
65 
66 /* DMA-Buf */
67 	PFNEGLQUERYDMABUFFORMATSEXTPROC query_dmabuf_formats;
68 	PFNEGLQUERYDMABUFMODIFIERSEXTPROC query_dmabuf_modifiers;
69 	PFNEGLEXPORTDMABUFIMAGEMESAPROC export_dmabuf;
70 	PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC query_image_format;
71 
72 /* EGLStreams */
73 	PFNEGLQUERYDEVICESEXTPROC query_devices;
74 	PFNEGLQUERYDEVICESTRINGEXTPROC query_device_string;
75 	PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display;
76 	PFNEGLGETOUTPUTLAYERSEXTPROC get_output_layers;
77 	PFNEGLCREATESTREAMKHRPROC create_stream;
78 	PFNEGLDESTROYSTREAMKHRPROC destroy_stream;
79 	PFNEGLSTREAMCONSUMEROUTPUTEXTPROC stream_consumer_output;
80 	PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC create_stream_producer_surface;
81 	PFNEGLSTREAMCONSUMERACQUIREKHRPROC stream_consumer_acquire;
82 	PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC stream_consumer_acquire_attrib;
83 
84 /* Explicit Sync */
85 	PFNEGLCREATESYNCKHRPROC create_synch;
86 	PFNEGLWAITSYNCKHRPROC wait_synch;
87 	PFNEGLDESTROYSYNCKHRPROC destroy_synch;
88 	PFNEGLDUPNATIVEFENCEFDANDROIDPROC dup_fence_fd;
89 
90 /* Basic EGL */
91 	PFNEGLDESTROYSURFACEPROC destroy_surface;
92 	PFNEGLGETERRORPROC get_error;
93 	PFNEGLCREATEWINDOWSURFACEPROC create_window_surface;
94 	PFNEGLMAKECURRENTPROC make_current;
95 	PFNEGLGETDISPLAYPROC get_display;
96 	PFNEGLINITIALIZEPROC initialize;
97 	PFNEGLBINDAPIPROC bind_api;
98 	PFNEGLGETCONFIGSPROC get_configs;
99 	PFNEGLCHOOSECONFIGPROC choose_config;
100 	PFNEGLCREATECONTEXTPROC create_context;
101 	PFNEGLGETPROCADDRESSPROC get_proc_address;
102 	PFNEGLDESTROYCONTEXTPROC destroy_context;
103 	PFNEGLTERMINATEPROC terminate;
104 	PFNEGLQUERYSTRINGPROC query_string;
105 	PFNEGLSWAPBUFFERSPROC swap_buffers;
106 	PFNEGLSWAPINTERVALPROC swap_interval;
107 	PFNEGLGETCONFIGATTRIBPROC get_config_attrib;
108 };
109 
map_eglext_functions(struct egl_env * denv,void * (lookup)(void * tag,const char * sym,bool req),void * tag)110 static void map_eglext_functions(struct egl_env* denv,
111 	void*(lookup)(void* tag, const char* sym, bool req), void* tag)
112 {
113 /* Mapping dma_buf */
114 /* XXX: */
115 	denv->create_image = (PFNEGLCREATEIMAGEKHRPROC)
116 		lookup(tag, "eglCreateImageKHR", false);
117 /* XXX: */
118 	denv->destroy_image = (PFNEGLDESTROYIMAGEKHRPROC)
119 		lookup(tag, "eglDestroyImageKHR", false);
120 /* XXX: */
121 	denv->image_target_texture2D = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)
122 		lookup(tag, "glEGLImageTargetTexture2DOES", false);
123 
124 /* EGL_EXT_image_dma_buf_import_modifiers */
125 	denv->query_dmabuf_modifiers = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)
126 		lookup(tag, "eglQueryDmaBufModifiersEXT", false);
127 	denv->query_dmabuf_formats = (PFNEGLQUERYDMABUFFORMATSEXTPROC)
128 		lookup(tag, "eglQueryDmaBufFormatsEXT", false);
129 	denv->query_image_format = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)
130 		lookup(tag, "eglExportDMABUFImageQueryMESA", false);
131 	denv->export_dmabuf = (PFNEGLEXPORTDMABUFIMAGEMESAPROC)
132 		lookup(tag, "eglExportDMABUFImageMESA", false);
133 
134 /* EGLStreams */
135 /* "EGL_EXT_device_query"
136  * "EGL_EXT_device_enumeration"
137  * "EGL_EXT_device_query" */
138 
139 	denv->query_device_string = (PFNEGLQUERYDEVICESTRINGEXTPROC)
140 		lookup(tag, "eglQueryDeviceStringEXT", false);
141 	denv->query_devices = (PFNEGLQUERYDEVICESEXTPROC)
142 		lookup(tag, "eglQueryDevicesEXT", false);
143 	denv->get_platform_display = (PFNEGLGETPLATFORMDISPLAYEXTPROC)
144 		lookup(tag, "eglGetPlatformDisplayEXT", false );
145 	denv->get_output_layers = (PFNEGLGETOUTPUTLAYERSEXTPROC)
146 		lookup(tag, "eglGetOutputLayersEXT", false);
147 	denv->create_stream = (PFNEGLCREATESTREAMKHRPROC)
148 		lookup(tag, "eglCreateStreamKHR", false);
149 	denv->destroy_stream = (PFNEGLDESTROYSTREAMKHRPROC)
150 		lookup(tag, "eglDestroyStreamKHR", false);
151   denv->stream_consumer_output = (PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)
152 		lookup(tag, "eglStreamConsumerOutputEXT", false);
153 	denv->create_stream_producer_surface = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)
154 		lookup(tag, "eglCreateStreamProducerSurfaceKHR", false);
155 	denv->stream_consumer_acquire = (PFNEGLSTREAMCONSUMERACQUIREKHRPROC)
156 		lookup(tag, "eglStreamConsumerAcquireKHR", false);
157 	denv->stream_consumer_acquire_attrib = (PFNEGLSTREAMCONSUMERACQUIREATTRIBNVPROC)
158 		lookup(tag, "eglStreamConsumerAcquireAttribNV", false);
159 }
160 
map_egl_functions(struct egl_env * denv,void * (lookup)(void * tag,const char * sym,bool req),void * tag)161 static void map_egl_functions(struct egl_env* denv,
162 	void*(lookup)(void* tag, const char* sym, bool req), void* tag)
163 {
164 	denv->get_config_attrib =
165 		(PFNEGLGETCONFIGATTRIBPROC) lookup(tag, "eglGetConfigAttrib", true);
166 	denv->destroy_surface =
167 		(PFNEGLDESTROYSURFACEPROC) lookup(tag, "eglDestroySurface", true);
168 	denv->get_error =
169 		(PFNEGLGETERRORPROC) lookup(tag, "eglGetError", true);
170 	denv->create_window_surface =
171 		(PFNEGLCREATEWINDOWSURFACEPROC) lookup(tag, "eglCreateWindowSurface", true);
172 	denv->make_current =
173 		(PFNEGLMAKECURRENTPROC) lookup(tag, "eglMakeCurrent", true);
174 	denv->get_display =
175 		(PFNEGLGETDISPLAYPROC) lookup(tag, "eglGetDisplay", true);
176 	denv->initialize =
177 		(PFNEGLINITIALIZEPROC) lookup(tag, "eglInitialize", true);
178 	denv->bind_api =
179 		(PFNEGLBINDAPIPROC) lookup(tag, "eglBindAPI", true);
180 	denv->get_configs =
181 		(PFNEGLGETCONFIGSPROC) lookup(tag, "eglGetConfigs", true);
182 	denv->choose_config =
183 		(PFNEGLCHOOSECONFIGPROC) lookup(tag, "eglChooseConfig", true);
184 	denv->create_context =
185 		(PFNEGLCREATECONTEXTPROC) lookup(tag, "eglCreateContext", true);
186 	denv->destroy_context =
187 		(PFNEGLDESTROYCONTEXTPROC) lookup(tag, "eglDestroyContext", true);
188 	denv->terminate = (PFNEGLTERMINATEPROC) lookup(tag, "eglTerminate", true);
189 	denv->query_string =
190 		(PFNEGLQUERYSTRINGPROC) lookup(tag, "eglQueryString", true);
191 	denv->swap_buffers =
192 		(PFNEGLSWAPBUFFERSPROC) lookup(tag, "eglSwapBuffers", true);
193 	denv->swap_interval =
194 		(PFNEGLSWAPINTERVALPROC) lookup(tag, "eglSwapInterval", true);
195 	denv->create_synch =
196 		(PFNEGLCREATESYNCKHRPROC) lookup(tag, "eglCreateSyncKHR", false);
197 	denv->wait_synch =
198 		(PFNEGLWAITSYNCKHRPROC) lookup(tag, "eglWaitSyncKHR", false);
199 	denv->dup_fence_fd =
200 		(PFNEGLDUPNATIVEFENCEFDANDROIDPROC)
201 		lookup(tag, "eglDupNativeFenceFDANDROID", false);
202 }
203 
204 #endif
205