From cd623036fc1b01517e789fe675675a9f94428dcd Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 15 Dec 2009 17:51:37 +0100 Subject: [PATCH] wined3d: Mark the draw buffer as dirty in context_create(). Currently callers of this function are responsible for setting the draw buffer correctly, but they don't do a very good job: - swapchain_init() sets the draw buffer to GL_BACK if there's a back buffer, even though the context's target is always the front buffer. - swapchain_create_context_for_thread() depends on (eventually) being called by FindContext(). - create_primary_opengl_context() and IWineD3DSwapChainImpl_SetDestWindowOverride() don't bother setting a draw buffer at all. Just marking the draw buffer dirty lets the context management sort it all out, and is much simpler. --- dlls/wined3d/context.c | 1 + dlls/wined3d/swapchain.c | 22 +--------------------- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 2f27997291f..30590af72df 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -1349,6 +1349,7 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface ret->surface = (IWineD3DSurface *) target; ret->current_rt = (IWineD3DSurface *)target; ret->render_offscreen = surface_is_offscreen((IWineD3DSurface *) target); + ret->draw_buffer_dirty = TRUE; ret->tid = GetCurrentThreadId(); if(This->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *) This)) { /* Create the dirty constants array and initialize them to dirty */ diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index fb902ea6a45..7e6c71e282f 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -809,6 +809,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface hr = WINED3DERR_NOTAVAILABLE; goto err; } + context_release(swapchain->context[0]); } else { @@ -841,30 +842,9 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface IWineD3DSurface_SetContainer(swapchain->backBuffer[i], (IWineD3DBase *)swapchain); ((IWineD3DSurfaceImpl *)swapchain->backBuffer[i])->Flags |= SFLAG_SWAPCHAIN; - - if (surface_type == SURFACE_OPENGL) - { - ENTER_GL(); - glDrawBuffer(GL_BACK); - checkGLcall("glDrawBuffer(GL_BACK)"); - LEAVE_GL(); - } - } - } - else - { - /* Single buffering - draw to front buffer */ - if (surface_type == SURFACE_OPENGL) - { - ENTER_GL(); - glDrawBuffer(GL_FRONT); - checkGLcall("glDrawBuffer(GL_FRONT)"); - LEAVE_GL(); } } - if (swapchain->context[0]) context_release(swapchain->context[0]); - /* Swapchains share the depth/stencil buffer, so only create a single depthstencil surface. */ if (present_parameters->EnableAutoDepthStencil && surface_type == SURFACE_OPENGL) { -- 2.11.4.GIT