Stefan Dösinger : wined3d: Destroy FBOs and reset pointers on Reset.

Alexandre Julliard julliard at winehq.org
Tue Feb 5 06:34:51 CST 2008


Module: wine
Branch: master
Commit: 4c99bd5f87adc1c035c8efff1d8e0169505ccbcb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4c99bd5f87adc1c035c8efff1d8e0169505ccbcb

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Jan 25 18:13:27 2008 +0100

wined3d: Destroy FBOs and reset pointers on Reset.

---

 dlls/wined3d/device.c |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 640a5e2..a2509a7 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6799,6 +6799,35 @@ static HRESULT WINAPI reset_unload_resources(IWineD3DResource *resource, void *d
     return S_OK;
 }
 
+static void reset_fbo_state(IWineD3DDevice *iface) {
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+    unsigned int i;
+
+    ENTER_GL();
+    GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+    checkGLcall("glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)");
+
+    if (This->fbo) {
+        GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->fbo));
+        This->fbo = 0;
+    }
+    if (This->src_fbo) {
+        GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->src_fbo));
+        This->src_fbo = 0;
+    }
+    if (This->dst_fbo) {
+        GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->dst_fbo));
+        This->dst_fbo = 0;
+    }
+    checkGLcall("Tear down fbos\n");
+    LEAVE_GL();
+
+    for (i = 0; i < GL_LIMITS(buffers); ++i) {
+        This->fbo_color_attachments[i] = NULL;
+    }
+    This->fbo_depth_attachment = NULL;
+}
+
 static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRESENT_PARAMETERS* pPresentationParameters) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     IWineD3DSwapChainImpl *swapchain;
@@ -6859,6 +6888,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
         ERR("What do do about a changed auto depth stencil parameter?\n");
     }
 
+    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
+        reset_fbo_state((IWineD3DDevice *) This);
+    }
+
     IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL);
     LIST_FOR_EACH_ENTRY(shader, &This->shaders, IWineD3DBaseShaderImpl, baseShader.shader_list_entry) {
         This->shader_backend->shader_destroy((IWineD3DBaseShader *) shader);




More information about the wine-cvs mailing list