=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Enforce texturing capability format restrictions on resource creation.
Alexandre Julliard
julliard at winehq.org
Fri Sep 6 12:39:52 CDT 2013
Module: wine
Branch: master
Commit: 80638b6d2f2e9a6e71df59e2780ded768219739a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=80638b6d2f2e9a6e71df59e2780ded768219739a
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Sep 6 00:11:11 2013 +0200
wined3d: Enforce texturing capability format restrictions on resource creation.
---
dlls/d3d8/texture.c | 3 +++
dlls/d3d9/texture.c | 3 +++
dlls/ddraw/surface.c | 13 ++++++++++++-
dlls/wined3d/resource.c | 5 ++++-
include/wine/wined3d.h | 1 +
5 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index c870612..2388267 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -1197,6 +1197,7 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
+ desc.usage |= WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = width;
desc.height = height;
@@ -1237,6 +1238,7 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
+ desc.usage |= WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = edge_length;
desc.height = edge_length;
@@ -1276,6 +1278,7 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
+ desc.usage |= WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = width;
desc.height = height;
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index 7b46e6f..ad48205 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -1321,6 +1321,7 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device,
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
+ desc.usage |= WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = width;
desc.height = height;
@@ -1361,6 +1362,7 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *devic
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
+ desc.usage |= WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = edge_length;
desc.height = edge_length;
@@ -1400,6 +1402,7 @@ HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *dev
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = usage & WINED3DUSAGE_MASK;
+ desc.usage |= WINED3DUSAGE_TEXTURE;
desc.pool = pool;
desc.width = width;
desc.height = height;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index b7136e1..8627a84 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -5608,16 +5608,27 @@ HRESULT ddraw_surface_create_texture(struct ddraw_surface *surface, DWORD surfac
layers = 1;
if (desc->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)
+ {
+ wined3d_desc.usage = WINED3DUSAGE_TEXTURE;
pool = WINED3D_POOL_MANAGED;
+ }
else if (desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY)
+ {
+ /* ddraw does not enforce format support restrictions on system memory
+ * textures. Don't set the texture flag, the texture can't be used for
+ * texturing anyway. */
+ wined3d_desc.usage = 0;
pool = WINED3D_POOL_SYSTEM_MEM;
+ }
else
+ {
+ wined3d_desc.usage = WINED3DUSAGE_TEXTURE;
pool = WINED3D_POOL_DEFAULT;
+ }
wined3d_desc.format = wined3dformat_from_ddrawformat(&surface->surface_desc.u4.ddpfPixelFormat);
wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
wined3d_desc.multisample_quality = 0;
- wined3d_desc.usage = 0;
wined3d_desc.pool = pool;
wined3d_desc.width = desc->dwWidth;
wined3d_desc.height = desc->dwHeight;
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index e97af48..a677d00 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -70,7 +70,8 @@ static void resource_check_usage(DWORD usage)
| WINED3DUSAGE_DYNAMIC
| WINED3DUSAGE_AUTOGENMIPMAP
| WINED3DUSAGE_STATICDECL
- | WINED3DUSAGE_OVERLAY;
+ | WINED3DUSAGE_OVERLAY
+ | WINED3DUSAGE_TEXTURE;
if (usage & ~handled)
FIXME("Unhandled usage flags %#x.\n", usage & ~handled);
@@ -92,6 +93,8 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
return WINED3DERR_INVALIDCALL;
if ((usage & WINED3DUSAGE_DEPTHSTENCIL) && !(format->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
return WINED3DERR_INVALIDCALL;
+ if ((usage & WINED3DUSAGE_TEXTURE) && !(format->flags & WINED3DFMT_FLAG_TEXTURE))
+ return WINED3DERR_INVALIDCALL;
}
resource->ref = 1;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index bf4b392..423af91 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -824,6 +824,7 @@ enum wined3d_display_rotation
#define WINED3DUSAGE_AUTOGENMIPMAP 0x00000400
#define WINED3DUSAGE_DMAP 0x00004000
#define WINED3DUSAGE_MASK 0x00004fff
+#define WINED3DUSAGE_TEXTURE 0x10000000
#define WINED3DUSAGE_OWNDC 0x20000000
#define WINED3DUSAGE_STATICDECL 0x40000000
#define WINED3DUSAGE_OVERLAY 0x80000000
More information about the wine-cvs
mailing list