WineD3D: Add WINED3DUSAGE_OVERLAY

Stefan Dösinger stefandoesinger at gmx.at
Thu Oct 5 10:56:54 CDT 2006


D3D9 does not have Overlay surfaces like ddraw does, so we need a 
wined3d-private way to create ddraw overlays. I decided to add a new usage 
flag outside of the flags defined by Direct3D and use it in wined3d. d3d8 and 
d3d9 have to filter usage flags which are not valid in d3d8 and d3d9 to 
prevent broken applications from accidentally passing WINED3DUSAGE_OVERLAY.

D3D9 does not need overlays, because dynamic textures + drawing textured quads 
can provide simmilar functionality. But it is hard to implement ddraw ovelays 
using dynamic textures in ddraw.dll in an efficient way, so I decided to 
implement overlays in the ddraw way in wined3d.
-------------- next part --------------
From afba0642fbec4a87da1c2b58d574584ccceb3ca6 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Wed, 4 Oct 2006 19:17:42 +0200
Subject: [PATCH] WineD3D: Add a WINED3DUSAGE_OVERLAY flag
(cherry picked from 158e1e87370d5cd9b08b107c199a95ce0589d81a commit)
---
 dlls/d3d8/device.c           |   12 ++++++------
 dlls/d3d9/device.c           |    2 +-
 dlls/d3d9/indexbuffer.c      |    2 +-
 dlls/d3d9/texture.c          |    2 +-
 dlls/d3d9/vertexbuffer.c     |    2 +-
 dlls/d3d9/volume.c           |    2 +-
 dlls/d3d9/volumetexture.c    |    2 +-
 dlls/ddraw/ddraw.c           |    4 ++++
 dlls/wined3d/surface.c       |   24 ++++++++++++++++++++++++
 dlls/wined3d/surface_gdi.c   |    5 +++++
 include/wine/wined3d_types.h |    1 +
 11 files changed, 46 insertions(+), 12 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index e1bf420..a27bd1b 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -337,7 +337,7 @@ static HRESULT WINAPI IDirect3DDevice8Im
 
     object->lpVtbl = &Direct3DTexture8_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage,
+    hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK,
                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DTexture, NULL, (IUnknown *)object, D3D8CB_CreateSurface);
 
     if (FAILED(hrc)) {
@@ -375,7 +375,7 @@ static HRESULT WINAPI IDirect3DDevice8Im
 
     object->lpVtbl = &Direct3DVolumeTexture8_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, Usage,
+    hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, Usage & WINED3DUSAGE_MASK,
                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DVolumeTexture, NULL,
                                  (IUnknown *)object, D3D8CB_CreateVolume);
 
@@ -414,7 +414,7 @@ static HRESULT WINAPI IDirect3DDevice8Im
 
     object->lpVtbl = &Direct3DCubeTexture8_Vtbl;
     object->ref = 1;
-    hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage,
+    hr = IWineD3DDevice_CreateCubeTexture(This->WineD3DDevice, EdgeLength, Levels, Usage & WINED3DUSAGE_MASK,
                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DCubeTexture, NULL, (IUnknown*)object,
                                  D3D8CB_CreateSurface);
 
@@ -450,7 +450,7 @@ static HRESULT WINAPI IDirect3DDevice8Im
 
     object->lpVtbl = &Direct3DVertexBuffer8_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage, FVF, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), NULL, (IUnknown *)object);
+    hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK, FVF, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), NULL, (IUnknown *)object);
 
     if (D3D_OK != hrc) {
 
@@ -483,7 +483,7 @@ static HRESULT WINAPI IDirect3DDevice8Im
     object->lpVtbl = &Direct3DIndexBuffer8_Vtbl;
     object->ref = 1;
     TRACE("Calling wined3d create index buffer\n");
-    hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage, Format, (WINED3DPOOL) Pool, &object->wineD3DIndexBuffer, NULL, (IUnknown *)object);
+    hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK, Format, (WINED3DPOOL) Pool, &object->wineD3DIndexBuffer, NULL, (IUnknown *)object);
 
     if (D3D_OK != hrc) {
 
@@ -533,7 +533,7 @@ static HRESULT WINAPI IDirect3DDevice8Im
 
     TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
 
-    hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, Format, Lockable, Discard, Level,  &object->wineD3DSurface, Type, Usage, (WINED3DPOOL) Pool,MultiSample,MultisampleQuality, NULL, SURFACE_OPENGL, (IUnknown *)object);
+    hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, Format, Lockable, Discard, Level,  &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL) Pool,MultiSample,MultisampleQuality, NULL, SURFACE_OPENGL, (IUnknown *)object);
     if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
        /* free up object */
         FIXME("(%p) call to IWineD3DDevice_CreateSurface failed\n", This);
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 6eeaceb..e8033ed 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -274,7 +274,7 @@ static HRESULT  WINAPI IDirect3DDevice9I
     
     TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
            
-    hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, Format, Lockable, Discard, Level,  &object->wineD3DSurface, Type, Usage, (WINED3DPOOL) Pool,MultiSample,MultisampleQuality,pSharedHandle,SURFACE_OPENGL,(IUnknown *)object);
+    hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, Format, Lockable, Discard, Level,  &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL) Pool,MultiSample,MultisampleQuality,pSharedHandle,SURFACE_OPENGL,(IUnknown *)object);
     
     if (hrc != D3D_OK || NULL == object->wineD3DSurface) {
 
diff --git a/dlls/d3d9/indexbuffer.c b/dlls/d3d9/indexbuffer.c
index fc85357..269552a 100644
--- a/dlls/d3d9/indexbuffer.c
+++ b/dlls/d3d9/indexbuffer.c
@@ -175,7 +175,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_Crea
     object->lpVtbl = &Direct3DIndexBuffer9_Vtbl;
     object->ref = 1;
     TRACE("Calling wined3d create index buffer\n");
-    hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage, Format, (WINED3DPOOL) Pool, &object->wineD3DIndexBuffer, pSharedHandle, (IUnknown *)object);
+    hrc = IWineD3DDevice_CreateIndexBuffer(This->WineD3DDevice, Length, Usage & WINED3DUSAGE_MASK, Format, (WINED3DPOOL) Pool, &object->wineD3DIndexBuffer, pSharedHandle, (IUnknown *)object);
     if (hrc != D3D_OK) {
 
         /* free up object */
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index 900127b..789cdb6 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -256,7 +256,7 @@ HRESULT  WINAPI  IDirect3DDevice9Impl_Cr
 
     object->lpVtbl = &Direct3DTexture9_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage,
+    hrc = IWineD3DDevice_CreateTexture(This->WineD3DDevice, Width, Height, Levels, Usage & WINED3DUSAGE_MASK,
                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DTexture, pSharedHandle, (IUnknown *)object, D3D9CB_CreateSurface);
 
     if (FAILED(hrc)) {
diff --git a/dlls/d3d9/vertexbuffer.c b/dlls/d3d9/vertexbuffer.c
index 262f88e..5626920 100644
--- a/dlls/d3d9/vertexbuffer.c
+++ b/dlls/d3d9/vertexbuffer.c
@@ -174,7 +174,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_Crea
 
     object->lpVtbl = &Direct3DVertexBuffer9_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage, FVF, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), pSharedHandle, (IUnknown *)object);
+    hrc = IWineD3DDevice_CreateVertexBuffer(This->WineD3DDevice, Size, Usage & WINED3DUSAGE_MASK, FVF, (WINED3DPOOL) Pool, &(object->wineD3DVertexBuffer), pSharedHandle, (IUnknown *)object);
     
     if (hrc != D3D_OK) {
 
diff --git a/dlls/d3d9/volume.c b/dlls/d3d9/volume.c
index b6e303a..dbbdbb3 100644
--- a/dlls/d3d9/volume.c
+++ b/dlls/d3d9/volume.c
@@ -219,7 +219,7 @@ HRESULT WINAPI D3D9CB_CreateVolume(IUnkn
 
     object->lpVtbl = &Direct3DVolume9_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateVolume(This->WineD3DDevice, Width, Height, Depth, Usage, Format, 
+    hrc = IWineD3DDevice_CreateVolume(This->WineD3DDevice, Width, Height, Depth, Usage & WINED3DUSAGE_MASK, Format, 
                                        Pool, &object->wineD3DVolume, pSharedHandle, (IUnknown *)object);
     if (hrc != D3D_OK) {
         /* free up object */ 
diff --git a/dlls/d3d9/volumetexture.c b/dlls/d3d9/volumetexture.c
index a0e946b..cba0ccb 100644
--- a/dlls/d3d9/volumetexture.c
+++ b/dlls/d3d9/volumetexture.c
@@ -258,7 +258,7 @@ HRESULT  WINAPI  IDirect3DDevice9Impl_Cr
 
     object->lpVtbl = &Direct3DVolumeTexture9_Vtbl;
     object->ref = 1;
-    hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, Usage,
+    hrc = IWineD3DDevice_CreateVolumeTexture(This->WineD3DDevice, Width, Height, Depth, Levels, Usage & WINED3DUSAGE_MASK,
                                  (WINED3DFORMAT)Format, (WINED3DPOOL) Pool, &object->wineD3DVolumeTexture, pSharedHandle,
                                  (IUnknown *)object, D3D9CB_CreateVolume);
 
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 333fcde..594f434 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1806,6 +1806,10 @@ IDirectDrawImpl_CreateNewSurface(IDirect
                                  DDSCAPS_VISIBLE     |
                                  DDSCAPS_LOCALVIDMEM;
     }
+    if (pDDSD->ddsCaps.dwCaps & (DDSCAPS_OVERLAY))
+    {
+        Usage |= WINED3DUSAGE_OVERLAY;
+    }
     if(This->depthstencil)
     {
         /* The depth stencil creation callback sets this flag.
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 235d4f7..4ec10ab 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -3076,6 +3076,12 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetOv
 
     FIXME("(%p)->(%d,%d) Stub!\n", This, X, Y);
 
+    if(!(This->resource.usage & WINED3DUSAGE_OVERLAY))
+    {
+        TRACE("(%p): Not an overlay surface\n", This);
+        return DDERR_NOTAOVERLAYSURFACE;
+    }
+
     return WINED3D_OK;
 }
 
@@ -3084,6 +3090,12 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetOv
 
     FIXME("(%p)->(%p,%p) Stub!\n", This, X, Y);
 
+    if(!(This->resource.usage & WINED3DUSAGE_OVERLAY))
+    {
+        TRACE("(%p): Not an overlay surface\n", This);
+        return DDERR_NOTAOVERLAYSURFACE;
+    }
+
     return WINED3D_OK;
 }
 
@@ -3093,6 +3105,12 @@ HRESULT WINAPI IWineD3DSurfaceImpl_Updat
 
     FIXME("(%p)->(%08x,%p) Stub!\n", This, Flags, RefImpl);
 
+    if(!(This->resource.usage & WINED3DUSAGE_OVERLAY))
+    {
+        TRACE("(%p): Not an overlay surface\n", This);
+        return DDERR_NOTAOVERLAYSURFACE;
+    }
+
     return WINED3D_OK;
 }
 
@@ -3101,6 +3119,12 @@ HRESULT WINAPI IWineD3DSurfaceImpl_Updat
     IWineD3DSurfaceImpl *Dst = (IWineD3DSurfaceImpl *) DstSurface;
     FIXME("(%p)->(%p, %p, %p, %08x, %p)\n", This, SrcRect, Dst, DstRect, Flags, FX);
 
+    if(!(This->resource.usage & WINED3DUSAGE_OVERLAY))
+    {
+        TRACE("(%p): Not an overlay surface\n", This);
+        return DDERR_NOTAOVERLAYSURFACE;
+    }
+
     return WINED3D_OK;
 }
 
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c
index 0e605c8..1e797d3 100644
--- a/dlls/wined3d/surface_gdi.c
+++ b/dlls/wined3d/surface_gdi.c
@@ -1509,6 +1509,11 @@ IWineGDISurfaceImpl_PrivateSetup(IWineD3
     HDC hdc;
     long oldsize = This->resource.size;
 
+    if(This->resource.usage & WINED3DUSAGE_OVERLAY)
+    {
+        ERR("(%p) Overlays not yet supported by GDI surfaces\n", This);
+        return WINED3DERR_INVALIDCALL;
+    }
     /* Sysmem textures have memory already allocated -
      * release it, this avoids an unnecessary memcpy
      */
diff --git a/include/wine/wined3d_types.h b/include/wine/wined3d_types.h
index e70a814..278e7d7 100644
--- a/include/wine/wined3d_types.h
+++ b/include/wine/wined3d_types.h
@@ -1053,6 +1053,7 @@ #define WINED3DUSAGE_DYNAMIC            
 #define WINED3DUSAGE_AUTOGENMIPMAP                    0x00000400L 
 #define WINED3DUSAGE_DMAP                             0x00004000L
 #define WINED3DUSAGE_MASK                             0x00004FFFL
+#define WINED3DUSAGE_OVERLAY                          0x00010000L
 
 #define WINED3DUSAGE_QUERY_LEGACYBUMPMAP            0x00008000L
 #define WINED3DUSAGE_QUERY_FILTER                   0x00020000L
-- 
1.4.1.1



More information about the wine-patches mailing list