Files
renderer/renderer_backend_opengl_windows.odin
2025-11-14 11:56:14 +01:00

93 lines
2.8 KiB
Odin

package renderer
import "core:fmt"
import gl "vendor:OpenGL"
import win "core:sys/windows"
when RENDER_BACKEND_OPENGL {
Backend_OpenGL_Windows :: struct {
hwnd: win.HWND,
hdc: win.HDC,
gl_context: win.HGLRC,
}
backend: Backend_OpenGL_Windows
opengl_init :: proc(renderer: ^Renderer) -> bool {
renderer.backend = &backend
backend.hwnd = win.HWND(renderer.surface_ptr)
backend.hdc = win.GetDC(backend.hwnd)
pfd := win.PIXELFORMATDESCRIPTOR {
nSize = size_of(win.PIXELFORMATDESCRIPTOR),
nVersion = 1,
dwFlags = win.PFD_DRAW_TO_WINDOW | win.PFD_SUPPORT_OPENGL | win.PFD_DOUBLEBUFFER,
iPixelType = win.PFD_TYPE_RGBA,
cColorBits = 32,
cDepthBits = 24,
cStencilBits = 8,
iLayerType = win.PFD_MAIN_PLANE,
}
format_index := win.ChoosePixelFormat(backend.hdc, &pfd)
assert(format_index != 0, "ChoosePixelFormat failed")
set_pixel_format_ok := win.SetPixelFormat(backend.hdc, format_index, &pfd)
assert(set_pixel_format_ok == win.TRUE, "SetPixelFormat failed")
backend.gl_context = win.wglCreateContext(backend.hdc)
assert(backend.gl_context != nil, "Failed to create OpenGL context")
win.wglMakeCurrent(backend.hdc, backend.gl_context)
// fmt.printfln("GL Context: %v", backend.gl_context)
gl.load_up_to(3, 3, proc(p: rawptr, name: cstring) {
addr := win.wglGetProcAddress(name)
if addr == nil {
dll := win.LoadLibraryW(win.utf8_to_wstring("opengl32.dll"))
addr = win.GetProcAddress(dll, name)
}
(^rawptr)(p)^ = addr
})
opengl_swap_buffers(renderer)
return true
}
opengl_viewport_changed :: proc(renderer: ^Renderer) {
gl.Clear(gl.COLOR_BUFFER_BIT)
gl.Viewport(
i32(renderer.viewport.x),
i32(renderer.viewport.y),
i32(renderer.viewport.width),
i32(renderer.viewport.height)
)
}
opengl_set_clear_color :: proc(renderer: ^Renderer, color: [3]u8) {
gl.ClearColor(
f32(color.r) / f32(max(u8)),
f32(color.g) / f32(max(u8)),
f32(color.b) / f32(max(u8)),
1.0
)
}
opengl_swap_buffers :: proc(renderer: ^Renderer) {
gl.Clear(gl.COLOR_BUFFER_BIT)
win.SwapBuffers(backend.hdc)
}
opengl_destroy :: proc(renderer: ^Renderer) {
win.wglMakeCurrent(nil, nil)
win.wglDeleteContext(backend.gl_context)
win.ReleaseDC(backend.hwnd, backend.hdc)
backend = {}
}
}