Skip to content

Commit d890210

Browse files
committed
Initial (incomplete) SDL-based window subsystem
1 parent a8f32b7 commit d890210

12 files changed

Lines changed: 411 additions & 13 deletions

File tree

gradle/libs.versions.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jspecify-annotations = { module = "org.jspecify:jspecify", version = "1.0.0" }
3838
androidsvg = { group = "com.caverock", name = "androidsvg-aar", version.ref = "androidsvg" }
3939
lwjgl-core = { group = "org.lwjgl", name = "lwjgl", version.ref = "lwjgl" }
4040
lwjgl-glfw = { group = "org.lwjgl", name = "lwjgl-glfw", version.ref = "lwjgl" }
41+
lwjgl-sdl = { group = "org.lwjgl", name = "lwjgl-sdl", version.ref = "lwjgl" }
4142
lwjgl-jemalloc = { group = "org.lwjgl", name = "lwjgl-jemalloc", version.ref = "lwjgl" }
4243
lwjgl-opengl = { group = "org.lwjgl", name = "lwjgl-opengl", version.ref = "lwjgl" }
4344
lwjgl-vulkan = { group = "org.lwjgl", name = "lwjgl-vulkan", version.ref = "lwjgl" }
@@ -81,6 +82,6 @@ jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose" }
8182

8283

8384
[bundles]
84-
lwjgl = ["lwjgl-core", "lwjgl-glfw", "lwjgl-jemalloc", "lwjgl-opengl", "lwjgl-vulkan", "lwjgl-vma", "lwjgl-shaderc", "lwjgl-nfd", "lwjgl-stb", "lwjgl-jawt", "lwjgl-msdfgen"]
85+
lwjgl = ["lwjgl-core", "lwjgl-glfw", "lwjgl-sdl", "lwjgl-jemalloc", "lwjgl-opengl", "lwjgl-vulkan", "lwjgl-vma", "lwjgl-shaderc", "lwjgl-nfd", "lwjgl-stb", "lwjgl-jawt", "lwjgl-msdfgen"]
8586
wgpu4k = ["wgpu4k", "webgpu-descriptors"]
8687
wgpu4k-surface-utils = ["rococoa", "jna", "jna-platform"]

kool-core/src/androidMain/kotlin/de/fabmax/kool/platform/AndroidWindow.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class AndroidWindow(val ctx: KoolContextAndroid, config: KoolConfigAndroid) : Ko
1616

1717
override val parentScreenScale: Float
1818

19-
override var positionInScreen: Vec2i
19+
override var positionOnScreen: Vec2i
2020
get() = Vec2i(0, 0)
2121
set(value) {}
2222

kool-core/src/commonMain/kotlin/de/fabmax/kool/KoolWindow.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ interface KoolWindow {
1414
/**
1515
* Window position in scaled screen space (i.e., considering [parentScreenScale]).
1616
*/
17-
var positionInScreen: Vec2i
17+
var positionOnScreen: Vec2i
1818

1919
/**
2020
* Window size in scaled screen space (i.e., considering [parentScreenScale]). For example, a full-screen
@@ -96,6 +96,7 @@ data class WindowFlags(
9696
val isMaximized: Boolean = false,
9797
val isMinimized: Boolean = false,
9898
val isVisible: Boolean = false,
99+
val isOccluded: Boolean = false,
99100
val isFocused: Boolean = false,
100101
val isHiddenTitleBar: Boolean = false,
101102
)

kool-core/src/desktopMain/kotlin/de/fabmax/kool/platform/glfw/GlfwWindow.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class GlfwWindow(val clientApi: ClientApi, val ctx: Lwjgl3Context) : KoolWindowJ
3636

3737
override var parentScreenScale: Float = 1f; private set
3838

39-
override var positionInScreen: Vec2i
39+
override var positionOnScreen: Vec2i
4040
get() = _screenPos
4141
set(value) {
4242
_screenPos = value
@@ -247,7 +247,7 @@ class GlfwWindow(val clientApi: ClientApi, val ctx: Lwjgl3Context) : KoolWindowJ
247247
}
248248

249249
private fun enableFullscreen() {
250-
windowedPos = positionInScreen
250+
windowedPos = positionOnScreen
251251
windowedSize = sizeOnScreen
252252
val vidMode = glfwGetVideoMode(fsMonitor)!!
253253
glfwSetWindowMonitor(

kool-core/src/desktopMain/kotlin/de/fabmax/kool/platform/glfw/PlatformWindowHelper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ class PlatformWindowHelperWindows(val glfwWindow: GlfwWindow) : PlatformWindowHe
7777
WM_NCHITTEST -> {
7878
val y = lParam.toInt() shr 16
7979
val x = lParam.toInt() and 0xffff
80-
val clientX = x - glfwWindow.positionInScreen.x - nonTopBorder
81-
val clientY = y - glfwWindow.positionInScreen.y - topBorder
80+
val clientX = x - glfwWindow.positionOnScreen.x - nonTopBorder
81+
val clientY = y - glfwWindow.positionOnScreen.y - topBorder
8282
val resizeBorder = 4
8383

8484
if (clientY < resizeBorder && !isMaximized) {
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package de.fabmax.kool.platform.sdl
2+
3+
import de.fabmax.kool.KoolSystem
4+
import de.fabmax.kool.input.*
5+
import de.fabmax.kool.util.logE
6+
import org.lwjgl.sdl.SDLKeycode.*
7+
import org.lwjgl.sdl.SDLScancode.*
8+
import org.lwjgl.sdl.SDL_KeyboardEvent
9+
import org.lwjgl.sdl.SDL_MouseButtonEvent
10+
import org.lwjgl.sdl.SDL_MouseMotionEvent
11+
import org.lwjgl.sdl.SDL_MouseWheelEvent
12+
13+
class SdlInput(val window: SdlWindow) : PlatformInput {
14+
15+
override fun setCursorMode(cursorMode: CursorMode) {
16+
logE { "setCursorMode not yet implemented" }
17+
}
18+
19+
override fun applyCursorShape(cursorShape: CursorShape) {
20+
logE { "applyCursorShape not yet implemented" }
21+
}
22+
23+
internal fun handleMouseMotion(event: SDL_MouseMotionEvent) {
24+
val baseScale = if (KoolSystem.platform.isMacOs /*|| isWayland*/) window.parentScreenScale else 1f
25+
val scale = baseScale * window.renderResolutionFactor
26+
PointerInput.handleMouseMove(event.x() * scale, event.y() * scale)
27+
}
28+
29+
internal fun handleMouseWheel(event: SDL_MouseWheelEvent) {
30+
PointerInput.handleMouseScroll(event.x(), event.y())
31+
}
32+
33+
internal fun handleMouseButton(event: SDL_MouseButtonEvent) {
34+
val button = event.button().toInt()
35+
val down = event.down()
36+
PointerInput.handleMouseButtonEvent(button, down)
37+
}
38+
39+
internal fun handleKey(event: SDL_KeyboardEvent) {
40+
val type = when {
41+
event.repeat() -> KeyboardInput.KEY_EV_REPEATED
42+
event.down() -> KeyboardInput.KEY_EV_DOWN
43+
else -> KeyboardInput.KEY_EV_UP
44+
}
45+
val keyCode = sdlScancodesToKeys[event.scancode()] ?: UniversalKeyCode(event.key()).also { println("unmapped: ${event.scancode()}") }
46+
47+
val sdlMod = event.mod().toInt()
48+
var modifiers = 0
49+
if (sdlMod and SDL_KMOD_SHIFT != 0) modifiers = modifiers or KeyboardInput.KEY_MOD_SHIFT
50+
if (sdlMod and SDL_KMOD_CTRL != 0) modifiers = modifiers or KeyboardInput.KEY_MOD_CTRL
51+
if (sdlMod and SDL_KMOD_ALT != 0) modifiers = modifiers or KeyboardInput.KEY_MOD_ALT
52+
if (sdlMod and SDL_KMOD_GUI != 0) modifiers = modifiers or KeyboardInput.KEY_MOD_SUPER
53+
54+
val ev = KeyEvent(
55+
keyCode = keyCode,
56+
localKeyCode = LocalKeyCode(event.key()),
57+
event = type,
58+
modifiers = modifiers
59+
)
60+
KeyboardInput.handleKeyEvent(ev)
61+
}
62+
63+
companion object {
64+
private val sdlScancodesToKeys = mapOf(
65+
SDL_SCANCODE_A to UniversalKeyCode('A'),
66+
SDL_SCANCODE_B to UniversalKeyCode('B'),
67+
SDL_SCANCODE_C to UniversalKeyCode('C'),
68+
SDL_SCANCODE_D to UniversalKeyCode('D'),
69+
SDL_SCANCODE_E to UniversalKeyCode('E'),
70+
SDL_SCANCODE_F to UniversalKeyCode('F'),
71+
SDL_SCANCODE_G to UniversalKeyCode('G'),
72+
SDL_SCANCODE_H to UniversalKeyCode('H'),
73+
SDL_SCANCODE_I to UniversalKeyCode('I'),
74+
SDL_SCANCODE_J to UniversalKeyCode('J'),
75+
SDL_SCANCODE_K to UniversalKeyCode('K'),
76+
SDL_SCANCODE_L to UniversalKeyCode('L'),
77+
SDL_SCANCODE_M to UniversalKeyCode('M'),
78+
SDL_SCANCODE_N to UniversalKeyCode('N'),
79+
SDL_SCANCODE_O to UniversalKeyCode('O'),
80+
SDL_SCANCODE_P to UniversalKeyCode('P'),
81+
SDL_SCANCODE_Q to UniversalKeyCode('Q'),
82+
SDL_SCANCODE_R to UniversalKeyCode('R'),
83+
SDL_SCANCODE_S to UniversalKeyCode('S'),
84+
SDL_SCANCODE_T to UniversalKeyCode('T'),
85+
SDL_SCANCODE_U to UniversalKeyCode('U'),
86+
SDL_SCANCODE_V to UniversalKeyCode('V'),
87+
SDL_SCANCODE_W to UniversalKeyCode('W'),
88+
SDL_SCANCODE_X to UniversalKeyCode('X'),
89+
SDL_SCANCODE_Y to UniversalKeyCode('Y'),
90+
SDL_SCANCODE_Z to UniversalKeyCode('Z'),
91+
92+
SDL_SCANCODE_1 to UniversalKeyCode('1'),
93+
SDL_SCANCODE_2 to UniversalKeyCode('2'),
94+
SDL_SCANCODE_3 to UniversalKeyCode('3'),
95+
SDL_SCANCODE_4 to UniversalKeyCode('4'),
96+
SDL_SCANCODE_5 to UniversalKeyCode('5'),
97+
SDL_SCANCODE_6 to UniversalKeyCode('6'),
98+
SDL_SCANCODE_7 to UniversalKeyCode('7'),
99+
SDL_SCANCODE_8 to UniversalKeyCode('8'),
100+
SDL_SCANCODE_9 to UniversalKeyCode('9'),
101+
SDL_SCANCODE_0 to UniversalKeyCode('0'),
102+
103+
SDL_SCANCODE_SPACE to UniversalKeyCode(' '),
104+
SDL_SCANCODE_MINUS to UniversalKeyCode('-'),
105+
SDL_SCANCODE_EQUALS to UniversalKeyCode('='),
106+
SDL_SCANCODE_LEFTBRACKET to UniversalKeyCode('['),
107+
SDL_SCANCODE_RIGHTBRACKET to UniversalKeyCode(']'),
108+
SDL_SCANCODE_SEMICOLON to UniversalKeyCode(';'),
109+
SDL_SCANCODE_APOSTROPHE to UniversalKeyCode('\''),
110+
SDL_SCANCODE_GRAVE to UniversalKeyCode('`'),
111+
SDL_SCANCODE_COMMA to UniversalKeyCode(','),
112+
SDL_SCANCODE_PERIOD to UniversalKeyCode('.'),
113+
SDL_SCANCODE_SLASH to UniversalKeyCode('/'),
114+
SDL_SCANCODE_BACKSLASH to UniversalKeyCode('\\'),
115+
SDL_SCANCODE_NONUSBACKSLASH to UniversalKeyCode('\\'),
116+
117+
SDL_SCANCODE_LCTRL to KeyboardInput.KEY_CTRL_LEFT,
118+
SDL_SCANCODE_RCTRL to KeyboardInput.KEY_CTRL_RIGHT,
119+
SDL_SCANCODE_LSHIFT to KeyboardInput.KEY_SHIFT_LEFT,
120+
SDL_SCANCODE_RSHIFT to KeyboardInput.KEY_SHIFT_RIGHT,
121+
SDL_SCANCODE_LALT to KeyboardInput.KEY_ALT_LEFT,
122+
SDL_SCANCODE_RALT to KeyboardInput.KEY_ALT_RIGHT,
123+
SDL_SCANCODE_LGUI to KeyboardInput.KEY_SUPER_LEFT,
124+
SDL_SCANCODE_RGUI to KeyboardInput.KEY_SUPER_RIGHT,
125+
SDL_SCANCODE_ESCAPE to KeyboardInput.KEY_ESC,
126+
SDL_SCANCODE_MENU to KeyboardInput.KEY_MENU,
127+
SDL_SCANCODE_RETURN to KeyboardInput.KEY_ENTER,
128+
SDL_SCANCODE_KP_ENTER to KeyboardInput.KEY_NP_ENTER,
129+
SDL_SCANCODE_KP_DIVIDE to KeyboardInput.KEY_NP_DIV,
130+
SDL_SCANCODE_KP_MULTIPLY to KeyboardInput.KEY_NP_MUL,
131+
SDL_SCANCODE_KP_PLUS to KeyboardInput.KEY_NP_PLUS,
132+
SDL_SCANCODE_KP_MINUS to KeyboardInput.KEY_NP_MINUS,
133+
SDL_SCANCODE_KP_PERIOD to KeyboardInput.KEY_NP_DECIMAL,
134+
SDL_SCANCODE_BACKSPACE to KeyboardInput.KEY_BACKSPACE,
135+
SDL_SCANCODE_TAB to KeyboardInput.KEY_TAB,
136+
SDL_SCANCODE_DELETE to KeyboardInput.KEY_DEL,
137+
SDL_SCANCODE_INSERT to KeyboardInput.KEY_INSERT,
138+
SDL_SCANCODE_HOME to KeyboardInput.KEY_HOME,
139+
SDL_SCANCODE_END to KeyboardInput.KEY_END,
140+
SDL_SCANCODE_PAGEUP to KeyboardInput.KEY_PAGE_UP,
141+
SDL_SCANCODE_PAGEDOWN to KeyboardInput.KEY_PAGE_DOWN,
142+
SDL_SCANCODE_LEFT to KeyboardInput.KEY_CURSOR_LEFT,
143+
SDL_SCANCODE_RIGHT to KeyboardInput.KEY_CURSOR_RIGHT,
144+
SDL_SCANCODE_UP to KeyboardInput.KEY_CURSOR_UP,
145+
SDL_SCANCODE_DOWN to KeyboardInput.KEY_CURSOR_DOWN,
146+
SDL_SCANCODE_F1 to KeyboardInput.KEY_F1,
147+
SDL_SCANCODE_F2 to KeyboardInput.KEY_F2,
148+
SDL_SCANCODE_F3 to KeyboardInput.KEY_F3,
149+
SDL_SCANCODE_F4 to KeyboardInput.KEY_F4,
150+
SDL_SCANCODE_F5 to KeyboardInput.KEY_F5,
151+
SDL_SCANCODE_F6 to KeyboardInput.KEY_F6,
152+
SDL_SCANCODE_F7 to KeyboardInput.KEY_F7,
153+
SDL_SCANCODE_F8 to KeyboardInput.KEY_F8,
154+
SDL_SCANCODE_F9 to KeyboardInput.KEY_F9,
155+
SDL_SCANCODE_F10 to KeyboardInput.KEY_F10,
156+
SDL_SCANCODE_F11 to KeyboardInput.KEY_F11,
157+
SDL_SCANCODE_F12 to KeyboardInput.KEY_F12,
158+
)
159+
}
160+
}
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package de.fabmax.kool.platform.sdl
2+
3+
import de.fabmax.kool.*
4+
import de.fabmax.kool.math.Vec2i
5+
import de.fabmax.kool.modules.ui2.UiScale
6+
import de.fabmax.kool.platform.KoolWindowJvm
7+
import de.fabmax.kool.platform.Lwjgl3Context
8+
import de.fabmax.kool.util.*
9+
import org.lwjgl.sdl.SDLEvents.*
10+
import org.lwjgl.sdl.SDLVideo.SDL_GetWindowDisplayScale
11+
import org.lwjgl.sdl.SDLVideo.SDL_GetWindowPosition
12+
import org.lwjgl.sdl.SDLVulkan.SDL_Vulkan_CreateSurface
13+
import org.lwjgl.sdl.SDLVulkan.SDL_Vulkan_DestroySurface
14+
import org.lwjgl.sdl.SDL_Event
15+
import org.lwjgl.sdl.SDL_WindowEvent
16+
import org.lwjgl.vulkan.VkInstance
17+
18+
class SdlWindow(private val handle: Long, ctx: Lwjgl3Context) : KoolWindowJvm {
19+
val input = SdlInput(this)
20+
21+
override var isMouseOverWindow: Boolean = false
22+
23+
override var parentScreenScale: Float = 1f; private set
24+
override var positionOnScreen: Vec2i = Vec2i.ZERO
25+
override var sizeOnScreen: Vec2i = Vec2i(1600, 900)
26+
override var renderResolutionFactor: Float = 1f
27+
override var framebufferSize: Vec2i = Vec2i(1600, 900); private set
28+
override var size: Vec2i = Vec2i(1600, 900); private set
29+
override val renderScale: Float
30+
get() = parentScreenScale * renderResolutionFactor
31+
32+
override var title: String = "Sdl window"
33+
34+
override val capabilities: WindowCapabilities = WindowCapabilities.NONE
35+
36+
override val resizeListeners: BufferedList<WindowResizeListener> = BufferedList()
37+
override val scaleChangeListeners: BufferedList<ScaleChangeListener> = BufferedList()
38+
override val flagListeners: BufferedList<WindowFlagsListener> = BufferedList()
39+
override val closeListeners: BufferedList<WindowCloseListener> = BufferedList()
40+
override val dragAndDropListeners: BufferedList<DragAndDropListener> = BufferedList()
41+
42+
override var windowTitleHoverHandler: WindowTitleHoverHandler = WindowTitleHoverHandler()
43+
44+
override var flags: WindowFlags = WindowFlags(isHiddenTitleBar = ctx.config.isNoTitleBar)
45+
private set(value) {
46+
if (value != field) {
47+
val oldFlags = field
48+
field = value
49+
flagListeners.updated().forEach { it.onFlagsChanged(oldFlags, value) }
50+
}
51+
}
52+
53+
init {
54+
scopedMem {
55+
val x = callocInt(1)
56+
val y = callocInt(1)
57+
check(SDL_GetWindowPosition(handle, x, y))
58+
positionOnScreen = Vec2i(x.get(0), y.get(0))
59+
60+
parentScreenScale = SDL_GetWindowDisplayScale(handle)
61+
}
62+
}
63+
64+
var isCloseRequested = false; private set
65+
private val sdlEvent = SDL_Event.create()
66+
67+
override fun pollEvents() {
68+
while (true) {
69+
SDL_PollEvent(sdlEvent)
70+
when (sdlEvent.type()) {
71+
SDL_EVENT_POLL_SENTINEL -> break
72+
73+
SDL_EVENT_MOUSE_MOTION -> input.handleMouseMotion(sdlEvent.motion())
74+
SDL_EVENT_MOUSE_WHEEL -> input.handleMouseWheel(sdlEvent.wheel())
75+
SDL_EVENT_MOUSE_BUTTON_DOWN -> input.handleMouseButton(sdlEvent.button())
76+
SDL_EVENT_MOUSE_BUTTON_UP -> input.handleMouseButton(sdlEvent.button())
77+
SDL_EVENT_MOUSE_ADDED -> { logI { "Mouse added" } }
78+
79+
SDL_EVENT_KEY_DOWN -> input.handleKey(sdlEvent.key())
80+
SDL_EVENT_KEY_UP -> input.handleKey(sdlEvent.key())
81+
SDL_EVENT_TEXT_EDITING -> {}
82+
SDL_EVENT_TEXT_INPUT -> {}
83+
SDL_EVENT_KEYMAP_CHANGED -> {}
84+
SDL_EVENT_KEYBOARD_ADDED -> { logI { "Keyboard added" } }
85+
86+
SDL_EVENT_WINDOW_MOUSE_ENTER -> isMouseOverWindow = true
87+
SDL_EVENT_WINDOW_MOUSE_LEAVE -> isMouseOverWindow = false
88+
SDL_EVENT_WINDOW_SHOWN -> flags = flags.copy(isVisible = true)
89+
SDL_EVENT_WINDOW_HIDDEN -> flags = flags.copy(isVisible = true)
90+
SDL_EVENT_WINDOW_MINIMIZED -> flags = flags.copy(isMinimized = true)
91+
SDL_EVENT_WINDOW_MAXIMIZED -> flags = flags.copy(isMaximized = true)
92+
SDL_EVENT_WINDOW_RESTORED -> flags = flags.copy(isMinimized = false, isMaximized = false)
93+
SDL_EVENT_WINDOW_FOCUS_GAINED -> flags = flags.copy(isFocused = true)
94+
SDL_EVENT_WINDOW_FOCUS_LOST -> flags = flags.copy(isFocused = false)
95+
SDL_EVENT_WINDOW_EXPOSED -> flags = flags.copy(isOccluded = false)
96+
SDL_EVENT_WINDOW_OCCLUDED -> flags = flags.copy(isOccluded = true)
97+
SDL_EVENT_WINDOW_MOVED -> updateWindowPos(sdlEvent.window())
98+
SDL_EVENT_WINDOW_RESIZED -> updateWindowSize(sdlEvent.window())
99+
SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED -> updateWindowSize(sdlEvent.window())
100+
SDL_EVENT_WINDOW_CLOSE_REQUESTED -> { println("close requested") }
101+
SDL_EVENT_WINDOW_DISPLAY_CHANGED -> { println("display changed") }
102+
SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED -> { println("display changed: ${sdlEvent.window().data1()}") }
103+
SDL_EVENT_WINDOW_HIT_TEST -> { println("hittest") }
104+
SDL_EVENT_WINDOW_ICCPROF_CHANGED -> {}
105+
SDL_EVENT_WINDOW_ENTER_FULLSCREEN -> {}
106+
SDL_EVENT_WINDOW_LEAVE_FULLSCREEN -> {}
107+
SDL_EVENT_WINDOW_METAL_VIEW_RESIZED -> {}
108+
SDL_EVENT_WINDOW_SAFE_AREA_CHANGED -> {}
109+
SDL_EVENT_WINDOW_HDR_STATE_CHANGED -> {}
110+
SDL_EVENT_WINDOW_DESTROYED -> {}
111+
112+
SDL_EVENT_CLIPBOARD_UPDATE -> {}
113+
114+
SDL_EVENT_QUIT -> isCloseRequested = true
115+
116+
else -> logD { "Unhandled SDL event type: ${sdlEvent.type().toHexString()}" }
117+
}
118+
}
119+
}
120+
121+
private fun updateWindowPos(event: SDL_WindowEvent) {
122+
positionOnScreen = Vec2i(event.data1(), event.data2())
123+
}
124+
125+
private fun updateWindowSize(event: SDL_WindowEvent) {
126+
val sz = Vec2i(event.data1(), event.data2())
127+
sizeOnScreen = sz
128+
size = sz
129+
framebufferSize = sz
130+
131+
UiScale.updateUiScaleFromWindowScale(renderScale)
132+
resizeListeners.updated().forEach { it.onResize(sz) }
133+
scaleChangeListeners.updated().forEach { it.onScaleChanged(renderScale) }
134+
}
135+
136+
override fun createVulkanSurface(instance: VkInstance): Long {
137+
scopedMem {
138+
val surface = callocLong(1)
139+
check(SDL_Vulkan_CreateSurface(handle, instance, null, surface)) {
140+
"Failed to create Vulkan surface for SDL window $handle"
141+
}
142+
return surface[0]
143+
}
144+
}
145+
146+
override fun destroyVulkanSurface(surface: Long, instance: VkInstance) {
147+
SDL_Vulkan_DestroySurface(instance, surface, null)
148+
}
149+
150+
override fun swapBuffers() { }
151+
152+
override fun close() {
153+
isCloseRequested = true
154+
}
155+
}

0 commit comments

Comments
 (0)