Compare commits

...
2 Commits
Author SHA1 Message Date
Riyyi 2b8488a1e2 Add mouse position input function 2026-09-13 00:43:18 +02:00
Riyyi 7740632541 Free wgpu capabilities memory 2026-09-13 00:23:56 +02:00
3 changed files with 23 additions and 12 deletions
+4
View File
@@ -11,5 +11,9 @@ key_state: proc(key: Key) -> Action
// implementation in platform package, to prevent cyclic dependency // implementation in platform package, to prevent cyclic dependency
mouse_button_state: proc(button: Mouse_Button) -> Action mouse_button_state: proc(button: Mouse_Button) -> Action
// Returns the position of the mouse cursor
// implementation in platform package, to prevent cyclic dependency
mouse_position: proc() -> (x_pos: f32, y_pos: f32)
// ----------------------------------------- // -----------------------------------------
// Private functions // Private functions
+7 -5
View File
@@ -52,11 +52,7 @@ os_init :: proc(settings: core.Settings) {
// Register input functions // Register input functions
input.key_state = key_state input.key_state = key_state
input.mouse_button_state = mouse_button_state input.mouse_button_state = mouse_button_state
input.mouse_position = mouse_position
// TODO: Figure out proper vsync, found 3 spots so far
// - glfw.SwapInterval(0) this is only for OpenGL it seems?
// - glfw.SetWindowMonitor(refresh)
// - wgpu presentMode = .Fifo
} }
os_destroy :: proc() { os_destroy :: proc() {
@@ -157,6 +153,12 @@ mouse_button_state :: proc(button: input.Mouse_Button) -> input.Action {
return input_action(glfw.GetMouseButton(state.os.window, i32(button))) return input_action(glfw.GetMouseButton(state.os.window, i32(button)))
} }
@(private = "file")
mouse_position :: proc() -> (x_pos: f32, y_pos: f32) {
x_pos_f64, y_pos_64 := glfw.GetCursorPos(state.os.window)
return f32(x_pos_f64), f32(y_pos_64)
}
@(private = "file") @(private = "file")
input_action :: proc(action: i32) -> input.Action { input_action :: proc(action: i32) -> input.Action {
if action == glfw.RELEASE do return input.Action.Release if action == glfw.RELEASE do return input.Action.Release
+12 -7
View File
@@ -26,7 +26,7 @@ state: struct {
pipeline_layout: wgpu.PipelineLayout, pipeline_layout: wgpu.PipelineLayout,
pipeline: wgpu.RenderPipeline, pipeline: wgpu.RenderPipeline,
// ---------------------------------------- // ----------------------------------------
present_modes: []wgpu.PresentMode, capabilities: wgpu.SurfaceCapabilities,
vsync: bool, vsync: bool,
} }
@@ -69,6 +69,7 @@ instance_destroy :: proc() {
wgpu.ShaderModuleRelease(state.module) wgpu.ShaderModuleRelease(state.module)
wgpu.QueueRelease(state.queue) wgpu.QueueRelease(state.queue)
wgpu.DeviceRelease(state.device) wgpu.DeviceRelease(state.device)
wgpu.SurfaceCapabilitiesFreeMembers(state.capabilities)
wgpu.AdapterRelease(state.adapter) wgpu.AdapterRelease(state.adapter)
wgpu.SurfaceRelease(state.surface) wgpu.SurfaceRelease(state.surface)
wgpu.InstanceRelease(state.instance) wgpu.InstanceRelease(state.instance)
@@ -260,25 +261,29 @@ get_present_modes :: proc() {
if status != .Success { if status != .Success {
fmt.panicf("[wgpu] surface capabilities failure: [%v]", status) fmt.panicf("[wgpu] surface capabilities failure: [%v]", status)
} }
state.present_modes = capabilities.presentModes[:capabilities.presentModeCount] state.capabilities = capabilities
fmt.println("[wgpu] supported present modes", state.present_modes)
present_modes := capabilities.presentModes[:capabilities.presentModeCount]
fmt.println("[wgpu] supported present modes", present_modes)
} }
@(private = "file") @(private = "file")
pick_present_mode :: proc(vsync: bool) -> wgpu.PresentMode { pick_present_mode :: proc(vsync: bool) -> wgpu.PresentMode {
if len(state.present_modes) == 0 do return .Fifo present_modes := state.capabilities.presentModes[:state.capabilities.presentModeCount]
if len(present_modes) == 0 do return .Fifo
// Mimmick wgpu auto Vsync behavior // Mimmick wgpu auto Vsync behavior
// https://docs.rs/wgpu/latest/wgpu/enum.PresentMode.html // https://docs.rs/wgpu/latest/wgpu/enum.PresentMode.html
if vsync { if vsync {
if slice.contains(state.present_modes, wgpu.PresentMode.FifoRelaxed) { if slice.contains(present_modes, wgpu.PresentMode.FifoRelaxed) {
return .FifoRelaxed // Adaptive Vsync return .FifoRelaxed // Adaptive Vsync
} }
} else { } else {
if slice.contains(state.present_modes, wgpu.PresentMode.Immediate) { if slice.contains(present_modes, wgpu.PresentMode.Immediate) {
return .Immediate // Vsync Off return .Immediate // Vsync Off
} }
if slice.contains(state.present_modes, wgpu.PresentMode.Mailbox) { if slice.contains(present_modes, wgpu.PresentMode.Mailbox) {
return .Mailbox // Fast Vsync return .Mailbox // Fast Vsync
} }
} }