Tkap1

Untitled

Nov 23rd, 2024
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.71 KB | None | 0 0
  1. func s_opengl_window init_opengl_window(s_launch_args args)
  2. {
  3.     s_opengl_window window = zero;
  4.  
  5.     HINSTANCE hinstance = GetModuleHandle(null);
  6.     PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = null;
  7.     PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = null;
  8.  
  9.     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv     REGISTER CLASS START        vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  10.     {
  11.         WNDCLASS my_class = zero;
  12.  
  13.         // my_class.cbSize = sizeof(my_class);
  14.         my_class.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
  15.         my_class.lpfnWndProc = window_proc;
  16.         // my_class.cbClsExtra = ;
  17.         // my_class.cbWndExtra = ;
  18.         my_class.hInstance = hinstance;
  19.  
  20.         #ifndef m_debug_internal
  21.         my_class.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(MY_ICON));
  22.         #endif // m_debug_internal
  23.  
  24.         // my_class.hCursor = ;
  25.  
  26.         // @TODO(tkap): Is this correct? We probably want to hide the cursor anyway...
  27.         my_class.hCursor = LoadCursor(null, IDC_ARROW);
  28.         // my_class.hbrBackground = ;
  29.         // my_class.lpszMenuName = ;
  30.         my_class.lpszClassName = class_name;
  31.         // my_class.hIconSm = ;
  32.  
  33.         if(!RegisterClass(&my_class))
  34.         {
  35.             print_win32_error();
  36.             platform_exit();
  37.         }
  38.     }
  39.     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     REGISTER CLASS END      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  40.  
  41.     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv     FAKE WINDOW START       vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  42.     {
  43.         HWND fake_window = CreateWindowEx(
  44.             0,
  45.             class_name,
  46.             "fakewindow",
  47.             WS_OVERLAPPEDWINDOW,
  48.             CW_USEDEFAULT,
  49.             CW_USEDEFAULT,
  50.             CW_USEDEFAULT,
  51.             CW_USEDEFAULT,
  52.             0,
  53.             null,
  54.             hinstance,
  55.             null
  56.         );
  57.  
  58.         if(!fake_window)
  59.         {
  60.             print_win32_error();
  61.             platform_exit();
  62.         }
  63.  
  64.  
  65.         HDC fake_dc = GetDC(fake_window);
  66.         if(!fake_dc)
  67.         {
  68.             print_win32_error();
  69.             platform_exit();
  70.         }
  71.  
  72.         PIXELFORMATDESCRIPTOR pfd = zero;
  73.         pfd.nSize = sizeof(pfd);
  74.         pfd.nVersion = 1;
  75.         pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  76.         pfd.iPixelType = PFD_TYPE_RGBA;
  77.         pfd.cColorBits = 32;
  78.         pfd.cAlphaBits = 8;
  79.         pfd.cDepthBits = 24;
  80.         int pixel_format = ChoosePixelFormat(fake_dc, &pfd);
  81.  
  82.         if(!pixel_format)
  83.         {
  84.             print_win32_error();
  85.             platform_exit();
  86.         }
  87.  
  88.         if(!SetPixelFormat(fake_dc, pixel_format, &pfd))
  89.         {
  90.             print_win32_error();
  91.             platform_exit();
  92.         }
  93.  
  94.         HGLRC fake_glrc = wglCreateContext(fake_dc);
  95.  
  96.         if(!fake_glrc)
  97.         {
  98.             print_win32_error();
  99.             platform_exit();
  100.         }
  101.  
  102.         if(!wglMakeCurrent(fake_dc, fake_glrc))
  103.         {
  104.             print_win32_error();
  105.             platform_exit();
  106.         }
  107.  
  108.         wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)get_gl_proc("wglChoosePixelFormatARB");
  109.         wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)get_gl_proc("wglCreateContextAttribsARB");
  110.  
  111.         wglMakeCurrent(fake_dc, null);
  112.         wglDeleteContext(fake_glrc);
  113.         ReleaseDC(fake_window, fake_dc);
  114.         DestroyWindow(fake_window);
  115.  
  116.     }
  117.     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     FAKE WINDOW END     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  118.  
  119.  
  120.     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv     CREATE WINDOW START     vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  121.     {
  122.  
  123.         window.handle = CreateWindowEx(
  124.             0,
  125.             class_name,
  126.             "Window",
  127.             WS_POPUP | WS_VISIBLE,
  128.             CW_USEDEFAULT,
  129.             CW_USEDEFAULT,
  130.             args.window_w ? args.window_w : g_window_width,
  131.             args.window_h ? args.window_h : g_window_height,
  132.             0,
  133.             null,
  134.             hinstance,
  135.             null
  136.         );
  137.  
  138.         if(!window.handle)
  139.         {
  140.             print_win32_error();
  141.             platform_exit();
  142.         }
  143.  
  144.         HMONITOR monitor = MonitorFromWindow(
  145.             window.handle,
  146.             MONITOR_DEFAULTTONEAREST
  147.         );
  148.  
  149.         MONITORINFO monitor_info = zero;
  150.         monitor_info.cbSize = sizeof(monitor_info);
  151.         GetMonitorInfoA(
  152.             monitor,
  153.             &monitor_info
  154.         );
  155.  
  156.         int monitor_w = monitor_info.rcMonitor.right - monitor_info.rcMonitor.left;
  157.         int monitor_h = monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top;
  158.         g_window_width = args.window_w ? args.window_w : monitor_w;
  159.         g_window_height = args.window_h ? args.window_h : monitor_h;
  160.  
  161.         SetWindowPos(
  162.             window.handle,
  163.             0,
  164.             args.window_x,
  165.             args.window_y,
  166.             g_window_width,
  167.             g_window_height,
  168.             0
  169.         );
  170.  
  171.  
  172.     }
  173.     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     CREATE WINDOW END       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  174.  
  175.  
  176.  
  177.  
  178.  
  179.     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv     CREATE CONTEXT START        vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  180.     {
  181.         HGLRC gldc = 0;
  182.         window.dc = GetDC(window.handle);
  183.  
  184.         if(!window.dc)
  185.         {
  186.             print_win32_error();
  187.             platform_exit();
  188.         }
  189.  
  190.         int pixelFormat[32];
  191.         UINT numFormats;
  192.         const int pixelAttribs[] = {
  193.             WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
  194.             WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
  195.             WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
  196.             WGL_SWAP_METHOD_ARB, WGL_SWAP_COPY_ARB, // @Note(tkap, 16/07/2024): If we don't have this, using the zoomit program's pencil feature, we get an outdated image of the game
  197.             // WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, // @Note(tkap, 16/07/2024): It appears we don't need this?
  198.             WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
  199.             // WGL_COLOR_BITS_ARB, 32,
  200.             WGL_COLOR_BITS_ARB, 24,
  201.             WGL_DEPTH_BITS_ARB, 24,
  202.             WGL_ALPHA_BITS_ARB, 8,
  203.             // WGL_SAMPLE_BUFFERS_ARB, GL_TRUE,
  204.             // WGL_SAMPLES_ARB, 4,
  205.             0
  206.         };
  207.  
  208.         int contextAttributes[] = {
  209.             WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
  210.             WGL_CONTEXT_MINOR_VERSION_ARB, 3,
  211.             WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
  212.  
  213.             #ifdef m_debug
  214.             WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB,
  215.             #endif
  216.             0
  217.         };
  218.  
  219.         if(!wglChoosePixelFormatARB(window.dc, pixelAttribs, null, 1, pixelFormat, &numFormats))
  220.         {
  221.             print_win32_error();
  222.             platform_exit();
  223.         }
  224.         assert(numFormats);
  225.  
  226.         PIXELFORMATDESCRIPTOR pfd = zero;
  227.         DescribePixelFormat(window.dc, pixelFormat[0], sizeof(PIXELFORMATDESCRIPTOR), &pfd);
  228.  
  229.         if(!SetPixelFormat(window.dc, pixelFormat[0], &pfd))
  230.         {
  231.             print_win32_error();
  232.             platform_exit();
  233.         }
  234.  
  235.         gldc = wglCreateContextAttribsARB(window.dc, 0, contextAttributes);
  236.         if(!gldc)
  237.         {
  238.             print_win32_error();
  239.             platform_exit();
  240.         }
  241.  
  242.         if(!wglMakeCurrent(window.dc, gldc))
  243.         {
  244.             print_win32_error();
  245.             platform_exit();
  246.         }
  247.  
  248.     }
  249.     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     CREATE CONTEXT END      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  250.  
  251.     #ifdef m_debug
  252.     init_gl_func(glDebugMessageCallback);
  253.     glDebugMessageCallback(&gl_debug_callback, null);
  254.     glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
  255.     // glEnable(GL_DEBUG_OUTPUT);
  256.     #endif
  257.  
  258.     PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
  259.     if(wglGetExtensionsStringARB) {
  260.         const char* extensions = wglGetExtensionsStringARB(window.dc);
  261.         g_platform_shared.is_adaptive_vsync_supported = strstr(extensions, "WGL_EXT_swap_control_tear") != null;
  262.     }
  263.  
  264.     return window;
  265.  
  266. }
Add Comment
Please, Sign In to add comment