Henri Verbeet : wined3d: Pass a texture and sub-resource index to context_restore().

Alexandre Julliard julliard at winehq.org
Mon Mar 12 17:40:24 CDT 2018


Module: wine
Branch: master
Commit: 21257be2a9350a664f21daf1a01ccc87c97bb5c8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=21257be2a9350a664f21daf1a01ccc87c97bb5c8

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Mon Mar 12 12:54:47 2018 +0330

wined3d: Pass a texture and sub-resource index to context_restore().

Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/context.c         |  8 +++-----
 dlls/wined3d/surface.c         | 20 +++++++++++---------
 dlls/wined3d/wined3d_private.h |  3 ++-
 3 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 60bf52b..6c635f5 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1585,14 +1585,12 @@ void context_release(struct wined3d_context *context)
 /* This is used when a context for render target A is active, but a separate context is
  * needed to access the WGL framebuffer for render target B. Re-acquire a context for rt
  * A to avoid breaking caller code. */
-void context_restore(struct wined3d_context *context, struct wined3d_surface *restore)
+void context_restore(struct wined3d_context *context, struct wined3d_texture *texture, unsigned int sub_resource_idx)
 {
-    if (context->current_rt.texture != restore->container
-            || context->current_rt.sub_resource_idx != surface_get_sub_resource_idx(restore))
+    if (context->current_rt.texture != texture || context->current_rt.sub_resource_idx != sub_resource_idx)
     {
         context_release(context);
-        context = context_acquire(restore->container->resource.device,
-                restore->container, surface_get_sub_resource_idx(restore));
+        context = context_acquire(texture->resource.device, texture, sub_resource_idx);
     }
 
     context_release(context);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index e98541c..b830447 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -507,7 +507,7 @@ static void texture2d_blt_fbo(const struct wined3d_device *device, struct wined3
         gl_info->gl_ops.gl.p_glFlush();
 
     if (restore_texture)
-        context_restore(context, restore_texture->sub_resources[restore_idx].u.surface);
+        context_restore(context, restore_texture, restore_idx);
 }
 
 static BOOL fbo_blitter_supported(enum wined3d_blit_op blit_op, const struct wined3d_gl_info *gl_info,
@@ -1471,7 +1471,7 @@ error:
     }
 
     if (restore_texture)
-        context_restore(context, restore_texture->sub_resources[restore_idx].u.surface);
+        context_restore(context, restore_texture, restore_idx);
 }
 
 /* Read the framebuffer contents into a texture. Note that this function
@@ -1518,7 +1518,7 @@ void texture2d_load_fb_texture(struct wined3d_texture *texture,
     checkGLcall("glCopyTexSubImage2D");
 
     if (restore_texture)
-        context_restore(context, restore_texture->sub_resources[restore_idx].u.surface);
+        context_restore(context, restore_texture, restore_idx);
 }
 
 /* Does a direct frame buffer -> texture copy. Stretching is done with single
@@ -2106,9 +2106,10 @@ BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_res
 BOOL texture2d_load_drawable(struct wined3d_texture *texture,
         unsigned int sub_resource_idx, struct wined3d_context *context)
 {
-    struct wined3d_surface *restore_rt = NULL;
+    struct wined3d_texture *restore_texture;
     struct wined3d_surface *surface;
     struct wined3d_device *device;
+    unsigned int restore_idx;
     unsigned int level;
     RECT r;
 
@@ -2129,11 +2130,12 @@ BOOL texture2d_load_drawable(struct wined3d_texture *texture,
 
     device = texture->resource.device;
     surface = texture->sub_resources[sub_resource_idx].u.surface;
-    restore_rt = context_get_rt_surface(context);
-    if (restore_rt != surface)
+    restore_texture = context->current_rt.texture;
+    restore_idx = context->current_rt.sub_resource_idx;
+    if (restore_texture != texture || restore_idx != sub_resource_idx)
         context = context_acquire(device, texture, sub_resource_idx);
     else
-        restore_rt = NULL;
+        restore_texture = NULL;
 
     level = sub_resource_idx % texture->level_count;
     SetRect(&r, 0, 0, wined3d_texture_get_level_width(texture, level),
@@ -2144,8 +2146,8 @@ BOOL texture2d_load_drawable(struct wined3d_texture *texture,
             surface, WINED3D_LOCATION_DRAWABLE, &r,
             NULL, WINED3D_TEXF_POINT);
 
-    if (restore_rt)
-        context_restore(context, restore_rt);
+    if (restore_texture)
+        context_restore(context, restore_texture, restore_idx);
 
     return TRUE;
 }
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 753681f..e961ddf 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2170,7 +2170,8 @@ struct wined3d_context *context_reacquire(const struct wined3d_device *device,
 void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
 void context_resource_released(const struct wined3d_device *device,
         struct wined3d_resource *resource, enum wined3d_resource_type type) DECLSPEC_HIDDEN;
-void context_restore(struct wined3d_context *context, struct wined3d_surface *restore) DECLSPEC_HIDDEN;
+void context_restore(struct wined3d_context *context, struct wined3d_texture *texture,
+        unsigned int sub_resource_idx) DECLSPEC_HIDDEN;
 BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN;
 void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) DECLSPEC_HIDDEN;
 void context_set_tls_idx(DWORD idx) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list