[PATCH 3/5] wined3d: Get rid of surface_modify_location().

Henri Verbeet hverbeet at codeweavers.com
Tue Sep 10 02:32:34 CDT 2013


---
 dlls/wined3d/arb_program_shader.c |  4 ++-
 dlls/wined3d/device.c             |  5 ++-
 dlls/wined3d/drawprim.c           |  2 +-
 dlls/wined3d/surface.c            | 76 +++++++++++++++++----------------------
 dlls/wined3d/swapchain.c          | 24 ++++++++-----
 dlls/wined3d/wined3d_private.h    |  2 +-
 6 files changed, 56 insertions(+), 57 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 494c9c8..05f7557 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7495,7 +7495,9 @@ HRESULT arbfp_blit_surface(struct wined3d_device *device, DWORD filter,
 
     context_release(context);
 
-    surface_modify_location(dst_surface, dst_surface->draw_binding, TRUE);
+    surface_validate_location(dst_surface, dst_surface->draw_binding);
+    surface_invalidate_location(dst_surface, ~dst_surface->draw_binding);
+
     return WINED3D_OK;
 }
 
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 2457771..1b0137f 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -642,7 +642,10 @@ void device_clear_render_targets(struct wined3d_device *device, UINT rt_count, c
             struct wined3d_surface *rt = fb->render_targets[i];
 
             if (rt)
-                surface_modify_location(rt, rt->draw_binding, TRUE);
+            {
+                surface_validate_location(rt, rt->draw_binding);
+                surface_invalidate_location(rt, ~rt->draw_binding);
+            }
         }
 
         gl_info->gl_ops.gl.p_glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index b1901e0..c483921 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -608,7 +608,7 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co
             if (target)
             {
                 surface_load_location(target, target->draw_binding, NULL);
-                surface_modify_location(target, target->draw_binding, TRUE);
+                surface_invalidate_location(target, ~target->draw_binding);
             }
         }
     }
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 01035b4..dbf6fef 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -826,7 +826,7 @@ static void surface_realize_palette(struct wined3d_surface *surface)
                 TRACE("Palette changed with surface that does not have an up to date system memory copy.\n");
                 surface_load_location(surface, SFLAG_INSYSMEM, NULL);
             }
-            surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+            surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
         }
     }
 
@@ -885,7 +885,8 @@ static void surface_map(struct wined3d_surface *surface, const RECT *rect, DWORD
     {
         TRACE("WINED3D_MAP_DISCARD flag passed, marking SYSMEM as up to date.\n");
         surface_prepare_system_memory(surface);
-        surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+        surface_validate_location(surface, SFLAG_INSYSMEM);
+        surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
     }
     else
     {
@@ -1009,7 +1010,8 @@ static void surface_unmap(struct wined3d_surface *surface)
          * date because only a subrectangle was read in Map(). */
         if (!fullsurface)
         {
-            surface_modify_location(surface, surface->draw_binding, TRUE);
+            surface_validate_location(surface, surface->draw_binding);
+            surface_invalidate_location(surface, ~surface->draw_binding);
             surface_evict_sysmem(surface);
         }
 
@@ -1488,7 +1490,8 @@ static BOOL surface_init_sysmem(struct wined3d_surface *surface)
         memset(surface->resource.allocatedMemory, 0, surface->resource.size);
     }
 
-    surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+    surface_validate_location(surface, SFLAG_INSYSMEM);
+    surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
 
     return TRUE;
 }
@@ -2268,7 +2271,9 @@ HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const P
 
     context_release(context);
 
-    surface_modify_location(dst_surface, SFLAG_INTEXTURE, TRUE);
+    surface_validate_location(dst_surface, SFLAG_INTEXTURE);
+    surface_invalidate_location(dst_surface, ~SFLAG_INTEXTURE);
+
     return WINED3D_OK;
 }
 
@@ -2466,7 +2471,9 @@ void surface_add_dirty_rect(struct wined3d_surface *surface, const struct wined3
         /* No partial locking for textures yet. */
         surface_load_location(surface, SFLAG_INSYSMEM, NULL);
 
-    surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+    surface_validate_location(surface, SFLAG_INSYSMEM);
+    surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
+
     if (dirty_rect)
     {
         surface->dirtyRect.left = min(surface->dirtyRect.left, dirty_rect->left);
@@ -2516,10 +2523,7 @@ HRESULT surface_load(struct wined3d_surface *surface, BOOL srgb)
          * the surface. Make sure we have it. */
 
         surface_load_location(surface, SFLAG_INSYSMEM, NULL);
-        /* Make sure the texture is reloaded because of the color key change,
-         * this kills performance though :( */
-        /* TODO: This is not necessarily needed with hw palettized texture support. */
-        surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+        surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
         /* Switching color keying on / off may change the internal format. */
         if (ck_changed)
             surface_force_reload(surface);
@@ -2898,7 +2902,8 @@ HRESULT CDECL wined3d_surface_set_mem(struct wined3d_surface *surface, void *mem
         surface->flags |= SFLAG_USERPTR;
 
         /* Now the surface memory is most up do date. Invalidate drawable and texture. */
-        surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+        surface_validate_location(surface, SFLAG_INSYSMEM);
+        surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
 
         /* For client textures OpenGL has to be notified. */
         if (surface->flags & SFLAG_CLIENT)
@@ -2924,7 +2929,8 @@ HRESULT CDECL wined3d_surface_set_mem(struct wined3d_surface *surface, void *mem
             surface_prepare_system_memory(surface);
         }
 
-        surface_modify_location(surface, SFLAG_INSYSMEM, TRUE);
+        surface_validate_location(surface, SFLAG_INSYSMEM);
+        surface_invalidate_location(surface, ~SFLAG_INSYSMEM);
     }
 
     surface->pitch = pitch;
@@ -4503,10 +4509,10 @@ static void fb_copy_to_texture_direct(struct wined3d_surface *dst_surface, struc
 
     context_release(context);
 
-    /* The texture is now most up to date - If the surface is a render target and has a drawable, this
-     * path is never entered
-     */
-    surface_modify_location(dst_surface, SFLAG_INTEXTURE, TRUE);
+    /* The texture is now most up to date - If the surface is a render target
+     * and has a drawable, this path is never entered. */
+    surface_validate_location(dst_surface, SFLAG_INTEXTURE);
+    surface_invalidate_location(dst_surface, ~SFLAG_INTEXTURE);
 }
 
 /* Uses the hardware to stretch and flip the image */
@@ -4776,10 +4782,10 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_surface *dst_surface, st
 
     context_release(context);
 
-    /* The texture is now most up to date - If the surface is a render target and has a drawable, this
-     * path is never entered
-     */
-    surface_modify_location(dst_surface, SFLAG_INTEXTURE, TRUE);
+    /* The texture is now most up to date - If the surface is a render target
+     * and has a drawable, this path is never entered. */
+    surface_validate_location(dst_surface, SFLAG_INTEXTURE);
+    surface_invalidate_location(dst_surface, ~SFLAG_INTEXTURE);
 }
 
 /* Front buffer coordinates are always full screen coordinates, but our GL
@@ -5076,7 +5082,8 @@ static HRESULT surface_blt_special(struct wined3d_surface *dst_surface, const RE
         src_surface->CKeyFlags = oldCKeyFlags;
         src_surface->src_blt_color_key = old_blt_key;
 
-        surface_modify_location(dst_surface, dst_surface->draw_binding, TRUE);
+        surface_validate_location(dst_surface, dst_surface->draw_binding);
+        surface_invalidate_location(dst_surface, ~dst_surface->draw_binding);
 
         return WINED3D_OK;
     }
@@ -5327,7 +5334,7 @@ void surface_load_ds_location(struct wined3d_surface *surface, struct wined3d_co
     surface->ds_current_size.cy = surface->resource.height;
 }
 
-static void surface_validate_location(struct wined3d_surface *surface, DWORD location)
+void surface_validate_location(struct wined3d_surface *surface, DWORD location)
 {
     struct wined3d_surface *overlay;
 
@@ -5357,27 +5364,6 @@ void surface_invalidate_location(struct wined3d_surface *surface, DWORD location
         ERR("Surface %p does not have any up to date location.\n", surface);
 }
 
-void surface_modify_location(struct wined3d_surface *surface, DWORD location, BOOL persistent)
-{
-    TRACE("surface %p, location %s, persistent %#x.\n",
-            surface, debug_surflocation(location), persistent);
-
-    if (wined3d_settings.offscreen_rendering_mode == ORM_FBO && surface_is_offscreen(surface)
-            && !(surface->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
-            && (location & SFLAG_INDRAWABLE))
-        ERR("Trying to invalidate the SFLAG_INDRAWABLE location of an offscreen surface.\n");
-
-    if (persistent)
-    {
-        surface_validate_location(surface, location);
-        surface_invalidate_location(surface, ~location);
-    }
-    else
-    {
-        surface_invalidate_location(surface, location);
-    }
-}
-
 static DWORD resource_access_from_location(DWORD location)
 {
     switch (location)
@@ -6811,7 +6797,9 @@ HRESULT CDECL wined3d_surface_blt(struct wined3d_surface *dst_surface, const REC
                 surface_blt_fbo(device, filter,
                         src_surface, src_surface->draw_binding, &src_rect,
                         dst_surface, dst_surface->draw_binding, &dst_rect);
-                surface_modify_location(dst_surface, dst_surface->draw_binding, TRUE);
+                surface_validate_location(dst_surface, dst_surface->draw_binding);
+                surface_invalidate_location(dst_surface, ~dst_surface->draw_binding);
+
                 return WINED3D_OK;
             }
 
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 48917fd..62827c9 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -602,32 +602,35 @@ static void swapchain_gl_present(struct wined3d_swapchain *swapchain, const RECT
 
         if (front->resource.size == back_buffer->resource.size)
         {
-            DWORD fbflags;
             flip_surface(front, back_buffer);
 
             /* Tell the front buffer surface that is has been modified. However,
              * the other locations were preserved during that, so keep the flags.
              * This serves to update the emulated overlay, if any. */
-            fbflags = front->flags;
-            surface_modify_location(front, SFLAG_INDRAWABLE, TRUE);
-            front->flags = fbflags;
+            surface_validate_location(front, SFLAG_INDRAWABLE);
         }
         else
         {
-            surface_modify_location(front, SFLAG_INDRAWABLE, TRUE);
-            surface_modify_location(back_buffer, SFLAG_INDRAWABLE, TRUE);
+            surface_validate_location(front, SFLAG_INDRAWABLE);
+            surface_invalidate_location(front, ~SFLAG_INDRAWABLE);
+            surface_validate_location(back_buffer, SFLAG_INDRAWABLE);
+            surface_invalidate_location(back_buffer, ~SFLAG_INDRAWABLE);
         }
     }
     else
     {
-        surface_modify_location(swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE);
+        surface_validate_location(swapchain->front_buffer, SFLAG_INDRAWABLE);
+        surface_invalidate_location(swapchain->front_buffer, ~SFLAG_INDRAWABLE);
         /* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM
          * and INTEXTURE copies can keep their old content if they have any defined content.
          * If the swapeffect is COPY, the content remains the same. If it is FLIP however,
          * the texture / sysmem copy needs to be reloaded from the drawable
          */
         if (swapchain->desc.swap_effect == WINED3D_SWAP_EFFECT_FLIP)
-            surface_modify_location(back_buffer, back_buffer->draw_binding, TRUE);
+        {
+            surface_validate_location(back_buffer, back_buffer->draw_binding);
+            surface_invalidate_location(back_buffer, ~back_buffer->draw_binding);
+        }
     }
 
     if (fb->depth_stencil)
@@ -898,7 +901,10 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
 
     surface_set_swapchain(swapchain->front_buffer, swapchain);
     if (!(device->wined3d->flags & WINED3D_NO3D))
-        surface_modify_location(swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE);
+    {
+        surface_validate_location(swapchain->front_buffer, SFLAG_INDRAWABLE);
+        surface_invalidate_location(swapchain->front_buffer, ~SFLAG_INDRAWABLE);
+    }
 
     /* MSDN says we're only allowed a single fullscreen swapchain per device,
      * so we should really check to see if there is a fullscreen swapchain
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 06e17f3..6753ad3 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2261,7 +2261,6 @@ void surface_load_ds_location(struct wined3d_surface *surface,
 void surface_load_fb_texture(struct wined3d_surface *surface, BOOL srgb) DECLSPEC_HIDDEN;
 HRESULT surface_load_location(struct wined3d_surface *surface, DWORD location, const RECT *rect) DECLSPEC_HIDDEN;
 void surface_modify_ds_location(struct wined3d_surface *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN;
-void surface_modify_location(struct wined3d_surface *surface, DWORD location, BOOL persistent) DECLSPEC_HIDDEN;
 void surface_prepare_rb(struct wined3d_surface *surface,
         const struct wined3d_gl_info *gl_info, BOOL multisample) DECLSPEC_HIDDEN;
 void surface_prepare_texture(struct wined3d_surface *surface,
@@ -2276,6 +2275,7 @@ void surface_translate_drawable_coords(const struct wined3d_surface *surface, HW
 void surface_update_draw_binding(struct wined3d_surface *surface) DECLSPEC_HIDDEN;
 HRESULT surface_upload_from_surface(struct wined3d_surface *dst_surface, const POINT *dst_point,
         struct wined3d_surface *src_surface, const RECT *src_rect) DECLSPEC_HIDDEN;
+void surface_validate_location(struct wined3d_surface *surface, DWORD location) DECLSPEC_HIDDEN;
 
 void get_drawable_size_swapchain(const struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
 void get_drawable_size_backbuffer(const struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
-- 
1.8.1.5




More information about the wine-patches mailing list