1 // SPDX-FileCopyrightText: Copyright 2012 Intel Corporation
2 // SPDX-License-Identifier: BSD-2-Clause
8 #include "wcore_error.h"
9 #include "wcore_platform.h"
11 struct wcore_platform
* cgl_platform_create(void);
12 struct wcore_platform
* droid_platform_create(void);
13 struct wcore_platform
* glx_platform_create(void);
14 struct wcore_platform
* wayland_platform_create(void);
15 struct wcore_platform
* xegl_platform_create(void);
16 struct wcore_platform
* wgbm_platform_create(void);
17 struct wcore_platform
* wgl_platform_create(void);
18 struct wcore_platform
* sl_platform_create(void);
21 waffle_init_parse_attrib_list(
22 const int32_t attrib_list
[],
25 bool found_platform
= false;
27 for (const int32_t *i
= attrib_list
; *i
!= 0; i
+= 2) {
28 const int32_t attr
= i
[0];
29 const int32_t value
= i
[1];
34 #define CASE_DEFINED_PLATFORM(name) \
35 case WAFFLE_PLATFORM_##name : \
36 found_platform = true; \
40 #define CASE_UNDEFINED_PLATFORM(name) \
41 case WAFFLE_PLATFORM_##name : \
42 wcore_errorf(WAFFLE_ERROR_BUILT_WITHOUT_SUPPORT, \
43 "waffle was built without support for WAFFLE_PLATFORM_" #name); \
46 #ifdef WAFFLE_HAS_ANDROID
47 CASE_DEFINED_PLATFORM(ANDROID
)
49 CASE_UNDEFINED_PLATFORM(ANDROID
)
53 CASE_DEFINED_PLATFORM(CGL
)
55 CASE_UNDEFINED_PLATFORM(CGL
)
59 CASE_DEFINED_PLATFORM(GLX
)
61 CASE_UNDEFINED_PLATFORM(GLX
)
64 #ifdef WAFFLE_HAS_WAYLAND
65 CASE_DEFINED_PLATFORM(WAYLAND
)
67 CASE_UNDEFINED_PLATFORM(WAYLAND
)
70 #ifdef WAFFLE_HAS_X11_EGL
71 CASE_DEFINED_PLATFORM(X11_EGL
)
73 CASE_UNDEFINED_PLATFORM(X11_EGL
)
77 CASE_DEFINED_PLATFORM(GBM
)
79 CASE_UNDEFINED_PLATFORM(GBM
)
83 CASE_DEFINED_PLATFORM(WGL
)
85 CASE_UNDEFINED_PLATFORM(WGL
)
88 #ifdef WAFFLE_HAS_SURFACELESS_EGL
89 CASE_DEFINED_PLATFORM(SURFACELESS_EGL
)
91 CASE_UNDEFINED_PLATFORM(SURFACELESS_EGL
)
95 wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE
,
96 "WAFFLE_PLATFORM has bad value 0x%x",
100 #undef CASE_DEFINED_PLATFORM
101 #undef CASE_UNDEFINED_PLATFORM
106 wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE
,
107 "bad attribute name %#x", attr
);
113 if (!found_platform
) {
114 wcore_errorf(WAFFLE_ERROR_BAD_ATTRIBUTE
,
115 "attribute list is missing WAFFLE_PLATFORM");
122 static struct wcore_platform
*
123 waffle_init_create_platform(int32_t waffle_platform
)
125 struct wcore_platform
*wc_platform
= NULL
;
127 switch (waffle_platform
) {
128 #ifdef WAFFLE_HAS_ANDROID
129 case WAFFLE_PLATFORM_ANDROID
:
130 wc_platform
= droid_platform_create();
133 #ifdef WAFFLE_HAS_CGL
134 case WAFFLE_PLATFORM_CGL
:
135 wc_platform
= cgl_platform_create();
138 #ifdef WAFFLE_HAS_GLX
139 case WAFFLE_PLATFORM_GLX
:
140 wc_platform
= glx_platform_create();
143 #ifdef WAFFLE_HAS_WAYLAND
144 case WAFFLE_PLATFORM_WAYLAND
:
145 wc_platform
= wayland_platform_create();
148 #ifdef WAFFLE_HAS_X11_EGL
149 case WAFFLE_PLATFORM_X11_EGL
:
150 wc_platform
= xegl_platform_create();
153 #ifdef WAFFLE_HAS_GBM
154 case WAFFLE_PLATFORM_GBM
:
155 wc_platform
= wgbm_platform_create();
158 #ifdef WAFFLE_HAS_WGL
159 case WAFFLE_PLATFORM_WGL
:
160 wc_platform
= wgl_platform_create();
163 #ifdef WAFFLE_HAS_SURFACELESS_EGL
164 case WAFFLE_PLATFORM_SURFACELESS_EGL
:
165 wc_platform
= sl_platform_create();
174 wc_platform
->waffle_platform
= waffle_platform
;
180 waffle_init(const int32_t *attrib_list
)
188 wcore_error(WAFFLE_ERROR_ALREADY_INITIALIZED
);
192 ok
&= waffle_init_parse_attrib_list(attrib_list
, &platform
);
196 api_platform
= waffle_init_create_platform(platform
);
204 waffle_teardown(void)
211 wcore_error(WAFFLE_ERROR_NOT_INITIALIZED
);
215 ok
&= api_platform
->vtbl
->destroy(api_platform
);