Sven Baars : d3dx9: Don't release textures when D3DXSPRITE_DO_NOT_ADDREF_TEXTURE is specified.

Alexandre Julliard julliard at winehq.org
Wed Nov 18 15:48:00 CST 2020


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

Author: Sven Baars <sbaars at codeweavers.com>
Date:   Tue Nov 17 16:03:04 2020 +0100

d3dx9: Don't release textures when D3DXSPRITE_DO_NOT_ADDREF_TEXTURE is specified.

Signed-off-by: Sven Baars <sbaars at codeweavers.com>
Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3dx9_36/sprite.c     | 18 ++++++++++++------
 dlls/d3dx9_36/tests/core.c | 14 ++++++++++++++
 2 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/dlls/d3dx9_36/sprite.c b/dlls/d3dx9_36/sprite.c
index 9ef7f9c47e0..cd244e657ef 100644
--- a/dlls/d3dx9_36/sprite.c
+++ b/dlls/d3dx9_36/sprite.c
@@ -112,10 +112,13 @@ static ULONG WINAPI d3dx9_sprite_Release(ID3DXSprite *iface)
         {
             int i;
 
-            for (i = 0; i < sprite->sprite_count; ++i)
+            if (!(sprite->flags & D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))
             {
-                if (sprite->sprites[i].texture)
-                    IDirect3DTexture9_Release(sprite->sprites[i].texture);
+                for (i = 0; i < sprite->sprite_count; ++i)
+                {
+                    if (sprite->sprites[i].texture)
+                        IDirect3DTexture9_Release(sprite->sprites[i].texture);
+                }
             }
 
             HeapFree(GetProcessHeap(), 0, sprite->sprites);
@@ -518,10 +521,13 @@ static HRESULT WINAPI d3dx9_sprite_OnResetDevice(ID3DXSprite *iface)
 
     TRACE("iface %p.\n", iface);
 
-    for (i = 0; i < sprite->sprite_count; ++i)
+    if (!(sprite->flags & D3DXSPRITE_DO_NOT_ADDREF_TEXTURE))
     {
-        if (sprite->sprites[i].texture)
-            IDirect3DTexture9_Release(sprite->sprites[i].texture);
+        for (i = 0; i < sprite->sprite_count; ++i)
+        {
+            if (sprite->sprites[i].texture)
+                IDirect3DTexture9_Release(sprite->sprites[i].texture);
+        }
     }
 
     sprite->sprite_count = 0;
diff --git a/dlls/d3dx9_36/tests/core.c b/dlls/d3dx9_36/tests/core.c
index 020f18e622c..a8477591e87 100644
--- a/dlls/d3dx9_36/tests/core.c
+++ b/dlls/d3dx9_36/tests/core.c
@@ -306,6 +306,20 @@ static void test_ID3DXSprite(IDirect3DDevice9 *device)
     hr = ID3DXSprite_End(sprite);
     ok (hr == D3DERR_INVALIDCALL, "End returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL);
 
+    /* Test D3DXSPRITE_DO_NOT_ADDREF_TEXTURE */
+    hr = ID3DXSprite_Begin(sprite, D3DXSPRITE_DO_NOT_ADDREF_TEXTURE);
+    ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK);
+    hr = ID3DXSprite_Draw(sprite, tex2, &rect, &center, &pos, D3DCOLOR_XRGB(255, 255, 255));
+    ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK);
+    hr = ID3DXSprite_OnResetDevice(sprite);
+    ok (hr == D3D_OK, "OnResetDevice returned %#x, expected %#x\n", hr, D3D_OK);
+    check_ref((IUnknown*)tex2, 1);
+
+    hr = ID3DXSprite_Begin(sprite, D3DXSPRITE_DO_NOT_ADDREF_TEXTURE);
+    ok (hr == D3D_OK, "Begin returned %#x, expected %#x\n", hr, D3D_OK);
+    hr = ID3DXSprite_Draw(sprite, tex2, &rect, &center, &pos, D3DCOLOR_XRGB(255, 255, 255));
+    ok (hr == D3D_OK, "Draw returned %#x, expected %#x\n", hr, D3D_OK);
+
     IDirect3DDevice9_EndScene(device);
     check_release((IUnknown*)sprite, 0);
     check_release((IUnknown*)tex2, 0);




More information about the wine-cvs mailing list