Module: wine Branch: master Commit: ef65b233c048fe34e391d48fba1c25951ece2376 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ef65b233c048fe34e391d48fba...
Author: Stefan Dösinger stefandoesinger@gmx.at Date: Sat Jun 9 14:59:15 2007 +0200
wined3d: Some render target->texture blit context handling.
---
dlls/wined3d/device.c | 15 ++++++++++++--- dlls/wined3d/surface.c | 14 ++++---------- 2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 96186d5..f3bf509 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5553,9 +5553,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED TRACE("src_rect [%u, %u]->[%u, %u]\n", src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2); TRACE("dst_rect [%u, %u]->[%u, %u]\n", dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2);
- glDisable(GL_SCISSOR_TEST); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); - switch (filter) { case WINED3DTEXF_LINEAR: gl_filter = GL_LINEAR; @@ -5571,10 +5568,12 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
/* Attach src surface to src fbo */ src_swapchain = get_swapchain(src_surface); + ENTER_GL(); if (src_swapchain) { GLenum buffer;
TRACE("Source surface %p is onscreen\n", src_surface); + ActivateContext(This, src_surface, CTXUSAGE_RESOURCELOAD);
GL_EXTCALL(glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0)); buffer = surface_get_gl_buffer(src_surface, src_swapchain); @@ -5597,6 +5596,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED GLenum buffer;
TRACE("Destination surface %p is onscreen\n", dst_surface); + ActivateContext(This, dst_surface, CTXUSAGE_RESOURCELOAD);
GL_EXTCALL(glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0)); buffer = surface_get_gl_buffer(dst_surface, dst_swapchain); @@ -5607,11 +5607,19 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED dst_rect->y2 = ((IWineD3DSurfaceImpl *)dst_surface)->currentDesc.Height - dst_rect->y2; } else { TRACE("Destination surface %p is offscreen\n", dst_surface); + + /* No src or dst swapchain? Make sure some context is active(multithreading) */ + if(!src_swapchain) { + ActivateContext(This, This->lastActiveRenderTarget, CTXUSAGE_RESOURCELOAD); + } + bind_fbo(iface, GL_DRAW_FRAMEBUFFER_EXT, &This->dst_fbo); attach_surface_fbo(This, GL_DRAW_FRAMEBUFFER_EXT, 0, dst_surface); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); checkGLcall("glDrawBuffer()"); } + glDisable(GL_SCISSOR_TEST); + IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
if (flip) { GL_EXTCALL(glBlitFramebufferEXT(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2, @@ -5636,6 +5644,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED glDrawBuffer(GL_BACK); checkGLcall("glDrawBuffer()"); } + LEAVE_GL(); }
static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget) { diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 2d3b925..587f41e 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -2385,6 +2385,7 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D ENTER_GL();
ActivateContext(myDevice, SrcSurface, CTXUSAGE_BLIT); + IWineD3DSurface_PreLoad((IWineD3DSurface *) This);
/* Bind the target texture */ glBindTexture(GL_TEXTURE_2D, This->glDescription.textureName); @@ -2470,6 +2471,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine /* Activate the Proper context for reading from the source surface, set it up for blitting */ ENTER_GL(); ActivateContext(myDevice, SrcSurface, CTXUSAGE_BLIT); + IWineD3DSurface_PreLoad((IWineD3DSurface *) This);
/* Try to use an aux buffer for drawing the rectangle. This way it doesn't need restoring. * This way we don't have to wait for the 2nd readback to finish to leave this function. @@ -2802,17 +2804,9 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * /* Destination color key is checked above */ }
- /* Call preload for the surface to make sure it isn't dirty */ - if (GL_SUPPORT(ARB_MULTITEXTURE)) { - GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB)); - checkGLcall("glActiveTextureARB"); - } - IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, STATE_SAMPLER(0)); - IWineD3DSurface_PreLoad((IWineD3DSurface *) This); - /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag - * glCopyTexSubImage is a bit picky about the parameters we pass to it - */ + * glCopyTexSubImage is a bit picky about the parameters we pass to it + */ if(SrcRect) { if(SrcRect->top < SrcRect->bottom) { srect.y1 = SrcRect->top;