2009/12/11 Stefan Dösinger stefandoesinger@gmx.at:
- Setting "render_offscreen" is really the responsibility of the context_create() call, similar to create_primary_opengl_context().
context_create() doesn't take a swapchain as parameter, only a window. This is correct, because GL contexts are linked to the drawable, not the swapchain. Thus context_create doesn't have the needed information to set the offscreen flag. (I could just pass in a TRUE or FALSE parameter, but there's something else)
It has a "target" parameter that can be either an onscreen or offscreen surface. This parameter is also used to set the initial "current_rt" field. "similar to create_primary_opengl_context()" was perhaps badly worded, what I meant is that context_create() should be setting "render_offscreen", not its callers.
As a sidenode, maybe create_primary_opengl_context is named badly. It's not part of the context management, its a device helper function that happens to use the context management to set up a GL context, among other things. Maybe device_restart_opengl or something similar is better.
Yeah.
- The line is actually wrong, the relevant context has been setup to render to the front buffer, so "render_offscreen" should always be FALSE, even if there is a back buffer.
Well, this code is in the backbuffer path. Render_offscreen is false if we don't set it due to the alloc HEAP_ZERO_MEMORY. The point of the line is to set it to true if we render to an FBO. We never set a swapchain to render to the front buffer at creation time if there is a back buffer.
"context_create(device, (IWineD3DSurfaceImpl *)swapchain->frontBuffer, window, FALSE /* pbuffer */, present_parameters);"
The draw buffer handling in swapchain_init() is also broken in the sense that it always sets GL_BACK if there's a back buffer, regardless of what the context thinks it should be, but that's a separate issue, I'm working on some patches to fix draw buffer handling in the general case.