Henri Verbeet : wined3d: Handle destruction of a context' s current render target.

Alexandre Julliard julliard at winehq.org
Mon Aug 3 11:14:31 CDT 2009


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Aug  3 08:06:48 2009 +0200

wined3d: Handle destruction of a context's current render target.

---

 dlls/wined3d/context.c |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 413c1d6..0d04728 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -594,6 +594,8 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
                 const struct wined3d_gl_info *gl_info = context->gl_info;
                 struct fbo_entry *entry, *entry2;
 
+                if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL;
+
                 ENTER_GL();
 
                 LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
@@ -1716,7 +1718,6 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
     struct WineD3DContext *current_context = context_get_current();
     BOOL oldRenderOffscreen = This->render_offscreen;
     const struct StateEntry *StateTable = This->StateTable;
-    const struct GlPixelFormatDesc *old, *new;
     struct WineD3DContext *context;
 
     if (current_context && current_context->destroyed) current_context = NULL;
@@ -1724,6 +1725,7 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf
     if (!target)
     {
         if (current_context
+                && current_context->current_rt
                 && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.wineD3DDevice == This)
         {
             target = current_context->current_rt;
@@ -1833,15 +1835,23 @@ retry:
 
     /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
      * the alpha blend state changes with different render target formats. */
-    old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
-    new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
-    if (old->format != new->format)
+    if (!context->current_rt)
+    {
+        Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+    }
+    else
     {
-        /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
-        if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
-                || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
+        const struct GlPixelFormatDesc *old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
+        const struct GlPixelFormatDesc *new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
+
+        if (old->format != new->format)
         {
-            Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+            /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
+            if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
+                    || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
+            {
+                Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+            }
         }
     }
 
@@ -1871,7 +1881,7 @@ retry:
      *    After that, the outer ActivateContext(which calls PreLoad) can activate the new
      *    target for the new thread
      */
-    if (readTexture && context->current_rt != target)
+    if (readTexture && context->current_rt && context->current_rt != target)
     {
         BOOL oldInDraw = This->isInDraw;
 




More information about the wine-cvs mailing list