static LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { //fs_log("WndProc %d\n", message); //static HGLRC hRC; //rendering context //static HDC hDC; //device context HRAWINPUT raw_input_handle; switch (message) { case WM_CREATE: g_hdc = GetDC(hwnd); //get the device context for window if (g_hdc == NULL) { fs_log("could not get window dc\n"); } setup_pixel_format(g_hdc); g_hrc = wglCreateContext(g_hdc); //create rendering context if (g_hrc == NULL) { fs_log("could not create wgl context\n"); } //make rendering context current if (!wglMakeCurrent(g_hdc, g_hrc)) { fs_log("could not set current wgl context in main thread\n"); } break; case WM_DESTROY: wglMakeCurrent(g_hdc, NULL); //deselect rendering context wglDeleteContext(g_hrc); //delete rendering context PostQuitMessage(0); //send wm_quit break; case WM_ERASEBKGND: break; case WM_INPUT: raw_input_handle = (HRAWINPUT) lparam; /* unsigned int size; if (GetRawInputData(raw_input_handle, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER)) != -1) { void *data = malloc(size); if (GetRawInputData(raw_input_handle, RID_INPUT, data, &size, sizeof(RAWINPUTHEADER)) != -1) { process_input(data); } free(data); } */ unsigned int size = RAW_INPUT_MAX_SIZE; if (GetRawInputData(raw_input_handle, RID_INPUT, &g_raw_input_data, &size, sizeof(RAWINPUTHEADER)) != -1) { process_input(&g_raw_input_data); } // must call DefWindowProc according to http://msdn.microsoft.com/ // en-us/library/windows/desktop/ms645590(v=vs.85).aspx return DefWindowProc(hwnd, message, wparam, lparam); default: return DefWindowProc(hwnd, message, wparam, lparam); } return 0; }
static void create_gl_context(HWND hwnd) { g_hdc = GetDC(hwnd); setup_pixel_format(g_hdc); g_hrc = wglCreateContext(g_hdc); if (g_hrc) { if (wglMakeCurrent(g_hdc, g_hrc)) g_inited = true; else g_quit = true; } else g_quit = true; }
static LRESULT CALLBACK window_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { HDC hdc = GetDC(hwnd); int ret; switch (message) { case WM_CREATE: setup_pixel_format(hdc); ret = test_callback(hdc); ReleaseDC(hwnd, hdc); exit(ret); return 0; default: return DefWindowProc(hwnd, message, wparam, lparam); } }
void create_gl_context(HWND hwnd, bool *quit) { bool core_context; const struct retro_hw_render_callback *hw_render = (const struct retro_hw_render_callback*)video_driver_callback(); bool debug = hw_render->debug_context; #ifdef _WIN32 dll_handle = dylib_load("OpenGL32.dll"); #endif g_hdc = GetDC(hwnd); setup_pixel_format(g_hdc); #ifdef GL_DEBUG debug = true; #endif core_context = (g_major * 1000 + g_minor) >= 3001; if (g_hrc) { RARCH_LOG("[WGL]: Using cached GL context.\n"); video_driver_ctl(RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT_ACK, NULL); } else { g_hrc = wglCreateContext(g_hdc); /* We'll create shared context later if not. */ if (g_hrc && !core_context && !debug) { g_hw_hrc = wglCreateContext(g_hdc); if (g_hw_hrc) { if (!wglShareLists(g_hrc, g_hw_hrc)) { RARCH_LOG("[WGL]: Failed to share contexts.\n"); *quit = true; } } else *quit = true; } } if (g_hrc) { if (wglMakeCurrent(g_hdc, g_hrc)) g_inited = true; else *quit = true; } else { *quit = true; return; } if (core_context || debug) { int attribs[16]; int *aptr = attribs; if (core_context) { *aptr++ = WGL_CONTEXT_MAJOR_VERSION_ARB; *aptr++ = g_major; *aptr++ = WGL_CONTEXT_MINOR_VERSION_ARB; *aptr++ = g_minor; /* Technically, we don't have core/compat until 3.2. * Version 3.1 is either compat or not depending * on GL_ARB_compatibility. */ if ((g_major * 1000 + g_minor) >= 3002) { *aptr++ = WGL_CONTEXT_PROFILE_MASK_ARB; *aptr++ = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; } } if (debug) { *aptr++ = WGL_CONTEXT_FLAGS_ARB; *aptr++ = WGL_CONTEXT_DEBUG_BIT_ARB; } *aptr = 0; if (!pcreate_context) pcreate_context = (wglCreateContextAttribsProc) wglGetProcAddress("wglCreateContextAttribsARB"); if (pcreate_context) { HGLRC context = pcreate_context(g_hdc, NULL, attribs); if (context) { wglMakeCurrent(NULL, NULL); wglDeleteContext(g_hrc); g_hrc = context; if (!wglMakeCurrent(g_hdc, g_hrc)) *quit = true; } else RARCH_ERR("[WGL]: Failed to create core context. Falling back to legacy context.\n"); if (g_use_hw_ctx) { g_hw_hrc = pcreate_context(g_hdc, context, attribs); if (!g_hw_hrc) { RARCH_ERR("[WGL]: Failed to create shared context.\n"); *quit = true; } } } else RARCH_ERR("[WGL]: wglCreateContextAttribsARB not supported.\n"); } }
static void create_gl_context(HWND hwnd) { g_hdc = GetDC(hwnd); setup_pixel_format(g_hdc); if (!g_hrc) g_hrc = wglCreateContext(g_hdc); else { RARCH_LOG("[WGL]: Using cached GL context.\n"); driver.video_cache_context_ack = true; } if (g_hrc) { if (wglMakeCurrent(g_hdc, g_hrc)) g_inited = true; else g_quit = true; } else { g_quit = true; return; } #ifdef GL_DEBUG bool debug = true; #else bool debug = g_extern.system.hw_render_callback.debug_context; #endif bool core_context = (g_major * 1000 + g_minor) >= 3001; if (core_context || debug) { #ifndef WGL_CONTEXT_MAJOR_VERSION_ARB #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #endif #ifndef WGL_CONTEXT_MINOR_VERSION_ARB #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #endif #ifndef WGL_CONTEXT_PROFILE_MASK_ARB #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #endif #ifndef WGL_CONTEXT_CORE_PROFILE_BIT_ARB #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x0001 #endif #ifndef WGL_CONTEXT_FLAGS_ARB #define WGL_CONTEXT_FLAGS_ARB 0x2094 #endif #ifndef WGL_CONTEXT_DEBUG_BIT_ARB #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #endif int attribs[16]; int *aptr = attribs; if (core_context) { *aptr++ = WGL_CONTEXT_MAJOR_VERSION_ARB; *aptr++ = g_major; *aptr++ = WGL_CONTEXT_MINOR_VERSION_ARB; *aptr++ = g_minor; *aptr++ = WGL_CONTEXT_PROFILE_MASK_ARB; *aptr++ = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; } if (debug) { *aptr++ = WGL_CONTEXT_FLAGS_ARB; *aptr++ = WGL_CONTEXT_DEBUG_BIT_ARB; } *aptr = 0; if (!pcreate_context) pcreate_context = (wglCreateContextAttribsProc)wglGetProcAddress("wglCreateContextAttribsARB"); if (pcreate_context) { HGLRC context = pcreate_context(g_hdc, NULL, attribs); if (context) { wglMakeCurrent(NULL, NULL); wglDeleteContext(g_hrc); g_hrc = context; if (!wglMakeCurrent(g_hdc, g_hrc)) g_quit = true; } else RARCH_ERR("[WGL]: Failed to create core context. Falling back to legacy context.\n"); } else RARCH_ERR("[WGL]: wglCreateContextAttribsARB not supported.\n"); } }
static void create_gl_context(HWND hwnd) { g_hdc = GetDC(hwnd); setup_pixel_format(g_hdc); #ifdef GL_DEBUG bool debug = true; #else bool debug = g_extern.system.hw_render_callback.debug_context; #endif bool core_context = (g_major * 1000 + g_minor) >= 3001; if (!g_hrc) { g_hrc = wglCreateContext(g_hdc); if (g_hrc && !core_context && !debug) // We'll create shared context later if not. { g_hw_hrc = wglCreateContext(g_hdc); if (g_hw_hrc) { if (!wglShareLists(g_hrc, g_hw_hrc)) { RARCH_LOG("[WGL]: Failed to share contexts.\n"); g_quit = true; } } else g_quit = true; } } else { RARCH_LOG("[WGL]: Using cached GL context.\n"); driver.video_cache_context_ack = true; } if (g_hrc) { if (wglMakeCurrent(g_hdc, g_hrc)) g_inited = true; else g_quit = true; } else { g_quit = true; return; } if (core_context || debug) { int attribs[16]; int *aptr = attribs; if (core_context) { *aptr++ = WGL_CONTEXT_MAJOR_VERSION_ARB; *aptr++ = g_major; *aptr++ = WGL_CONTEXT_MINOR_VERSION_ARB; *aptr++ = g_minor; // Technically, we don't have core/compat until 3.2. // Version 3.1 is either compat or not depending on GL_ARB_compatibility. if ((g_major * 1000 + g_minor) >= 3002) { *aptr++ = WGL_CONTEXT_PROFILE_MASK_ARB; *aptr++ = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; } } if (debug) { *aptr++ = WGL_CONTEXT_FLAGS_ARB; *aptr++ = WGL_CONTEXT_DEBUG_BIT_ARB; } *aptr = 0; if (!pcreate_context) pcreate_context = (wglCreateContextAttribsProc)wglGetProcAddress("wglCreateContextAttribsARB"); if (pcreate_context) { HGLRC context = pcreate_context(g_hdc, NULL, attribs); if (context) { wglMakeCurrent(NULL, NULL); wglDeleteContext(g_hrc); g_hrc = context; if (!wglMakeCurrent(g_hdc, g_hrc)) g_quit = true; } else RARCH_ERR("[WGL]: Failed to create core context. Falling back to legacy context.\n"); if (g_use_hw_ctx) { g_hw_hrc = pcreate_context(g_hdc, context, attribs); if (!g_hw_hrc) { RARCH_ERR("[WGL]: Failed to create shared context.\n"); g_quit = true; } } } else RARCH_ERR("[WGL]: wglCreateContextAttribsARB not supported.\n"); } }
static void create_gl_context(HWND hwnd, bool *quit) { struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); bool debug = hwr->debug_context; bool core_context = (win32_major * 1000 + win32_minor) >= 3001; win32_hdc = GetDC(hwnd); setup_pixel_format(win32_hdc); #ifdef GL_DEBUG debug = true; #endif if (win32_hrc) { RARCH_LOG("[WGL]: Using cached GL context.\n"); video_driver_set_video_cache_context_ack(); } else { win32_hrc = wglCreateContext(win32_hdc); /* We'll create shared context later if not. */ if (win32_hrc && !core_context && !debug) { win32_hw_hrc = wglCreateContext(win32_hdc); if (win32_hw_hrc) { if (!wglShareLists(win32_hrc, win32_hw_hrc)) { RARCH_LOG("[WGL]: Failed to share contexts.\n"); *quit = true; } } else *quit = true; } } if (win32_hrc) { if (wglMakeCurrent(win32_hdc, win32_hrc)) g_win32_inited = true; else *quit = true; } else { *quit = true; return; } if (core_context || debug) { int attribs[16]; int *aptr = attribs; if (core_context) { *aptr++ = WGL_CONTEXT_MAJOR_VERSION_ARB; *aptr++ = win32_major; *aptr++ = WGL_CONTEXT_MINOR_VERSION_ARB; *aptr++ = win32_minor; /* Technically, we don't have core/compat until 3.2. * Version 3.1 is either compat or not depending * on GL_ARB_compatibility. */ if ((win32_major * 1000 + win32_minor) >= 3002) { *aptr++ = WGL_CONTEXT_PROFILE_MASK_ARB; *aptr++ = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; } } if (debug) { *aptr++ = WGL_CONTEXT_FLAGS_ARB; *aptr++ = WGL_CONTEXT_DEBUG_BIT_ARB; } *aptr = 0; if (!pcreate_context) pcreate_context = (wglCreateContextAttribsProc)gfx_ctx_wgl_get_proc_address("wglCreateContextAttribsARB"); if (pcreate_context) { HGLRC context = pcreate_context(win32_hdc, NULL, attribs); if (context) { wglMakeCurrent(NULL, NULL); wglDeleteContext(win32_hrc); win32_hrc = context; if (!wglMakeCurrent(win32_hdc, win32_hrc)) *quit = true; } else RARCH_ERR("[WGL]: Failed to create core context. Falling back to legacy context.\n"); if (win32_use_hw_ctx) { win32_hw_hrc = pcreate_context(win32_hdc, context, attribs); if (!win32_hw_hrc) { RARCH_ERR("[WGL]: Failed to create shared context.\n"); *quit = true; } } } else RARCH_ERR("[WGL]: wglCreateContextAttribsARB not supported.\n"); } { const char *(WINAPI * wglGetExtensionsStringARB) (HDC) = 0; const char *extensions = NULL; wglGetExtensionsStringARB = (const char *(WINAPI *) (HDC)) gfx_ctx_wgl_get_proc_address("wglGetExtensionsStringARB"); if (wglGetExtensionsStringARB) extensions = wglGetExtensionsStringARB(win32_hdc); RARCH_LOG("[WGL] extensions: %s\n", extensions); if (wgl_has_extension("WGL_EXT_swap_control_tear", extensions)) { RARCH_LOG("[WGL]: Adaptive VSync supported.\n"); wgl_adaptive_vsync = true; } } }