Henri Verbeet : wined3d: Keep track of a surface's "draw location".

Alexandre Julliard julliard at winehq.org
Wed Aug 24 14:05:19 CDT 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Aug 23 20:08:08 2011 +0200

wined3d: Keep track of a surface's "draw location".

---

 dlls/wined3d/context.c         |    1 +
 dlls/wined3d/device.c          |    1 +
 dlls/wined3d/drawprim.c        |    6 +++---
 dlls/wined3d/surface.c         |    9 +++++++++
 dlls/wined3d/swapchain.c       |   13 +++++++++++++
 dlls/wined3d/wined3d_private.h |    3 +++
 6 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 9a67536..42d26bc 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1930,6 +1930,7 @@ static void context_validate_onscreen_formats(struct wined3d_context *context,
     /* The currently active context is the necessary context to access the swapchain's onscreen buffers */
     surface_load_location(context->current_rt, SFLAG_INTEXTURE, NULL);
     swapchain->render_to_fbo = TRUE;
+    swapchain_update_draw_bindings(swapchain);
     context_set_render_offscreen(context, TRUE);
 }
 
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 39219bf..cdc1827 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5880,6 +5880,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
     stateblock_init_default_state(device->stateBlock);
 
     swapchain_update_render_to_fbo(swapchain);
+    swapchain_update_draw_bindings(swapchain);
 
     hr = create_primary_opengl_context(device, swapchain);
     wined3d_swapchain_decref(swapchain);
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 5f2198e..ea2dd8f 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -591,8 +591,8 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
             struct wined3d_surface *target = device->fb.render_targets[i];
             if (target)
             {
-                surface_load_location(target, SFLAG_INDRAWABLE, NULL);
-                surface_modify_location(target, SFLAG_INDRAWABLE, TRUE);
+                surface_load_location(target, target->draw_binding, NULL);
+                surface_modify_location(target, target->draw_binding, TRUE);
             }
         }
     }
@@ -638,7 +638,7 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
             if (state->render_states[WINED3DRS_ZWRITEENABLE])
             {
                 surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
-                surface_modify_location(ds, SFLAG_INDRAWABLE, TRUE);
+                surface_modify_location(ds, ds->draw_binding, TRUE);
             }
         }
     }
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 3cd424e..cc581d2 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -100,6 +100,14 @@ static void surface_cleanup(struct wined3d_surface *surface)
     resource_cleanup(&surface->resource);
 }
 
+void surface_update_draw_binding(struct wined3d_surface *surface)
+{
+    if (!surface_is_offscreen(surface) || wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+        surface->draw_binding = SFLAG_INDRAWABLE;
+    else
+        surface->draw_binding = SFLAG_INTEXTURE;
+}
+
 void surface_set_container(struct wined3d_surface *surface, enum wined3d_container_type type, void *container)
 {
     TRACE("surface %p, container %p.\n", surface, container);
@@ -131,6 +139,7 @@ void surface_set_container(struct wined3d_surface *surface, enum wined3d_contain
 
     surface->container.type = type;
     surface->container.u.base = container;
+    surface_update_draw_binding(surface);
 }
 
 struct blt_info
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 6edb043..20c2323 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -518,6 +518,7 @@ static HRESULT swapchain_gl_present(struct wined3d_swapchain *swapchain, const R
         surface_load_location(swapchain->back_buffers[0], SFLAG_INTEXTURE, NULL);
         surface_modify_location(swapchain->back_buffers[0], SFLAG_INDRAWABLE, FALSE);
         swapchain->render_to_fbo = TRUE;
+        swapchain_update_draw_bindings(swapchain);
     }
 
     if (swapchain->render_to_fbo)
@@ -1245,3 +1246,15 @@ HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain)
 
     return swapchain->backup_dc;
 }
+
+void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
+{
+    UINT i;
+
+    surface_update_draw_binding(swapchain->front_buffer);
+
+    for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
+    {
+        surface_update_draw_binding(swapchain->back_buffers[i]);
+    }
+}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 80517e3..754d49e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1996,6 +1996,7 @@ struct wined3d_surface
     struct wined3d_subresource_container container;
     struct wined3d_palette *palette; /* D3D7 style palette handling */
     PALETTEENTRY              *palette9; /* D3D8/9 style palette handling */
+    DWORD draw_binding;
 
     DWORD flags;
 
@@ -2080,6 +2081,7 @@ void surface_set_container(struct wined3d_surface *surface,
 void surface_set_texture_name(struct wined3d_surface *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN;
 void surface_set_texture_target(struct wined3d_surface *surface, GLenum target) DECLSPEC_HIDDEN;
 void surface_translate_drawable_coords(const struct wined3d_surface *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN;
+void surface_update_draw_binding(struct wined3d_surface *surface) DECLSPEC_HIDDEN;
 void surface_upload_data(const struct wined3d_surface *surface, const struct wined3d_gl_info *gl_info,
         const struct wined3d_format *format, const RECT *src_rect, UINT src_w, const POINT *dst_point,
         BOOL srgb, const struct wined3d_bo_address *data) DECLSPEC_HIDDEN;
@@ -2442,6 +2444,7 @@ void x11_copy_to_screen(const struct wined3d_swapchain *swapchain, const RECT *r
 struct wined3d_context *swapchain_get_context(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
+void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 
 #define DEFAULT_REFRESH_RATE 0




More information about the wine-cvs mailing list