[PATCH 2/5] ddraw: Move the surface desc fixups from ddraw_surface_init() to ddraw_surface_create_texture().
Henri Verbeet
hverbeet at codeweavers.com
Thu Nov 14 03:47:16 CST 2013
---
dlls/ddraw/ddraw.c | 35 ++------
dlls/ddraw/ddraw_private.h | 6 +-
dlls/ddraw/surface.c | 194 ++++++++++++++++++++------------------------
3 files changed, 94 insertions(+), 141 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 87bf33d..e1da418 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2722,38 +2722,13 @@ static HRESULT WINAPI ddraw7_StartModeTest(IDirectDraw7 *iface, SIZE *Modes, DWO
return DD_OK;
}
-/*****************************************************************************
- * ddraw_create_surface
- *
- * A helper function for IDirectDraw7::CreateSurface. It creates a new surface
- * with the passed parameters.
- *
- * Params:
- * DDSD: Description of the surface to create
- * Surf: Address to store the interface pointer at
- *
- * Returns:
- * DD_OK on success
- *
- *****************************************************************************/
static HRESULT ddraw_create_surface(struct ddraw *ddraw, DDSURFACEDESC2 *desc,
- DWORD flags, struct ddraw_surface **surface, UINT version)
+ const struct wined3d_resource_desc *wined3d_desc, DWORD flags, struct ddraw_surface **surface, UINT version)
{
HRESULT hr;
- TRACE("ddraw %p, desc %p, flags %#x, surface %p.\n", ddraw, desc, flags, surface);
-
- if (TRACE_ON(ddraw))
- {
- TRACE("Requesting surface desc:\n");
- DDRAW_dump_surface_desc(desc);
- }
-
- if ((desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) && (ddraw->flags & DDRAW_NO3D))
- {
- WARN("The application requests a 3D capable surface, but the ddraw object was created without 3D support.\n");
- /* Do not fail surface creation, only fail 3D device creation. */
- }
+ TRACE("ddraw %p, desc %p, wined3d_desc %p, flags %#x, surface %p.\n",
+ ddraw, desc, wined3d_desc, flags, surface);
/* Create the Surface object */
*surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(**surface));
@@ -2763,7 +2738,7 @@ static HRESULT ddraw_create_surface(struct ddraw *ddraw, DDSURFACEDESC2 *desc,
return DDERR_OUTOFVIDEOMEMORY;
}
- if (FAILED(hr = ddraw_surface_init(*surface, ddraw, desc, flags, version)))
+ if (FAILED(hr = ddraw_surface_init(*surface, ddraw, desc, wined3d_desc, flags, version)))
{
WARN("Failed to initialize surface, hr %#x.\n", hr);
HeapFree(GetProcessHeap(), 0, *surface);
@@ -5150,7 +5125,7 @@ static HRESULT CDECL device_parent_create_texture_surface(struct wined3d_device_
desc.dwHeight = wined3d_desc->height;
/* FIXME: Validate that format, usage, pool, etc. really make sense. */
- if (FAILED(hr = ddraw_create_surface(ddraw, &desc, flags, &ddraw_surface, texture->version)))
+ if (FAILED(hr = ddraw_create_surface(ddraw, &desc, wined3d_desc, flags, &ddraw_surface, texture->version)))
return hr;
*surface = ddraw_surface->wined3d_surface;
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 19f1107..1f8048b 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -193,10 +193,10 @@ struct ddraw_texture
struct ddraw_surface *root;
};
-HRESULT ddraw_surface_create_texture(struct ddraw *ddraw, const DDSURFACEDESC2 *desc,
+HRESULT ddraw_surface_create_texture(struct ddraw *ddraw, DDSURFACEDESC2 *desc,
unsigned int version, struct ddraw_surface **surface) DECLSPEC_HIDDEN;
-HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
- DDSURFACEDESC2 *desc, DWORD flags, UINT version) DECLSPEC_HIDDEN;
+HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, const DDSURFACEDESC2 *desc,
+ const struct wined3d_resource_desc *wined3d_desc, DWORD flags, UINT version) DECLSPEC_HIDDEN;
ULONG ddraw_surface_release_iface(struct ddraw_surface *This) DECLSPEC_HIDDEN;
static inline struct ddraw_surface *impl_from_IDirect3DTexture(IDirect3DTexture *iface)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 2b955df..c88b9d5 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -5593,7 +5593,7 @@ static const struct wined3d_parent_ops ddraw_texture_wined3d_parent_ops =
ddraw_texture_wined3d_object_destroyed,
};
-HRESULT ddraw_surface_create_texture(struct ddraw *ddraw, const DDSURFACEDESC2 *desc,
+HRESULT ddraw_surface_create_texture(struct ddraw *ddraw, DDSURFACEDESC2 *desc,
unsigned int version, struct ddraw_surface **surface)
{
struct ddraw_surface *root, *mip, **attach;
@@ -5603,60 +5603,97 @@ HRESULT ddraw_surface_create_texture(struct ddraw *ddraw, const DDSURFACEDESC2 *
struct ddraw_texture *texture;
UINT layers, levels, i, j;
DDSURFACEDESC2 *mip_desc;
- enum wined3d_pool pool;
HRESULT hr;
- if (!(texture = HeapAlloc(GetProcessHeap(), 0, sizeof(*texture))))
- return E_OUTOFMEMORY;
+ if (TRACE_ON(ddraw))
+ {
+ TRACE("Requesting surface desc:\n");
+ DDRAW_dump_surface_desc(desc);
+ }
- texture->version = version;
- texture->surface_desc = *desc;
+ wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
+ wined3d_desc.multisample_quality = 0;
+ wined3d_desc.usage = 0;
+ wined3d_desc.pool = WINED3D_POOL_DEFAULT;
+ wined3d_desc.width = desc->dwWidth;
+ wined3d_desc.height = desc->dwHeight;
+ wined3d_desc.depth = 1;
+ wined3d_desc.size = 0;
- if (desc->ddsCaps.dwCaps & DDSCAPS_MIPMAP)
- levels = desc->u2.dwMipMapCount;
- else
- levels = 1;
+ wined3d_desc.format = wined3dformat_from_ddrawformat(&desc->u4.ddpfPixelFormat);
+ if (wined3d_desc.format == WINED3DFMT_UNKNOWN)
+ {
+ WARN("Unsupported / unknown pixelformat.\n");
+ return DDERR_INVALIDPIXELFORMAT;
+ }
- if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
- layers = 6;
- else
- layers = 1;
+ if ((desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) && (ddraw->flags & DDRAW_NO3D))
+ {
+ WARN("The application requests a 3D capable surface, but the ddraw object was created without 3D support.\n");
+ /* Do not fail surface creation, only fail 3D device creation. */
+ }
- if (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
+ if (!(desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY))
+ && !((desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
+ && (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))))
{
- wined3d_desc.usage = WINED3DUSAGE_TEXTURE;
- pool = WINED3D_POOL_MANAGED;
+ /* Tests show surfaces without memory flags get these flags added
+ * right after creation. */
+ desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY;
}
- else if (desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY)
+
+ if (desc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
+ desc->ddsCaps.dwCaps |= DDSCAPS_VISIBLE;
+
+ 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;
+ wined3d_desc.pool = WINED3D_POOL_SYSTEM_MEM;
}
else
{
- wined3d_desc.usage = WINED3DUSAGE_DYNAMIC;
if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
wined3d_desc.usage |= WINED3DUSAGE_TEXTURE;
- pool = WINED3D_POOL_DEFAULT;
- }
+ if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
+ wined3d_desc.usage |= WINED3DUSAGE_DEPTHSTENCIL;
+ else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
+ wined3d_desc.usage |= WINED3DUSAGE_RENDERTARGET;
- wined3d_desc.format = wined3dformat_from_ddrawformat(&desc->u4.ddpfPixelFormat);
- if (wined3d_desc.format == WINED3DFMT_UNKNOWN)
- {
- WARN("Unsupported / unknown pixelformat.\n");
- return DDERR_INVALIDPIXELFORMAT;
+ if (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
+ {
+ wined3d_desc.pool = WINED3D_POOL_MANAGED;
+ /* Managed textures have the system memory flag set. */
+ desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
+ }
+ else if (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
+ {
+ /* Videomemory adds localvidmem. This is mutually exclusive with
+ * systemmemory and texturemanage. */
+ desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM;
+ wined3d_desc.usage |= WINED3DUSAGE_DYNAMIC;
+ }
}
- wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
- wined3d_desc.multisample_quality = 0;
- wined3d_desc.pool = pool;
- wined3d_desc.width = desc->dwWidth;
- wined3d_desc.height = desc->dwHeight;
- wined3d_desc.depth = 1;
- wined3d_desc.size = 0;
+ if (desc->ddsCaps.dwCaps & (DDSCAPS_OVERLAY))
+ wined3d_desc.usage |= WINED3DUSAGE_OVERLAY;
+
+ if (desc->ddsCaps.dwCaps & DDSCAPS_OWNDC)
+ wined3d_desc.usage |= WINED3DUSAGE_OWNDC;
+
+ if (!(texture = HeapAlloc(GetProcessHeap(), 0, sizeof(*texture))))
+ return E_OUTOFMEMORY;
+
+ texture->version = version;
+ copy_to_surfacedesc2(&texture->surface_desc, desc);
+
+ if (desc->ddsCaps.dwCaps & DDSCAPS_MIPMAP)
+ levels = desc->u2.dwMipMapCount;
+ else
+ levels = 1;
+
+ if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
+ layers = 6;
+ else
+ layers = 1;
/* Some applications assume surfaces will always be mapped at the same
* address. Some of those also assume that this address is valid even when
@@ -5756,67 +5793,11 @@ HRESULT ddraw_surface_create_texture(struct ddraw *ddraw, const DDSURFACEDESC2 *
return DD_OK;
}
-HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
- DDSURFACEDESC2 *desc, DWORD flags, UINT version)
+HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw, const DDSURFACEDESC2 *desc,
+ const struct wined3d_resource_desc *wined3d_desc, DWORD flags, UINT version)
{
- enum wined3d_pool pool = WINED3D_POOL_DEFAULT;
- enum wined3d_format_id format;
- DWORD usage = 0;
HRESULT hr;
- if (!(desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY))
- && !((desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
- && (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))))
- {
- /* Tests show surfaces without memory flags get these flags added
- * right after creation. */
- desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY;
- }
-
- if (desc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
- desc->ddsCaps.dwCaps |= DDSCAPS_VISIBLE;
-
- if (!(desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY))
- {
- if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
- usage |= WINED3DUSAGE_DEPTHSTENCIL;
- else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
- usage |= WINED3DUSAGE_RENDERTARGET;
- }
-
- if (desc->ddsCaps.dwCaps & (DDSCAPS_OVERLAY))
- {
- usage |= WINED3DUSAGE_OVERLAY;
- }
-
- if (desc->ddsCaps.dwCaps & DDSCAPS_OWNDC)
- usage |= WINED3DUSAGE_OWNDC;
-
- if (desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY)
- {
- pool = WINED3D_POOL_SYSTEM_MEM;
- }
- else if (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
- {
- pool = WINED3D_POOL_MANAGED;
- /* Managed textures have the system memory flag set. */
- desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
- }
- else if (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
- {
- /* Videomemory adds localvidmem. This is mutually exclusive with
- * systemmemory and texturemanage. */
- desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM;
- usage |= WINED3DUSAGE_DYNAMIC;
- }
-
- format = wined3dformat_from_ddrawformat(&desc->u4.ddpfPixelFormat);
- if (format == WINED3DFMT_UNKNOWN)
- {
- WARN("Unsupported / unknown pixelformat.\n");
- return DDERR_INVALIDPIXELFORMAT;
- }
-
surface->IDirectDrawSurface7_iface.lpVtbl = &ddraw_surface7_vtbl;
surface->IDirectDrawSurface4_iface.lpVtbl = &ddraw_surface4_vtbl;
surface->IDirectDrawSurface3_iface.lpVtbl = &ddraw_surface3_vtbl;
@@ -5845,13 +5826,13 @@ HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface_iface;
}
- copy_to_surfacedesc2(&surface->surface_desc, desc);
-
+ surface->surface_desc = *desc;
surface->first_attached = surface;
- if (FAILED(hr = wined3d_surface_create(ddraw->wined3d_device, desc->dwWidth, desc->dwHeight, format,
- usage, pool, WINED3D_MULTISAMPLE_NONE, 0, flags, surface,
- &ddraw_surface_wined3d_parent_ops, &surface->wined3d_surface)))
+ if (FAILED(hr = wined3d_surface_create(ddraw->wined3d_device, wined3d_desc->width, wined3d_desc->height,
+ wined3d_desc->format, wined3d_desc->usage, wined3d_desc->pool, wined3d_desc->multisample_type,
+ wined3d_desc->multisample_quality, flags, surface, &ddraw_surface_wined3d_parent_ops,
+ &surface->wined3d_surface)))
{
WARN("Failed to create wined3d surface, hr %#x.\n", hr);
return hr;
@@ -5859,18 +5840,15 @@ HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
/* Anno 1602 stores the pitch right after surface creation, so make sure
* it's there. TODO: Test other fourcc formats. */
- if (format == WINED3DFMT_DXT1 || format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3
- || format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5)
+ if (wined3d_desc->format == WINED3DFMT_DXT1 || wined3d_desc->format == WINED3DFMT_DXT2
+ || wined3d_desc->format == WINED3DFMT_DXT3 || wined3d_desc->format == WINED3DFMT_DXT4
+ || wined3d_desc->format == WINED3DFMT_DXT5)
{
surface->surface_desc.dwFlags |= DDSD_LINEARSIZE;
- if (format == WINED3DFMT_DXT1)
- {
+ if (wined3d_desc->format == WINED3DFMT_DXT1)
surface->surface_desc.u1.dwLinearSize = max(4, desc->dwWidth) * max(4, desc->dwHeight) / 2;
- }
else
- {
surface->surface_desc.u1.dwLinearSize = max(4, desc->dwWidth) * max(4, desc->dwHeight);
- }
}
else
{
--
1.7.10.4
More information about the wine-patches
mailing list