I've had a simple game working fine, and have had no problems until I decided to switch it over to fullscreen mode. Unfortunately once I enable fullscreen mode I am starting to receive GL_INVALID_OPERATION errors every time I check glGetError. This doesn't happen in windowed mode, and I'm trying to understand what might be causing this to happen.
The window goes into fullscreen mode just fine, and actually partially works, all of my fullscreen background quads are rendered and some of my background shaders are executing properly, but none of my meshes are appearing. So I know that OpenGL is functioning to some extent.
Anyway that is all anecdotal, just really trying to figure out why I'm getting these errors. I'll paste my startup code and see if anyone notices anything.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX windowClass; // window class
HWND hwnd; // window handle
MSG msg; // message
RECT windowRect;
windowRect.left=(long)0; // Set Left Value To 0
windowRect.right=(long)WINDOWWIDTH; // Set Right Value To Requested Width
windowRect.top=(long)0; // Set Top Value To 0
windowRect.bottom=(long)WINDOWHEIGHT; // Set Bottom Value To Requested Height
// fill out the window class structure
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
windowClass.lpfnWndProc = MainWindowProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance;
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // default icon
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // default arrow
windowClass.hbrBackground = NULL; // don't need background
windowClass.lpszMenuName = NULL; // no menu
windowClass.lpszClassName = "GLClass";
windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // windows logo small icon
if (!RegisterClassEx(&windowClass)){
DWORD err = GetLastError();
return 0;
}
CreateGLWindow(windowClass,windowRect,hInstance,&hwnd);
...
Looking good so far...
bool CreateGLWindow(WNDCLASSEX windowClass, RECT windowRect, HINSTANCE hInstance, HWND *hwnd){
DWORD dwExStyle; // Window Extended Style
DWORD dwStyle; // Window Style
HGLRC hRC;
if (fullscreen) // fullscreen?
{
int monitors = GetSystemMetrics(SM_CMONITORS);
DISPLAY_DEVICE dd;
DEVMODE dm;
dd.cb= sizeof(dd);
std::vector<DISPLAY_DEVICE> devices;
std::vector<DEVMODE> devmodes;
int i = 0;
while(EnumDisplayDevices(0,i,&dd,0)){
devices.push_back(dd);
EnumDisplaySettings(dd.DeviceName,ENUM_CURRENT_SETTINGS,&dm);
devmodes.push_back(dm);
i++;
}
DEVMODE dmScreenSettings; // device mode
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize = sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = devmodes[1].dmPelsWidth; // screen width
dmScreenSettings.dmPelsHeight = devmodes[1].dmPelsHeight; // screen height
dmScreenSettings.dmBitsPerPel = devmodes[1].dmBitsPerPel; // bits per pixel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
if (ChangeDisplaySettingsEx(devices[1].DeviceName,&dmScreenSettings,0, CDS_FULLSCREEN,0) != DISP_CHANGE_SUCCESSFUL)
{
MessageBox(NULL, "Display mode failed", NULL, MB_OK);
fullscreen = FALSE;
}
}
if (fullscreen) // Are We Still In Fullscreen Mode?
{
dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
dwStyle=WS_POPUP; // Windows Style
ShowCursor(FALSE); // Hide Mouse Pointer
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style
}
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size
*hwnd = CreateWindowEx(NULL, // extended style
"GLClass", // class name16829936
"Isle", // app name
dwStyle | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS,
0, 0, // x,y coordinate
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top, // width, height
NULL, // handle to parent
NULL, // handle to menu
hInstance, // application instance
NULL); // no extra params
This section is the only difference I have between fullscreen and windowed mode, just changing some Display Settings. I'm not real experienced here so its possible I'm doing something stupid. Calling CreateWindowEx fires off a CALLBACK MainWindowProc with message WM_SIZE, where I'm checking for opengl error. In windowed mode this passes just fine, while failing with GL_INVALID_OPERATION in fullscreen.
Any ideas?