diff --git a/renderer.odin b/renderer.odin index c869360..baca164 100644 --- a/renderer.odin +++ b/renderer.odin @@ -14,6 +14,7 @@ RENDER_BACKEND_METAL :: #config(RENDER_BACKEND_METAL, false) Renderer :: struct { viewport: Viewport, surface_ptr: rawptr, + vsync: bool, backend: rawptr, pipeline: Pipeline, @@ -62,6 +63,8 @@ create :: proc(surface_ptr: rawptr) -> (^Renderer, bool) { return nil, false } + set_vsync(renderer, true) + { // Create the fullscreen shaders, material and mesh. fs_vertex_shader, fs_vertex_shader_ok := create_shader(renderer, .Vertex, "fs_vertex.glsl") assert(fs_vertex_shader_ok) @@ -114,6 +117,24 @@ set_viewport :: proc(renderer: ^Renderer, x, y, width, height: u16) { } } +set_vsync :: proc(renderer: ^Renderer, on: bool) { + assert(renderer != nil) + + if renderer.vsync == on { + return + } + + success := false + + when RENDER_BACKEND_OPENGL { + success = opengl_set_vsync(renderer, on) + } + + if success { + renderer.vsync = on + } +} + @(private="file") set_clear_color :: proc(renderer: ^Renderer, color: Color) { when RENDER_BACKEND_OPENGL { opengl_set_clear_color(renderer, color) diff --git a/renderer_backend_opengl_windows.odin b/renderer_backend_opengl_windows.odin index 9a2eb00..516aaf6 100644 --- a/renderer_backend_opengl_windows.odin +++ b/renderer_backend_opengl_windows.odin @@ -79,6 +79,13 @@ when RENDER_BACKEND_OPENGL { }) opengl_swap_buffers(renderer) + + win.wglSwapIntervalEXT = transmute(win.SwapIntervalEXTType)win.wglGetProcAddress("wglSwapIntervalEXT") + if win.wglSwapIntervalEXT == nil { + opengl_destroy(renderer) + return false + } + return true } @@ -90,6 +97,18 @@ when RENDER_BACKEND_OPENGL { ) } + opengl_set_vsync :: proc(renderer: ^Renderer, on: bool) -> bool { + if win.wglSwapIntervalEXT == nil { + fmt.printfln("'wglSwapIntervalEXT' is nil.") + return false + } + + // Kommer inte in hit. + win.wglSwapIntervalEXT(on ? 1 : 0) + + return true + } + opengl_set_clear_color :: proc(renderer: ^Renderer, color: Color) { r, g, b, a: u8 = max(u8), max(u8), max(u8), max(u8)