| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #+build windows
- package karl2d
- import win32 "core:sys/windows"
- import gl "vendor:OpenGL"
- import "core:log"
- GL_Context :: win32.HGLRC
- _gl_get_context :: proc(window_handle: Window_Handle) -> (GL_Context, bool) {
- hdc := win32.GetWindowDC(win32.HWND(window_handle))
- pfd := win32.PIXELFORMATDESCRIPTOR {
- size_of(win32.PIXELFORMATDESCRIPTOR),
- 1,
- win32.PFD_DRAW_TO_WINDOW | win32.PFD_SUPPORT_OPENGL | win32.PFD_DOUBLEBUFFER, // Flags
- win32.PFD_TYPE_RGBA, // The kind of framebuffer. RGBA or palette.
- 32, // Colordepth of the framebuffer.
- 0, 0, 0, 0, 0, 0,
- 0,
- 0,
- 0,
- 0, 0, 0, 0,
- 24, // Number of bits for the depthbuffer
- 8, // Number of bits for the stencilbuffer
- 0, // Number of Aux buffers in the framebuffer.
- win32.PFD_MAIN_PLANE,
- 0,
- 0, 0, 0,
- }
- fmt := win32.ChoosePixelFormat(hdc, &pfd)
- win32.SetPixelFormat(hdc, fmt, &pfd)
- dummy_ctx := win32.wglCreateContext(hdc)
- win32.wglMakeCurrent(hdc, dummy_ctx)
- win32.gl_set_proc_address(&win32.wglChoosePixelFormatARB, "wglChoosePixelFormatARB")
- win32.gl_set_proc_address(&win32.wglCreateContextAttribsARB, "wglCreateContextAttribsARB")
- win32.gl_set_proc_address(&win32.wglSwapIntervalEXT, "wglSwapIntervalEXT")
- if win32.wglChoosePixelFormatARB == nil {
- log.error("Failed fetching wglChoosePixelFormatARB")
- return {}, false
- }
- if win32.wglCreateContextAttribsARB == nil {
- log.error("Failed fetching wglCreateContextAttribsARB")
- return {}, false
- }
- if win32.wglSwapIntervalEXT == nil {
- log.error("Failed fetching wglSwapIntervalEXT")
- return {}, false
- }
- pixel_format_ilist := [?]i32 {
- win32.WGL_DRAW_TO_WINDOW_ARB, 1,
- win32.WGL_SUPPORT_OPENGL_ARB, 1,
- win32.WGL_DOUBLE_BUFFER_ARB, 1,
- win32.WGL_PIXEL_TYPE_ARB, win32.WGL_TYPE_RGBA_ARB,
- win32.WGL_COLOR_BITS_ARB, 32,
- win32.WGL_DEPTH_BITS_ARB, 24,
- win32.WGL_STENCIL_BITS_ARB, 8,
- 0,
- }
- pixel_format: i32
- num_formats: u32
- valid_pixel_format := win32.wglChoosePixelFormatARB(hdc, raw_data(pixel_format_ilist[:]),
- nil, 1, &pixel_format, &num_formats)
- if !valid_pixel_format {
- return {}, false
- }
- win32.SetPixelFormat(hdc, pixel_format, nil)
- ctx := win32.wglCreateContextAttribsARB(hdc, nil, nil)
- win32.wglMakeCurrent(hdc, ctx)
- win32.wglSwapIntervalEXT(1)
- return ctx, true
- }
- _gl_destroy_context :: proc(ctx: GL_Context) {
- win32.wglDeleteContext(ctx)
- }
- _gl_load_procs :: proc() {
- gl.load_up_to(3, 3, win32.gl_set_proc_address)
- }
- _gl_present :: proc(window_handle: Window_Handle) {
- hdc := win32.GetWindowDC(win32.HWND(window_handle))
- win32.SwapBuffers(hdc)
- }
|