- Can’t create openGL context, openGL 2.0 required, works in previous version. (nVidia ION LE) #216
- Comments
- nikleonard commented Apr 14, 2019
- nickrolfe / windows_modern_opengl_context.c
- This comment has been minimized.
- redoak commented Mar 13, 2020
- This comment has been minimized.
- nickrolfe commented Mar 13, 2020
- This comment has been minimized.
- bumbread commented Nov 5, 2020
- This comment has been minimized.
- tilkinsc commented Jan 14, 2021 •
Can’t create openGL context, openGL 2.0 required, works in previous version. (nVidia ION LE) #216
Comments
nikleonard commented Apr 14, 2019
Moonlight crashes on startup with the following error:
«Qt_ Fatal: Failed to create OpenGL context for format QSurfaceFormat(version 2.0, options QFlagsQSurfaceFormat::FormatOption(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile) .
This is most likely caused by not having the necessary graphics drivers installed.
Install a driver providing OpenGL 2.0 or higher, or, if this is not possible, make sure the ANGLE Open GL ES 2.0 emulation libraries (libEGL.dll, libGLESv2.dll and d3dcompiler_*.dll) are available in the application executable’s directory or in a location listed in PATH.»
Tested with windows x64 build, on Windows 10 x64 build 1810 in a Acer Aspire Revo R3600 with nVIdia ION graphics. Previous version (0.9.1) works flawlessly. Tested in normal and portable versions. nVidia driver version 342.01 (last version that supports ION)
Log:
00:00:09 — Qt Warning: QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x3001
00:00:09 — Qt Warning: QWindowsEGLStaticContext::create: When using ANGLE, check if d3dcompiler_4x.dll is available
00:00:09 — Qt Warning: QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x3001
00:00:09 — Qt Warning: QWindowsEGLStaticContext::create: When using ANGLE, check if d3dcompiler_4x.dll is available
00:00:10 — Qt Info: Found «gamecontrollerdb.txt» at «C:/Users/****/Downloads/MoonlightPortable-x64-0.10.0/gamecontrollerdb.txt»
00:00:10 — SDL Info (0): Loaded 18 new gamepad mappings
00:00:10 — SDL Info (0): V-sync enabled
00:00:10 — SDL Info (0): Windowed mode with DWM running
00:00:10 — SDL Info (0): Windowed: 1 | Present Interval: 80000000
00:00:11 — SDL Info (0): Detected GPU: NVIDIA ION LE (10de:87e)
00:00:11 — SDL Info (0): GPU driver: nvd3dumx.dll 21.21.13.4201
00:00:11 — SDL Info (0): Using DXVA2 accelerated renderer
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] nal_unit_type: 7(SPS), nal_ref_idc: 3
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] nal_unit_type: 8(PPS), nal_ref_idc: 3
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] nal_unit_type: 5(IDR), nal_ref_idc: 3
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] nal_unit_type: 5(IDR), nal_ref_idc: 3
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] nal_unit_type: 5(IDR), nal_ref_idc: 3
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] nal_unit_type: 5(IDR), nal_ref_idc: 3
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] Format dxva2_vld chosen by get_format().
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] Format dxva2_vld requires hwaccel initialisation.
00:00:11 — FFmpeg: [h264 @ 0000020FA83C8FC0] Reinit context to 1280×720, pix_fmt: dxva2_vld
00:00:11 — SDL Info (0): DXVA2 decoder surface high-water mark: 0
00:00:11 — SDL Info (0): FFmpeg-based video decoder chosen
00:00:14 — Qt Warning: QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x3001
00:00:14 — Qt Warning: QWindowsEGLStaticContext::create: When using ANGLE, check if d3dcompiler_4x.dll is available
00:00:14 — Qt Warning: QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x3001
00:00:14 — Qt Warning: QWindowsEGLStaticContext::create: When using ANGLE, check if d3dcompiler_4x.dll is available
00:00:15 — Qt Warning: QWindowsEGLStaticContext::create: Could not initialize EGL display: error 0x3001
00:00:15 — Qt Warning: QWindowsEGLStaticContext::create: When using ANGLE, check if d3dcompiler_4x.dll is available
00:01:16 — Qt Fatal: Failed to create OpenGL context for format QSurfaceFormat(version 2.0, options QFlagsQSurfaceFormat::FormatOption(), depthBufferSize 24, redBufferSize -1, greenBufferSize -1, blueBufferSize -1, alphaBufferSize -1, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile) .
This is most likely caused by not having the necessary graphics drivers installed.
Install a driver providing OpenGL 2.0 or higher, or, if this is not possible, make sure the ANGLE Open GL ES 2.0 emulation libraries (libEGL.dll, libGLESv2.dll and d3dcompiler_*.dll) are available in the application executable’s directory or in a location listed in PATH.
The text was updated successfully, but these errors were encountered:
nickrolfe / windows_modern_opengl_context.c
// Sample code showing how to create a modern OpenGL window and rendering context on Win32. |
# include windows.h > |
# include gl/gl.h > |
# include stdbool.h > |
typedef HGLRC WINAPI wglCreateContextAttribsARB_type (HDC hdc, HGLRC hShareContext, |
const int *attribList); |
wglCreateContextAttribsARB_type *wglCreateContextAttribsARB; |
// See https://www.opengl.org/registry/specs/ARB/wgl_create_context.txt for all values |
# define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 |
# define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 |
# define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 |
# define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 |
typedef BOOL WINAPI wglChoosePixelFormatARB_type (HDC hdc, const int *piAttribIList, |
const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); |
wglChoosePixelFormatARB_type *wglChoosePixelFormatARB; |
// See https://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt for all values |
# define WGL_DRAW_TO_WINDOW_ARB 0x2001 |
# define WGL_ACCELERATION_ARB 0x2003 |
# define WGL_SUPPORT_OPENGL_ARB 0x2010 |
# define WGL_DOUBLE_BUFFER_ARB 0x2011 |
# define WGL_PIXEL_TYPE_ARB 0x2013 |
# define WGL_COLOR_BITS_ARB 0x2014 |
# define WGL_DEPTH_BITS_ARB 0x2022 |
# define WGL_STENCIL_BITS_ARB 0x2023 |
# define WGL_FULL_ACCELERATION_ARB 0x2027 |
# define WGL_TYPE_RGBA_ARB 0x202B |
static void |
fatal_error ( char *msg) |
< |
MessageBoxA ( NULL , msg, » Error » , MB_OK | MB_ICONEXCLAMATION); |
exit (EXIT_FAILURE); |
> |
static void |
init_opengl_extensions ( void ) |
< |
// Before we can load extensions, we need a dummy OpenGL context, created using a dummy window. |
// We use a dummy window because you can only set the pixel format for a window once. For the |
// real window, we want to use wglChoosePixelFormatARB (so we can potentially specify options |
// that aren’t available in PIXELFORMATDESCRIPTOR), but we can’t load and use that before we |
// have a context. |
WNDCLASSA window_class = < |
. style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC, |
. lpfnWndProc = DefWindowProcA, |
. hInstance = GetModuleHandle ( 0 ), |
. lpszClassName = » Dummy_WGL_djuasiodwa » , |
>; |
if (! RegisterClassA (&window_class)) < |
fatal_error ( » Failed to register dummy OpenGL window. » ); |
> |
HWND dummy_window = CreateWindowExA ( |
0 , |
window_class. lpszClassName , |
» Dummy OpenGL Window » , |
0 , |
CW_USEDEFAULT, |
CW_USEDEFAULT, |
CW_USEDEFAULT, |
CW_USEDEFAULT, |
0 , |
0 , |
window_class. hInstance , |
0 ); |
if (!dummy_window) < |
fatal_error ( » Failed to create dummy OpenGL window. » ); |
> |
HDC dummy_dc = GetDC (dummy_window); |
PIXELFORMATDESCRIPTOR pfd = < |
. nSize = sizeof (pfd), |
. nVersion = 1 , |
. iPixelType = PFD_TYPE_RGBA, |
. dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, |
. cColorBits = 32 , |
. cAlphaBits = 8 , |
. iLayerType = PFD_MAIN_PLANE, |
. cDepthBits = 24 , |
. cStencilBits = 8 , |
>; |
int pixel_format = ChoosePixelFormat (dummy_dc, &pfd); |
if (!pixel_format) < |
fatal_error ( » Failed to find a suitable pixel format. » ); |
> |
if (! SetPixelFormat (dummy_dc, pixel_format, &pfd)) < |
fatal_error ( » Failed to set the pixel format. » ); |
> |
HGLRC dummy_context = wglCreateContext (dummy_dc); |
if (!dummy_context) < |
fatal_error ( » Failed to create a dummy OpenGL rendering context. » ); |
> |
if (! wglMakeCurrent (dummy_dc, dummy_context)) < |
fatal_error ( » Failed to activate dummy OpenGL rendering context. » ); |
> |
wglCreateContextAttribsARB = (wglCreateContextAttribsARB_type*) wglGetProcAddress ( |
» wglCreateContextAttribsARB » ); |
wglChoosePixelFormatARB = (wglChoosePixelFormatARB_type*) wglGetProcAddress ( |
» wglChoosePixelFormatARB » ); |
wglMakeCurrent (dummy_dc, 0 ); |
wglDeleteContext (dummy_context); |
ReleaseDC (dummy_window, dummy_dc); |
DestroyWindow (dummy_window); |
> |
static HGLRC |
init_opengl (HDC real_dc) |
< |
init_opengl_extensions (); |
// Now we can choose a pixel format the modern way, using wglChoosePixelFormatARB. |
int pixel_format_attribs[] = < |
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE, |
WGL_SUPPORT_OPENGL_ARB, GL_TRUE, |
WGL_DOUBLE_BUFFER_ARB, GL_TRUE, |
WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB, |
WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB, |
WGL_COLOR_BITS_ARB, 32 , |
WGL_DEPTH_BITS_ARB, 24 , |
WGL_STENCIL_BITS_ARB, 8 , |
0 |
>; |
int pixel_format; |
UINT num_formats; |
wglChoosePixelFormatARB (real_dc, pixel_format_attribs, 0 , 1 , &pixel_format, &num_formats); |
if (!num_formats) < |
fatal_error ( » Failed to set the OpenGL 3.3 pixel format. » ); |
> |
PIXELFORMATDESCRIPTOR pfd; |
DescribePixelFormat (real_dc, pixel_format, sizeof (pfd), &pfd); |
if (! SetPixelFormat (real_dc, pixel_format, &pfd)) < |
fatal_error ( » Failed to set the OpenGL 3.3 pixel format. » ); |
> |
// Specify that we want to create an OpenGL 3.3 core profile context |
int gl33_attribs[] = < |
WGL_CONTEXT_MAJOR_VERSION_ARB, 3 , |
WGL_CONTEXT_MINOR_VERSION_ARB, 3 , |
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, |
0 , |
>; |
HGLRC gl33_context = wglCreateContextAttribsARB (real_dc, 0 , gl33_attribs); |
if (!gl33_context) < |
fatal_error ( » Failed to create OpenGL 3.3 context. » ); |
> |
if (! wglMakeCurrent (real_dc, gl33_context)) < |
fatal_error ( » Failed to activate OpenGL 3.3 rendering context. » ); |
> |
return gl33_context; |
> |
static LRESULT CALLBACK |
window_callback (HWND window, UINT msg, WPARAM wparam, LPARAM lparam) |
< |
LRESULT result = 0 ; |
switch (msg) < |
case WM_CLOSE: |
case WM_DESTROY: |
PostQuitMessage ( 0 ); |
break ; |
default : |
result = DefWindowProcA (window, msg, wparam, lparam); |
break ; |
> |
return result; |
> |
static HWND |
create_window (HINSTANCE inst) |
< |
WNDCLASSA window_class = < |
. style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC, |
. lpfnWndProc = window_callback, |
. hInstance = inst, |
. hCursor = LoadCursor ( 0 , IDC_ARROW), |
. hbrBackground = 0 , |
. lpszClassName = » WGL_fdjhsklf » , |
>; |
if (! RegisterClassA (&window_class)) < |
fatal_error ( » Failed to register window. » ); |
> |
// Specify a desired width and height, then adjust the rect so the window’s client area will be |
// that size. |
RECT rect = < |
. right = 1024 , |
. bottom = 576 , |
>; |
DWORD window_style = WS_OVERLAPPEDWINDOW; |
AdjustWindowRect (&rect, window_style, false ); |
HWND window = CreateWindowExA ( |
0 , |
window_class. lpszClassName , |
» OpenGL » , |
window_style, |
CW_USEDEFAULT, |
CW_USEDEFAULT, |
rect. right — rect. left , |
rect. bottom — rect. top , |
0 , |
0 , |
inst, |
0 ); |
if (!window) < |
fatal_error ( » Failed to create window. » ); |
> |
return window; |
> |
int WINAPI |
WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmd_line, int show) |
< |
HWND window = create_window (inst); |
HDC gldc = GetDC (window); |
HGLRC glrc = init_opengl (gldc); |
ShowWindow (window, show); |
UpdateWindow (window); |
bool running = true ; |
while (running) < |
MSG msg; |
while ( PeekMessageA (&msg, 0 , 0 , 0 , PM_REMOVE)) < |
if (msg. message == WM_QUIT) < |
running = false ; |
> else < |
TranslateMessage (&msg); |
DispatchMessageA (&msg); |
> |
> |
glClearColor ( 1 . 0f , 0 . 5f , 0 . 5f , 1 . 0f ); |
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
// Do OpenGL rendering here |
SwapBuffers (gldc); |
> |
return 0 ; |
> |
This comment has been minimized.
Copy link Quote reply
redoak commented Mar 13, 2020
Do you know if CS_OWNDC is recommended in all scenarios or only in some? I’m unable to find reliable information on this. It seems to have been highly recommended in the past but might not matter anymore.
This comment has been minimized.
Copy link Quote reply
nickrolfe commented Mar 13, 2020
I’m sorry, it’s been a few years since I was looking at this stuff. I vaguely remember things not working correctly without CS_OWNDC , but I can’t be sure, and I’d have to go Googling to try and remember what the flag is supposed to do exactly.
This comment has been minimized.
Copy link Quote reply
bumbread commented Nov 5, 2020
one of the tutorials on Khronos here says that OWNDC has to be there
This comment has been minimized.
Copy link Quote reply
tilkinsc commented Jan 14, 2021 •
It’s legacy support implementations of windows (no later than win98 or win95) to use the CS_OWNDC. Windows had the option of sharing DC between processes which could result in poor preformance. This feature has been deprecated.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.