I read and understand your arguments. Saying "it's not meant to be" seems awfully closed-minded, but it's the truth. The graphics API's really didn't want it to be. Take OpenGL for instance:
window = glfwCreateWindow( 1024, 768, "MyWindow", NULL, NULL);
You'd have to re-create the OpenGL-context to change the resolution. The same goes for D3D, you lose the device when you change settings.
That is definitely not the case with modern D3D. In D3D9 you needed to recreate resources (except those in the managed pool), but in D3D9Ex and especially D3D10/D3D11 all you need is a few API calls.
I'm not sure about exclusive fullscreen mode in OpenGL, but if we're talking about windowed/borderless resolution then you can easily change it without destroying the context.
side note is also that GLFW builds on OpenGL, but it is not itself OpenGL.
different restrictions and limitations may apply depending on if one goes through an API like this, or uses lower-level / OS-level APIs (such as WGL or GLX). it may be needed to investigate what the API provides, and if it really isn't usable, to side-step it where appropriate.
dunno about others engines, but fullscreen mode can be done (on Windows) basically by invoking an OS API call to change the resolution, and also changing the current window-style (disabling title bar and borders, ...) and if needed stretching the window to the new screen resolution.
if no in-game resolution change is involved, then this is basically just switching the screen resolution (if needed) and positioning the window to cover the whole screen.
(in my case done mostly via WGL and GDI calls... not looked into it, but similar may apply to GLX+X11).
it seems like one can do a bigger or variable size window by first creating it at the maximum size (and/or full-screen/desktop resolution), and then resizing the window to the target size (if needed). if there is a better way, I am not really aware of it (trying to increase the window past its size when it was originally created seems to result in a not-correctly-updated / garbage area around its edges).
when the window is first created bigger and then downsized, I suspect it uses bigger-resolution buffers or something.
an advantage I have found of changing the game resolution for fullscreen (vs changing screen resolution to match the window), is that if the full-screen resolution is the same as the desktop resolution, then it doesn't go and shove all the windows off into a corner (or onto my secondary monitor), and also can match the native resolution of an LCD flat-panel (otherwise there seems to be big black-borders around the edges of the screen and other issues).
IOW, for example:
create window initially, say, at 1680x1050 (assuming full-screen resolution, on other monitors may be 1920x1080 or whatever else);
set up GL context and similar at this point;
if windowed, resize the window to 1440x900 or 1280x800 or similar, and center on-screen;
or, if full-screen, switch to fullscreen mode and position window in the screen-corner.
it may also make sense to create any internal FBOs and similar at the maximum resolution, such as to avoid needing to destroy/recreate them (if entering/leaving fullscreen).
a lot of the rest is mostly things inside the engine, like whatever is passed to glViewport, ...
for example, the viewport will use the current resolution, rather than the max resolution.
so, yeah, no destruction/recreation of the context (or window) is needed here.
much beyond this, dunno...
Edited by BGB, 22 February 2014 - 02:04 PM.