[resend 1/4] d3d11: Handle NULL source box in d3d10_device_CopySubresourceRegion().

Riccardo Bortolato rikyz619 at gmail.com
Mon Dec 21 11:38:03 CST 2015


Also modified wined3d_device_copy_sub_resource_region() accordingly.

Signed-off-by: Riccardo Bortolato <rikyz619 at gmail.com>
---
 dlls/d3d11/device.c   | 19 ++++++++++++-------
 dlls/wined3d/device.c | 37 ++++++++++++++++++-------------------
 2 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 8fc6cb1..a10c3a4 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -3188,15 +3188,20 @@ static void STDMETHODCALLTYPE d3d10_device_CopySubresourceRegion(ID3D10Device1 *
 
     wined3d_dst_resource = wined3d_resource_from_d3d10_resource(dst_resource);
     wined3d_src_resource = wined3d_resource_from_d3d10_resource(src_resource);
-    wined3d_src_box.left = src_box->left;
-    wined3d_src_box.top = src_box->top;
-    wined3d_src_box.front = src_box->front;
-    wined3d_src_box.right = src_box->right;
-    wined3d_src_box.bottom = src_box->bottom;
-    wined3d_src_box.back = src_box->back;
+
+    if (src_box)
+    {
+        wined3d_src_box.left = src_box->left;
+        wined3d_src_box.top = src_box->top;
+        wined3d_src_box.front = src_box->front;
+        wined3d_src_box.right = src_box->right;
+        wined3d_src_box.bottom = src_box->bottom;
+        wined3d_src_box.back = src_box->back;
+    }
+
     wined3d_mutex_lock();
     wined3d_device_copy_sub_resource_region(device->wined3d_device, wined3d_dst_resource, dst_subresource_idx,
-            dst_x, dst_y, dst_z, wined3d_src_resource, src_subresource_idx, &wined3d_src_box);
+            dst_x, dst_y, dst_z, wined3d_src_resource, src_subresource_idx, src_box ? &wined3d_src_box : NULL);
     wined3d_mutex_unlock();
 }
 
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 057ae18..32ab0f1 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3902,7 +3902,6 @@ HRESULT CDECL wined3d_device_copy_sub_resource_region(struct wined3d_device *dev
         unsigned int dst_y, unsigned int dst_z, struct wined3d_resource *src_resource,
         unsigned int src_sub_resource_idx, const struct wined3d_box *src_box)
 {
-    struct wined3d_surface *dst_surface, *src_surface;
     struct wined3d_texture *dst_texture, *src_texture;
     struct wined3d_resource *tmp;
     RECT dst_rect, src_rect;
@@ -3942,32 +3941,32 @@ HRESULT CDECL wined3d_device_copy_sub_resource_region(struct wined3d_device *dev
     }
 
     dst_texture = wined3d_texture_from_resource(dst_resource);
-    if (!(tmp = wined3d_texture_get_sub_resource(dst_texture, dst_sub_resource_idx)))
+    src_texture = wined3d_texture_from_resource(src_resource);
+
+    if (src_box)
     {
-        WARN("Invalid dst_sub_resource_idx %u.\n", dst_sub_resource_idx);
-        return WINED3DERR_INVALIDCALL;
+        src_rect.left = src_box->left;
+        src_rect.top = src_box->top;
+        src_rect.right = src_box->right;
+        src_rect.bottom = src_box->bottom;
     }
-    dst_surface = surface_from_resource(tmp);
-
-    src_texture = wined3d_texture_from_resource(src_resource);
-    if (!(tmp = wined3d_texture_get_sub_resource(src_texture, src_sub_resource_idx)))
+    else
     {
-        WARN("Invalid src_sub_resource_idx %u.\n", src_sub_resource_idx);
-        return WINED3DERR_INVALIDCALL;
+        if (!(tmp = wined3d_texture_get_sub_resource(src_texture, src_sub_resource_idx)))
+            return WINED3DERR_INVALIDCALL;
+        src_rect.left = 0;
+        src_rect.top = 0;
+        src_rect.right = tmp->width;
+        src_rect.bottom = tmp->height;
     }
-    src_surface = surface_from_resource(tmp);
 
     dst_rect.left = dst_x;
     dst_rect.top = dst_y;
-    dst_rect.right = dst_x + (src_box->right - src_box->left);
-    dst_rect.bottom = dst_y + (src_box->bottom - src_box->top);
-
-    src_rect.left = src_box->left;
-    src_rect.top = src_box->top;
-    src_rect.right = src_box->right;
-    src_rect.bottom = src_box->bottom;
+    dst_rect.right = dst_x + (src_rect.right - src_rect.left);
+    dst_rect.bottom = dst_y + (src_rect.bottom - src_rect.top);
 
-    if (FAILED(hr = wined3d_surface_blt(dst_surface, &dst_rect, src_surface, &src_rect, 0, NULL, WINED3D_TEXF_POINT)))
+    if (FAILED(hr = wined3d_texture_blt(dst_texture, dst_sub_resource_idx, &dst_rect,
+            src_texture, src_sub_resource_idx, &src_rect, 0, NULL, WINED3D_TEXF_POINT)))
         ERR("Failed to blit, hr %#x.\n", hr);
 
     return hr;
-- 
1.9.1




More information about the wine-patches mailing list