Skip to content

Commit 566b9bd

Browse files
authored
webOS: add Wayland support (#18563)
1 parent ee46f80 commit 566b9bd

11 files changed

Lines changed: 1043 additions & 11 deletions

File tree

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,14 @@ gfx/common/wayland/single-pixel-buffer-v1.h
242242
gfx/common/wayland/single-pixel-buffer-v1.c
243243
gfx/common/wayland/xdg-toplevel-icon-v1.h
244244
gfx/common/wayland/xdg-toplevel-icon-v1.c
245+
gfx/common/wayland/webos-foreign.c
246+
gfx/common/wayland/webos-foreign.h
247+
gfx/common/wayland/webos-input-manager.c
248+
gfx/common/wayland/webos-input-manager.h
249+
gfx/common/wayland/webos-shell.c
250+
gfx/common/wayland/webos-shell.h
251+
gfx/common/wayland/webos-surface-group.c
252+
gfx/common/wayland/webos-surface-group.h
245253

246254
# libretro-common samples
247255
libretro-common/samples/streams/rzip/rzip

Makefile.common

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,14 @@ ifeq ($(HAVE_WAYLAND), 1)
12891289
OBJ += gfx/drivers_context/wayland_vk_ctx.o
12901290
endif
12911291

1292+
ifeq ($(WEBOS), 1)
1293+
OBJ += input/common/wayland_common_webos.o
1294+
OBJ += gfx/common/wayland/webos-foreign.o
1295+
OBJ += gfx/common/wayland/webos-input-manager.o
1296+
OBJ += gfx/common/wayland/webos-shell.o
1297+
OBJ += gfx/common/wayland/webos-surface-group.o
1298+
endif
1299+
12921300
DEF_FLAGS += $(WAYLAND_CFLAGS) $(WAYLAND_CURSOR_CFLAGS)
12931301
LIBS += $(WAYLAND_LIBS) $(WAYLAND_CURSOR_LIBS)
12941302

Makefile.webos

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ SDL2_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/downloa
2626
APP_PACKAGE_NAME ?= com.retroarch.webos
2727
IPK_VERSION := $(shell grep '#define PACKAGE_VERSION' version.all | sed -E 's/.*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/')
2828

29+
WEBOS = 1
2930
DEBUG ?= 0
3031

3132
HAVE_CLOUDSYNC = 1
@@ -60,7 +61,7 @@ HAVE_CXX = 1
6061
HAVE_DR_MP3 = 1
6162
HAVE_DYNAMIC = 1
6263
HAVE_DYLIB = 1
63-
HAVE_EGL = 0
64+
HAVE_EGL ?= 0
6465
HAVE_FREETYPE = 1
6566
HAVE_GDI = 0
6667
HAVE_GETADDRINFO = 1
@@ -76,6 +77,7 @@ HAVE_GLSLANG_SPIRV_TOOLS_OPT = 0
7677
HAVE_HID = 1
7778
HAVE_IBXM = 1
7879
HAVE_IMAGEVIEWER = 1
80+
HAVE_XKBCOMMON ?= 0
7981
HAVE_LANGEXTRA = 1
8082
HAVE_LIBRETRODB = 1
8183
HAVE_MENU = 1
@@ -94,9 +96,9 @@ HAVE_OPENGL = 0
9496
HAVE_OPENGL1 = 0
9597
HAVE_OPENGL_CORE = 0
9698
HAVE_OPENGLES = 1
97-
HAVE_OPENGLES3 = 0
98-
HAVE_OPENGLES3_1 = 0
99-
HAVE_OPENGLES3_2 = 0
99+
HAVE_OPENGLES3 ?= 0
100+
HAVE_OPENGLES3_1 ?= 0
101+
HAVE_OPENGLES3_2 ?= 0
100102
HAVE_OPENSSL = 0
101103
HAVE_OVERLAY = 1
102104
HAVE_PULSE = 1
@@ -129,7 +131,9 @@ HAVE_LIBSHAKE = 1
129131
HAVE_UPDATE_ASSETS = 1
130132
HAVE_UPDATE_CORES = 1
131133
HAVE_UPDATE_CORE_INFO = 1
134+
HAVE_USERLAND ?= 0
132135
HAVE_CORE_INFO_CACHE = 1
136+
HAVE_WAYLAND ?= 0
133137

134138
OS = Linux
135139
TARGET = retroarch
@@ -147,6 +151,7 @@ else
147151
HAVE_NEON = 1
148152
endif
149153
CFLAGS := $(ARCHFLAGS)
154+
CFLAGS += -DWEBOS_APP_ID=\"$(APP_PACKAGE_NAME)\"
150155
CXXFLAGS := $(ARCHFLAGS) -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS
151156
ASFLAGS := $(ARCHFLAGS)
152157
LDFLAGS := -Wl,-rpath=\$$ORIGIN/lib,--gc-sections
@@ -162,21 +167,35 @@ DEFINES += -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_A
162167
DEFINES += -DHAVE_NETWORKGAMEPAD
163168
DEFINES += -DHAVE_FREETYPE
164169
DEFINES += -DHAVE_UPDATE_CORE_INFO
170+
EGL_LIBS = -lEGL
171+
OPENGLES_LIBS = -lGLESv2
172+
XKBCOMMON_LIBS = -lxkbcommon
173+
WAYLAND_PROTO_SCRIPT := ./gfx/common/wayland/generate_wayland_protos.sh
174+
ifeq ($(HAVE_XKBCOMMON), 1)
175+
DEFINES += -DHAVE_XKBCOMMON=1
176+
endif
165177
ifneq (,$(filter 1,$(HAVE_OPENGLES3) $(HAVE_OPENGLES3_1) $(HAVE_OPENGLES3_2)))
166178
DEFINES += -DHAVE_OPENGLES3
167179
endif
168180
ifeq ($(HAVE_OPENGLES3_1),1)
169-
DEFINES += -DHAVE_OPENGLES3_1
181+
DEFINES += -DHAVE_OPENGLES3_1
170182
endif
171183
ifeq ($(HAVE_OPENGLES3_2),1)
172-
DEFINES += -DHAVE_OPENGLES3_2
184+
DEFINES += -DHAVE_OPENGLES3_2
185+
endif
186+
ifeq ($(HAVE_WAYLAND),1)
187+
DEFINES += -DHAVE_WAYLAND=1
188+
WAYLAND_LIBS = -lwayland-client -lwayland-cursor -lwayland-egl
189+
endif
190+
ifeq ($(HAVE_USERLAND),1)
191+
DEFINES += -DHAVE_USERLAND
192+
WAYLAND_LIBS += -lhelpers
173193
endif
174194

175195
PKG_CONFIG=pkg-config
176196

177197
SDL2_CFLAGS := $(shell $(PKG_CONFIG) --cflags sdl2)
178198
SDL2_LIBS := $(shell $(PKG_CONFIG) --libs sdl2)
179-
OPENGLES_LIBS = -lGLESv2
180199
PULSE_LIBS = $(shell $(PKG_CONFIG) --libs libpulse)
181200
FREETYPE_CFLAGS := $(shell $(PKG_CONFIG) --cflags freetype2)
182201
FREETYPE_LIBS := $(shell $(PKG_CONFIG) --libs freetype2)
@@ -260,6 +279,12 @@ endif
260279

261280
SYMBOL_MAP := -Wl,-Map=output.map
262281

282+
prebuild:
283+
ifeq ($(HAVE_WAYLAND),1)
284+
@echo "Generating Wayland protocols..."
285+
@$(SHELL) $(WAYLAND_PROTO_SCRIPT)
286+
endif
287+
263288
$(TARGET): $(RARCH_OBJ)
264289
@$(if $(Q), $(shell echo echo LD $@),)
265290
$(Q)$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
@@ -300,7 +325,7 @@ ifeq ($(ADD_SDL2_LIB), 1)
300325
wget -qO - $(SDL2_PREBUILT_ARCHIVE) | tar -C SDL -zxvf -
301326
endif
302327

303-
ipk: $(TARGET) sdl2
328+
ipk: prebuild $(TARGET) sdl2
304329
rm -rf webos/dist
305330
mkdir -p webos/dist/lib
306331
echo "$$APPINFO" > webos/dist/appinfo.json
@@ -321,7 +346,7 @@ install: ipk
321346
launch: install
322347
ares-launch $(APP_PACKAGE_NAME)
323348

324-
.PHONY: all clean ipk
349+
.PHONY: all clean prebuild ipk
325350

326351
print-%:
327352
@echo '$*=$($*)'

gfx/common/wayland/generate_wayland_protos.sh

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,22 @@ while [ $# -gt 0 ]; do
3131
done
3232

3333
WAYSCAN="$(exists wayland-scanner || :)"
34+
35+
if [ -n "${CROSS_COMPILE:-}" ] && echo "${CROSS_COMPILE:-}" | grep -q "webos"; then
36+
if [ -z "${SDK_PATH:-}" ]; then
37+
die 1 "Error: WEBOS=1 but SDK_PATH not set"
38+
fi
39+
WAYSCAN="$SDK_PATH/bin/wayland-scanner"
40+
fi
41+
3442
PKGCONFIG="$(exists pkg-config || :)"
3543

3644
[ "${WAYSCAN}" ] || die 1 "Error: No wayscan in ($PATH)"
3745

3846
WAYLAND_PROTOS=''
3947

4048
if [ "$PROTOS" != 'no' -a "$PKGCONFIG" ]; then
41-
WAYLAND_PROTOS="$($PKGCONFIG wayland-protocols --variable=pkgdatadir)"
49+
WAYLAND_PROTOS="$($PKGCONFIG wayland-protocols --variable=pkgdatadir 2>/dev/null || true)"
4250
fi
4351

4452
if [ -z "${WAYLAND_PROTOS}" ]; then
@@ -74,3 +82,15 @@ generate_source 'unstable/tablet' 'tablet-unstable-v2'
7482
generate_source 'staging/content-type' 'content-type-v1'
7583
generate_source 'staging/single-pixel-buffer' 'single-pixel-buffer-v1'
7684
generate_source 'staging/xdg-toplevel-icon' 'xdg-toplevel-icon-v1'
85+
86+
if [ -n "${CROSS_COMPILE:-}" ] && echo "${CROSS_COMPILE:-}" | grep -q "webos"; then
87+
if [ -z "${SDK_PATH:-}" ]; then
88+
die 1 "Error: WEBOS=1 but SDK_PATH not set"
89+
fi
90+
WAYLAND_PROTOS="$SDK_PATH/arm-webos-linux-gnueabi/sysroot/usr/share"
91+
92+
generate_source 'wayland-webos' 'webos-shell'
93+
generate_source 'wayland-webos' 'webos-foreign'
94+
generate_source 'wayland-webos' 'webos-surface-group'
95+
generate_source 'wayland-webos' 'webos-input-manager'
96+
fi

gfx/drivers_context/wayland_ctx.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,26 @@
4646
#define EGL_PLATFORM_WAYLAND_KHR 0x31D8
4747
#endif
4848

49+
#ifdef WEBOS
50+
extern void gfx_ctx_wl_get_video_size_webos(void*, unsigned*, unsigned*);
51+
extern void gfx_ctx_wl_destroy_resources_webos(gfx_ctx_wayland_data_t*);
52+
extern void gfx_ctx_wl_update_title_webos(void*);
53+
extern bool gfx_ctx_wl_init_webos(const toplevel_listener_t*, gfx_ctx_wayland_data_t**);
54+
extern bool gfx_ctx_wl_set_video_mode_common_size_webos(gfx_ctx_wayland_data_t*, unsigned, unsigned, bool);
55+
extern bool gfx_ctx_wl_set_video_mode_common_fullscreen_webos(gfx_ctx_wayland_data_t*, bool);
56+
extern bool gfx_ctx_wl_suppress_screensaver_webos(void*, bool);
57+
extern void gfx_ctx_wl_check_window_webos(gfx_ctx_wayland_data_t*, void (*)(void*, unsigned*, unsigned*), bool*, bool*, unsigned*, unsigned*);
58+
59+
#define gfx_ctx_wl_get_video_size_common gfx_ctx_wl_get_video_size_webos
60+
#define gfx_ctx_wl_destroy_resources_common gfx_ctx_wl_destroy_resources_webos
61+
#define gfx_ctx_wl_update_title_common gfx_ctx_wl_update_title_webos
62+
#define gfx_ctx_wl_init_common gfx_ctx_wl_init_webos
63+
#define gfx_ctx_wl_set_video_mode_common_size gfx_ctx_wl_set_video_mode_common_size_webos
64+
#define gfx_ctx_wl_set_video_mode_common_fullscreen gfx_ctx_wl_set_video_mode_common_fullscreen_webos
65+
#define gfx_ctx_wl_suppress_screensaver gfx_ctx_wl_suppress_screensaver_webos
66+
#define gfx_ctx_wl_check_window_common gfx_ctx_wl_check_window_webos
67+
#endif
68+
4969
static enum gfx_ctx_api wl_api = GFX_CTX_NONE;
5070

5171
/* Shell surface callbacks. */

input/common/wayland_common.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,7 +1120,11 @@ const struct wl_keyboard_listener keyboard_listener = {
11201120
wl_keyboard_handle_keymap,
11211121
wl_keyboard_handle_enter,
11221122
wl_keyboard_handle_leave,
1123+
#ifdef WEBOS
1124+
wl_keyboard_handle_key_webos,
1125+
#else
11231126
wl_keyboard_handle_key,
1127+
#endif
11241128
wl_keyboard_handle_modifiers,
11251129
wl_keyboard_handle_repeat_info
11261130
};

input/common/wayland_common.h

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@
4646
#include "../../gfx/common/wayland/xdg-shell.h"
4747
#include "../../gfx/common/wayland/xdg-toplevel-icon-v1.h"
4848

49+
#ifdef WEBOS
50+
#include "wayland_common_webos.h"
51+
#endif
52+
4953
#define FRACTIONAL_SCALE_V1_DEN 120
5054
#define FRACTIONAL_SCALE_MULT(v, scale_num) \
5155
(((v) * (scale_num) + FRACTIONAL_SCALE_V1_DEN / 2) / FRACTIONAL_SCALE_V1_DEN)
@@ -171,6 +175,15 @@ typedef struct gfx_ctx_wayland_data
171175
struct wl_shm *shm;
172176
struct wl_data_device_manager *data_device_manager;
173177
struct wl_data_device *data_device;
178+
#ifdef WEBOS
179+
struct wl_shell *shell;
180+
struct wl_shell_surface *shell_surface;
181+
struct wl_webos_shell *webos_shell;
182+
struct wl_webos_shell_surface *webos_shell_surface;
183+
struct wl_webos_foreign *webos_foreign;
184+
struct wl_webos_surface_group_compositor *webos_surface_group_compositor;
185+
struct wl_webos_input_manager *webos_input_manager;
186+
#endif
174187
data_offer_ctx *current_drag_offer;
175188
#ifdef HAVE_LIBDECOR_H
176189
struct libdecor *libdecor_context;
@@ -201,6 +214,9 @@ typedef struct gfx_ctx_wayland_data
201214
struct wl_list all_outputs;
202215
struct wl_list current_outputs;
203216

217+
#ifdef WEBOS
218+
struct wl_list all_seats;
219+
#endif
204220
struct
205221
{
206222
struct wl_cursor *default_cursor;
@@ -225,7 +241,9 @@ typedef struct gfx_ctx_wayland_data
225241
unsigned last_fractional_scale_num;
226242
unsigned pending_fractional_scale_num;
227243
unsigned fractional_scale_num;
228-
244+
#ifdef WEBOS
245+
uint32_t webos_surface_state;
246+
#endif
229247
bool core_hw_context_enable;
230248
bool fullscreen;
231249
bool maximized;
@@ -280,4 +298,9 @@ extern const struct wl_data_device_listener data_device_listener;
280298

281299
extern const struct wl_data_offer_listener data_offer_listener;
282300

301+
#ifdef WEBOS
302+
extern void wl_keyboard_handle_key_webos(void *data, struct wl_keyboard *keyboard, uint32_t serial,
303+
uint32_t time, uint32_t key, uint32_t state);
304+
#endif
305+
283306
#endif

0 commit comments

Comments
 (0)