[PATCH v2 2/5] wined3d: Be more strict with wined3d_texture_get_dc() calls from d3d9.

Henri Verbeet hverbeet at codeweavers.com
Wed Apr 13 05:18:48 CDT 2016


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
v2: Unmodified.
---
 dlls/d3d9/tests/device.c       | 20 ++++++++++----------
 dlls/wined3d/texture.c         | 32 ++++++++++++++++++++------------
 dlls/wined3d/wined3d_private.h |  2 +-
 3 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index ec171a9..6fd75cd 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -7716,18 +7716,18 @@ static void test_getdc(void)
         hr = IDirect3DSurface9_GetDC(surface, &dc);
         ok(SUCCEEDED(hr), "Failed to get DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_GetDC(surface2, &dc2);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_ReleaseDC(surface2, dc2);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_ReleaseDC(surface, dc);
         ok(SUCCEEDED(hr), "Failed to release DC for format %s, hr %#x.\n", testdata[i].name, hr);
 
         hr = IDirect3DSurface9_GetDC(surface2, &dc);
         ok(SUCCEEDED(hr), "Failed to get DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_GetDC(surface, &dc2);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_ReleaseDC(surface, dc2);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_ReleaseDC(surface2, dc);
         ok(SUCCEEDED(hr), "Failed to release DC for format %s, hr %#x.\n", testdata[i].name, hr);
 
@@ -7752,16 +7752,16 @@ static void test_getdc(void)
         hr = IDirect3DSurface9_LockRect(surface2, &map_desc, NULL, D3DLOCK_READONLY);
         ok(SUCCEEDED(hr), "Failed to map surface for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_GetDC(surface, &dc);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_ReleaseDC(surface, dc);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_UnlockRect(surface2);
         ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
 
         hr = IDirect3DSurface9_GetDC(surface, &dc);
         ok(SUCCEEDED(hr), "Failed to get DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_LockRect(surface2, &map_desc, NULL, D3DLOCK_READONLY);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_UnlockRect(surface2);
         ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_ReleaseDC(surface, dc);
@@ -7770,7 +7770,7 @@ static void test_getdc(void)
         hr = IDirect3DSurface9_GetDC(surface2, &dc);
         ok(SUCCEEDED(hr), "Failed to get DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_LockRect(surface, &map_desc, NULL, D3DLOCK_READONLY);
-        todo_wine ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
+        ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#x for format %s.\n", hr, testdata[i].name);
         hr = IDirect3DSurface9_UnlockRect(surface);
         ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_ReleaseDC(surface2, dc);
@@ -7781,7 +7781,7 @@ static void test_getdc(void)
         hr = IDirect3DSurface9_GetDC(surface2, &dc);
         ok(SUCCEEDED(hr), "Failed to get DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_UnlockRect(surface);
-        todo_wine ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
+        ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_ReleaseDC(surface2, dc);
         ok(SUCCEEDED(hr), "Failed to release DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_UnlockRect(surface);
@@ -7792,7 +7792,7 @@ static void test_getdc(void)
         hr = IDirect3DSurface9_GetDC(surface, &dc);
         ok(SUCCEEDED(hr), "Failed to get DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_UnlockRect(surface2);
-        todo_wine ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
+        ok(SUCCEEDED(hr), "Failed to unmap surface for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_ReleaseDC(surface, dc);
         ok(SUCCEEDED(hr), "Failed to release DC for format %s, hr %#x.\n", testdata[i].name, hr);
         hr = IDirect3DSurface9_UnlockRect(surface2);
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 910c6ac..e1d60cb 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -838,6 +838,12 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
         return WINED3DERR_INVALIDCALL;
     }
 
+    if (texture->resource.map_count)
+    {
+        WARN("Texture is mapped.\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+
     /* We have no way of supporting a pitch that is not a multiple of the pixel
      * byte width short of uploading the texture row-by-row.
      * Fortunately that's not an issue since D3D9Ex doesn't allow a custom pitch
@@ -851,17 +857,11 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
         return WINED3DERR_INVALIDCALL;
     }
 
-    sub_resource = &texture->sub_resources[0];
-    surface = sub_resource->u.surface;
-    if (sub_resource->map_count || (surface->flags & SFLAG_DCINUSE))
-    {
-        WARN("Surface is mapped or the DC is in use.\n");
-        return WINED3DERR_INVALIDCALL;
-    }
-
     if (device->d3d_initialized)
         texture->resource.resource_ops->resource_unload(&texture->resource);
 
+    sub_resource = &texture->sub_resources[0];
+    surface = sub_resource->u.surface;
     if (surface->flags & SFLAG_DIBSECTION)
     {
         DeleteDC(surface->hDC);
@@ -1291,6 +1291,12 @@ static HRESULT texture_resource_sub_resource_map(struct wined3d_resource *resour
             return WINED3DERR_INVALIDCALL;
     }
 
+    if (texture->flags & WINED3D_TEXTURE_DC_IN_USE)
+    {
+        WARN("DC is in use.\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+
     if (sub_resource->map_count)
     {
         WARN("Sub-resource is already mapped.\n");
@@ -1433,6 +1439,8 @@ static HRESULT texture_resource_sub_resource_unmap(struct wined3d_resource *reso
     if (!sub_resource->map_count)
     {
         WARN("Trying to unmap unmapped sub-resource.\n");
+        if (texture->flags & WINED3D_TEXTURE_DC_IN_USE)
+            return WINED3D_OK;
         return WINEDDERR_NOTLOCKED;
     }
 
@@ -2238,7 +2246,7 @@ HRESULT CDECL wined3d_texture_get_dc(struct wined3d_texture *texture, unsigned i
 
     surface = sub_resource->u.surface;
 
-    if (sub_resource->map_count && !(texture->flags & WINED3D_TEXTURE_GET_DC_LENIENT))
+    if (texture->resource.map_count && !(texture->flags & WINED3D_TEXTURE_GET_DC_LENIENT))
         return WINED3DERR_INVALIDCALL;
 
     if (device->d3d_initialized)
@@ -2266,7 +2274,7 @@ HRESULT CDECL wined3d_texture_get_dc(struct wined3d_texture *texture, unsigned i
         context_release(context);
 
     if (!(texture->flags & WINED3D_TEXTURE_GET_DC_LENIENT))
-        surface->flags |= SFLAG_DCINUSE;
+        texture->flags |= WINED3D_TEXTURE_DC_IN_USE;
     ++texture->resource.map_count;
     ++sub_resource->map_count;
 
@@ -2296,7 +2304,7 @@ HRESULT CDECL wined3d_texture_release_dc(struct wined3d_texture *texture, unsign
 
     surface = sub_resource->u.surface;
 
-    if (!(texture->flags & WINED3D_TEXTURE_GET_DC_LENIENT) && !(surface->flags & SFLAG_DCINUSE))
+    if (!(texture->flags & (WINED3D_TEXTURE_GET_DC_LENIENT | WINED3D_TEXTURE_DC_IN_USE)))
         return WINED3DERR_INVALIDCALL;
 
     if (surface->hDC != dc)
@@ -2309,7 +2317,7 @@ HRESULT CDECL wined3d_texture_release_dc(struct wined3d_texture *texture, unsign
     --sub_resource->map_count;
     --texture->resource.map_count;
     if (!(texture->flags & WINED3D_TEXTURE_GET_DC_LENIENT))
-        surface->flags &= ~SFLAG_DCINUSE;
+        texture->flags &= ~WINED3D_TEXTURE_DC_IN_USE;
 
     if (surface->resource.map_binding == WINED3D_LOCATION_USER_MEMORY
             || (surface->container->flags & WINED3D_TEXTURE_PIN_SYSMEM
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 1c04495..967f39e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2439,6 +2439,7 @@ struct wined3d_texture_ops
 #define WINED3D_TEXTURE_PIN_SYSMEM          0x00000200
 #define WINED3D_TEXTURE_NORMALIZED_COORDS   0x00000400
 #define WINED3D_TEXTURE_GET_DC_LENIENT      0x00000800
+#define WINED3D_TEXTURE_DC_IN_USE           0x00001000
 
 #define WINED3D_TEXTURE_ASYNC_COLOR_KEY     0x00000001
 
@@ -2720,7 +2721,6 @@ void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3
 /* Surface flags: */
 #define SFLAG_DIBSECTION        0x00000001 /* Has a DIB section attached for GetDC. */
 #define SFLAG_DISCARD           0x00000002 /* ??? */
-#define SFLAG_DCINUSE           0x00000020 /* Set between GetDC and ReleaseDC calls. */
 
 struct wined3d_sampler
 {
-- 
2.1.4




More information about the wine-patches mailing list