Module: wine Branch: master Commit: 80638b6d2f2e9a6e71df59e2780ded768219739a URL: http://source.winehq.org/git/wine.git/?a=commit;h=80638b6d2f2e9a6e71df59e278...
Author: Stefan Dösinger stefan@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