Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2018
- 60 participants
- 1315 messages
[PATCH 3/5] wined3d: Pass bind flags to wined3d_check_device_format().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d3d11/device.c | 12 ++++-----
dlls/d3d8/directx.c | 8 +++---
dlls/d3d9/directx.c | 8 +++---
dlls/d3d9/texture.c | 5 ++--
dlls/ddraw/ddraw.c | 8 +++---
dlls/ddraw/device.c | 10 ++++----
dlls/ddraw/surface.c | 16 ++++++++----
dlls/wined3d/directx.c | 65 ++++++++++++++++++++++++++++++-----------------
dlls/wined3d/wined3d.spec | 2 +-
include/wine/wined3d.h | 2 +-
10 files changed, 83 insertions(+), 53 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 8c40cf8b475..df754de1309 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -3297,15 +3297,15 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device2 *
static const struct
{
enum wined3d_resource_type rtype;
- unsigned int usage;
+ unsigned int bind_flags;
D3D11_FORMAT_SUPPORT flag;
}
flag_mapping[] =
{
- {WINED3D_RTYPE_TEXTURE_2D, WINED3DUSAGE_TEXTURE, D3D11_FORMAT_SUPPORT_TEXTURE2D},
- {WINED3D_RTYPE_TEXTURE_3D, WINED3DUSAGE_TEXTURE, D3D11_FORMAT_SUPPORT_TEXTURE3D},
- {WINED3D_RTYPE_NONE, WINED3DUSAGE_RENDERTARGET, D3D11_FORMAT_SUPPORT_RENDER_TARGET},
- {WINED3D_RTYPE_NONE, WINED3DUSAGE_DEPTHSTENCIL, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL},
+ {WINED3D_RTYPE_TEXTURE_2D, WINED3D_BIND_SHADER_RESOURCE, D3D11_FORMAT_SUPPORT_TEXTURE2D},
+ {WINED3D_RTYPE_TEXTURE_3D, WINED3D_BIND_SHADER_RESOURCE, D3D11_FORMAT_SUPPORT_TEXTURE3D},
+ {WINED3D_RTYPE_NONE, WINED3D_BIND_RENDER_TARGET, D3D11_FORMAT_SUPPORT_RENDER_TARGET},
+ {WINED3D_RTYPE_NONE, WINED3D_BIND_DEPTH_STENCIL, D3D11_FORMAT_SUPPORT_DEPTH_STENCIL},
};
HRESULT hr;
@@ -3327,7 +3327,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CheckFormatSupport(ID3D11Device2 *
for (i = 0; i < ARRAY_SIZE(flag_mapping); ++i)
{
hr = wined3d_check_device_format(wined3d, params.adapter_idx, params.device_type,
- WINED3DFMT_UNKNOWN, flag_mapping[i].usage, flag_mapping[i].rtype, wined3d_format);
+ WINED3DFMT_UNKNOWN, 0, flag_mapping[i].bind_flags, flag_mapping[i].rtype, wined3d_format);
if (hr == WINED3DERR_NOTAVAILABLE || hr == WINED3DOK_NOMIPGEN)
continue;
if (hr != WINED3D_OK)
diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index 499e488b061..df5e7d61214 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -236,6 +236,7 @@ static HRESULT WINAPI d3d8_CheckDeviceFormat(IDirect3D8 *iface, UINT adapter, D3
{
struct d3d8 *d3d8 = impl_from_IDirect3D8(iface);
enum wined3d_resource_type wined3d_rtype;
+ unsigned int bind_flags;
HRESULT hr;
TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
@@ -247,20 +248,21 @@ static HRESULT WINAPI d3d8_CheckDeviceFormat(IDirect3D8 *iface, UINT adapter, D3
return D3DERR_INVALIDCALL;
}
+ bind_flags = wined3d_bind_flags_from_d3d8_usage(usage);
usage = usage & (WINED3DUSAGE_MASK | WINED3DUSAGE_QUERY_MASK);
switch (resource_type)
{
case D3DRTYPE_CUBETEXTURE:
usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
case D3DRTYPE_TEXTURE:
- usage |= WINED3DUSAGE_TEXTURE;
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
case D3DRTYPE_SURFACE:
wined3d_rtype = WINED3D_RTYPE_TEXTURE_2D;
break;
case D3DRTYPE_VOLUMETEXTURE:
case D3DRTYPE_VOLUME:
- usage |= WINED3DUSAGE_TEXTURE;
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
wined3d_rtype = WINED3D_RTYPE_TEXTURE_3D;
break;
@@ -276,7 +278,7 @@ static HRESULT WINAPI d3d8_CheckDeviceFormat(IDirect3D8 *iface, UINT adapter, D3
wined3d_mutex_lock();
hr = wined3d_check_device_format(d3d8->wined3d, adapter, device_type, wined3dformat_from_d3dformat(adapter_format),
- usage, wined3d_rtype, wined3dformat_from_d3dformat(format));
+ usage, bind_flags, wined3d_rtype, wined3dformat_from_d3dformat(format));
wined3d_mutex_unlock();
return hr;
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index 49da816564e..dd6e0bd8eb8 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -249,6 +249,7 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter,
{
struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface);
enum wined3d_resource_type wined3d_rtype;
+ unsigned int bind_flags;
HRESULT hr;
TRACE("iface %p, adapter %u, device_type %#x, adapter_format %#x, usage %#x, resource_type %#x, format %#x.\n",
@@ -260,20 +261,21 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter,
return D3DERR_INVALIDCALL;
}
+ bind_flags = wined3d_bind_flags_from_d3d9_usage(usage);
usage = usage & (WINED3DUSAGE_MASK | WINED3DUSAGE_QUERY_MASK);
switch (resource_type)
{
case D3DRTYPE_CUBETEXTURE:
usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
case D3DRTYPE_TEXTURE:
- usage |= WINED3DUSAGE_TEXTURE;
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
case D3DRTYPE_SURFACE:
wined3d_rtype = WINED3D_RTYPE_TEXTURE_2D;
break;
case D3DRTYPE_VOLUMETEXTURE:
case D3DRTYPE_VOLUME:
- usage |= WINED3DUSAGE_TEXTURE;
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
wined3d_rtype = WINED3D_RTYPE_TEXTURE_3D;
break;
@@ -289,7 +291,7 @@ static HRESULT WINAPI d3d9_CheckDeviceFormat(IDirect3D9Ex *iface, UINT adapter,
wined3d_mutex_lock();
hr = wined3d_check_device_format(d3d9->wined3d, adapter, device_type, wined3dformat_from_d3dformat(adapter_format),
- usage, wined3d_rtype, wined3dformat_from_d3dformat(format));
+ usage, bind_flags, wined3d_rtype, wined3dformat_from_d3dformat(format));
wined3d_mutex_unlock();
return hr;
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index a87bef45025..70d35fc50c1 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -1341,8 +1341,9 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device,
return D3DERR_INVALIDCALL;
}
wined3d_mutex_lock();
- hr = wined3d_check_device_format(device->d3d_parent->wined3d, 0, WINED3D_DEVICE_TYPE_HAL, WINED3DFMT_B8G8R8A8_UNORM,
- WINED3DUSAGE_TEXTURE | WINED3DUSAGE_QUERY_GENMIPMAP, WINED3D_RTYPE_TEXTURE_2D, wined3dformat_from_d3dformat(format));
+ hr = wined3d_check_device_format(device->d3d_parent->wined3d, WINED3DADAPTER_DEFAULT,
+ WINED3D_DEVICE_TYPE_HAL, WINED3DFMT_B8G8R8A8_UNORM, WINED3DUSAGE_QUERY_GENMIPMAP,
+ WINED3D_BIND_SHADER_RESOURCE, WINED3D_RTYPE_TEXTURE_2D, wined3dformat_from_d3dformat(format));
wined3d_mutex_unlock();
if (hr == D3D_OK)
{
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index e0aba7bd11a..9a40bc971b2 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1743,7 +1743,7 @@ static HRESULT WINAPI ddraw7_GetFourCCCodes(IDirectDraw7 *iface, DWORD *NumCodes
for (i = 0; i < ARRAY_SIZE(formats); ++i)
{
if (SUCCEEDED(wined3d_check_device_format(ddraw->wined3d, WINED3DADAPTER_DEFAULT, WINED3D_DEVICE_TYPE_HAL,
- mode.format_id, 0, WINED3D_RTYPE_TEXTURE_2D, formats[i])))
+ mode.format_id, 0, 0, WINED3D_RTYPE_TEXTURE_2D, formats[i])))
{
if (count < outsize)
Codes[count] = formats[i];
@@ -4437,8 +4437,8 @@ static HRESULT WINAPI d3d7_EnumZBufferFormats(IDirect3D7 *iface, REFCLSID device
for (i = 0; i < ARRAY_SIZE(formats); ++i)
{
- if (SUCCEEDED(wined3d_check_device_format(ddraw->wined3d, WINED3DADAPTER_DEFAULT, type, mode.format_id,
- WINED3DUSAGE_DEPTHSTENCIL, WINED3D_RTYPE_TEXTURE_2D, formats[i])))
+ if (SUCCEEDED(wined3d_check_device_format(ddraw->wined3d, WINED3DADAPTER_DEFAULT, type,
+ mode.format_id, 0, WINED3D_BIND_DEPTH_STENCIL, WINED3D_RTYPE_TEXTURE_2D, formats[i])))
{
DDPIXELFORMAT pformat;
@@ -4462,7 +4462,7 @@ static HRESULT WINAPI d3d7_EnumZBufferFormats(IDirect3D7 *iface, REFCLSID device
* pixel format, so we use dwZBufferBitDepth=32. Some games expect 24. Windows Vista and
* newer enumerate both versions, so we do the same(bug 22434) */
if (SUCCEEDED(wined3d_check_device_format(ddraw->wined3d, WINED3DADAPTER_DEFAULT, type, mode.format_id,
- WINED3DUSAGE_DEPTHSTENCIL, WINED3D_RTYPE_TEXTURE_2D, WINED3DFMT_X8D24_UNORM)))
+ 0, WINED3D_BIND_DEPTH_STENCIL, WINED3D_RTYPE_TEXTURE_2D, WINED3DFMT_X8D24_UNORM)))
{
DDPIXELFORMAT x8d24 =
{
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 7866c281465..0d48c7d704e 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -1089,7 +1089,7 @@ static HRESULT d3d_device7_EnumTextureFormats(IDirect3DDevice7 *iface,
for (i = 0; i < ARRAY_SIZE(FormatList); ++i)
{
if (wined3d_check_device_format(device->ddraw->wined3d, WINED3DADAPTER_DEFAULT, WINED3D_DEVICE_TYPE_HAL,
- mode.format_id, WINED3DUSAGE_TEXTURE, WINED3D_RTYPE_TEXTURE_2D, FormatList[i]) == D3D_OK)
+ mode.format_id, 0, WINED3D_BIND_SHADER_RESOURCE, WINED3D_RTYPE_TEXTURE_2D, FormatList[i]) == D3D_OK)
{
DDPIXELFORMAT pformat;
@@ -1111,8 +1111,8 @@ static HRESULT d3d_device7_EnumTextureFormats(IDirect3DDevice7 *iface,
for (i = 0; i < ARRAY_SIZE(BumpFormatList); ++i)
{
if (wined3d_check_device_format(device->ddraw->wined3d, WINED3DADAPTER_DEFAULT,
- WINED3D_DEVICE_TYPE_HAL, mode.format_id, WINED3DUSAGE_TEXTURE | WINED3DUSAGE_QUERY_LEGACYBUMPMAP,
- WINED3D_RTYPE_TEXTURE_2D, BumpFormatList[i]) == D3D_OK)
+ WINED3D_DEVICE_TYPE_HAL, mode.format_id, WINED3DUSAGE_QUERY_LEGACYBUMPMAP,
+ WINED3D_BIND_SHADER_RESOURCE, WINED3D_RTYPE_TEXTURE_2D, BumpFormatList[i]) == D3D_OK)
{
DDPIXELFORMAT pformat;
@@ -1216,8 +1216,8 @@ static HRESULT WINAPI d3d_device2_EnumTextureFormats(IDirect3DDevice2 *iface,
for (i = 0; i < ARRAY_SIZE(FormatList); ++i)
{
- if (wined3d_check_device_format(device->ddraw->wined3d, 0, WINED3D_DEVICE_TYPE_HAL,
- mode.format_id, WINED3DUSAGE_TEXTURE, WINED3D_RTYPE_TEXTURE_2D, FormatList[i]) == D3D_OK)
+ if (wined3d_check_device_format(device->ddraw->wined3d, WINED3DADAPTER_DEFAULT, WINED3D_DEVICE_TYPE_HAL,
+ mode.format_id, 0, WINED3D_BIND_SHADER_RESOURCE, WINED3D_RTYPE_TEXTURE_2D, FormatList[i]) == D3D_OK)
{
DDSURFACEDESC sdesc;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 0afc9ab4beb..5ce1d85b3ed 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -6119,21 +6119,27 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
{
if (!(desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE)))
{
+ unsigned int bind_flags = 0;
DWORD usage = 0;
if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP)
- usage |= WINED3DUSAGE_LEGACY_CUBEMAP | WINED3DUSAGE_TEXTURE;
+ {
+ usage |= WINED3DUSAGE_LEGACY_CUBEMAP;
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
+ }
else if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
- usage |= WINED3DUSAGE_TEXTURE;
+ {
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
+ }
if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
- usage = WINED3DUSAGE_DEPTHSTENCIL;
+ bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
- usage = WINED3DUSAGE_RENDERTARGET;
+ bind_flags |= WINED3D_BIND_RENDER_TARGET;
if (!(ddraw->flags & DDRAW_NO3D) && SUCCEEDED(hr = wined3d_check_device_format(ddraw->wined3d,
WINED3DADAPTER_DEFAULT, WINED3D_DEVICE_TYPE_HAL, mode.format_id,
- usage, WINED3D_RTYPE_TEXTURE_2D, wined3d_desc.format)))
+ usage, bind_flags, WINED3D_RTYPE_TEXTURE_2D, wined3d_desc.format)))
desc->ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY;
else
desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e65db79decd..00bc737d3fe 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1518,20 +1518,21 @@ static BOOL wined3d_check_surface_capability(const struct wined3d_format *format
* restrict it to some should applications need that. */
HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT adapter_idx,
enum wined3d_device_type device_type, enum wined3d_format_id adapter_format_id, DWORD usage,
- enum wined3d_resource_type resource_type, enum wined3d_format_id check_format_id)
+ unsigned int bind_flags, enum wined3d_resource_type resource_type, enum wined3d_format_id check_format_id)
{
const struct wined3d_format *adapter_format, *format;
enum wined3d_gl_resource_type gl_type, gl_type_end;
const struct wined3d_adapter *adapter;
BOOL mipmap_gen_supported = TRUE;
+ unsigned int allowed_bind_flags;
DWORD format_flags = 0;
DWORD allowed_usage;
TRACE("wined3d %p, adapter_idx %u, device_type %s, adapter_format %s, usage %s, %s, "
- "resource_type %s, check_format %s.\n",
+ "bind_flags %s, resource_type %s, check_format %s.\n",
wined3d, adapter_idx, debug_d3ddevicetype(device_type), debug_d3dformat(adapter_format_id),
- debug_d3dusage(usage), debug_d3dusagequery(usage), debug_d3dresourcetype(resource_type),
- debug_d3dformat(check_format_id));
+ debug_d3dusage(usage), debug_d3dusagequery(usage), wined3d_debug_bind_flags(bind_flags),
+ debug_d3dresourcetype(resource_type), debug_d3dformat(check_format_id));
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
@@ -1540,11 +1541,20 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
adapter_format = wined3d_get_format(adapter, adapter_format_id, WINED3DUSAGE_RENDERTARGET);
format = wined3d_get_format(adapter, check_format_id, usage);
+ if (usage & WINED3DUSAGE_RENDERTARGET)
+ bind_flags |= WINED3D_BIND_RENDER_TARGET;
+ if (usage & WINED3DUSAGE_DEPTHSTENCIL)
+ bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
+ if (usage & WINED3DUSAGE_TEXTURE)
+ bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
+ usage &= ~(WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_DEPTHSTENCIL | WINED3DUSAGE_TEXTURE);
+
switch (resource_type)
{
case WINED3D_RTYPE_NONE:
- allowed_usage = WINED3DUSAGE_DEPTHSTENCIL
- | WINED3DUSAGE_RENDERTARGET;
+ allowed_usage = 0;
+ allowed_bind_flags = WINED3D_BIND_RENDER_TARGET
+ | WINED3D_BIND_DEPTH_STENCIL;
gl_type = WINED3D_GL_RES_TYPE_TEX_2D;
gl_type_end = WINED3D_GL_RES_TYPE_TEX_3D;
break;
@@ -1552,7 +1562,6 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
case WINED3D_RTYPE_TEXTURE_1D:
allowed_usage = WINED3DUSAGE_DYNAMIC
| WINED3DUSAGE_SOFTWAREPROCESSING
- | WINED3DUSAGE_TEXTURE
| WINED3DUSAGE_QUERY_FILTER
| WINED3DUSAGE_QUERY_GENMIPMAP
| WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING
@@ -1560,16 +1569,17 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
| WINED3DUSAGE_QUERY_SRGBWRITE
| WINED3DUSAGE_QUERY_VERTEXTEXTURE
| WINED3DUSAGE_QUERY_WRAPANDMIP;
+ allowed_bind_flags = WINED3D_BIND_SHADER_RESOURCE;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_1D;
break;
case WINED3D_RTYPE_TEXTURE_2D:
- allowed_usage = WINED3DUSAGE_DEPTHSTENCIL
- | WINED3DUSAGE_RENDERTARGET
- | WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- if (usage & WINED3DUSAGE_RENDERTARGET)
+ allowed_usage = WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
+ if (bind_flags & WINED3D_BIND_RENDER_TARGET)
allowed_usage |= WINED3DUSAGE_QUERY_SRGBWRITE;
- if (!(usage & WINED3DUSAGE_TEXTURE))
+ allowed_bind_flags = WINED3D_BIND_RENDER_TARGET
+ | WINED3D_BIND_DEPTH_STENCIL;
+ if (!(bind_flags & WINED3D_BIND_SHADER_RESOURCE))
{
if (!wined3d_check_surface_capability(format))
{
@@ -1583,7 +1593,6 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
allowed_usage |= WINED3DUSAGE_DYNAMIC
| WINED3DUSAGE_LEGACY_CUBEMAP
| WINED3DUSAGE_SOFTWAREPROCESSING
- | WINED3DUSAGE_TEXTURE
| WINED3DUSAGE_QUERY_FILTER
| WINED3DUSAGE_QUERY_GENMIPMAP
| WINED3DUSAGE_QUERY_LEGACYBUMPMAP
@@ -1591,13 +1600,15 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
| WINED3DUSAGE_QUERY_SRGBWRITE
| WINED3DUSAGE_QUERY_VERTEXTEXTURE
| WINED3DUSAGE_QUERY_WRAPANDMIP;
+ allowed_bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_2D;
if (usage & WINED3DUSAGE_LEGACY_CUBEMAP)
{
- allowed_usage &= ~(WINED3DUSAGE_DEPTHSTENCIL | WINED3DUSAGE_QUERY_LEGACYBUMPMAP);
+ allowed_usage &= ~WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
+ allowed_bind_flags &= ~WINED3D_BIND_DEPTH_STENCIL;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_CUBE;
}
- else if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
+ else if ((bind_flags & WINED3D_BIND_DEPTH_STENCIL)
&& (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_SHADOW)
&& !adapter->gl_info.supported[ARB_SHADOW])
{
@@ -1609,13 +1620,13 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
case WINED3D_RTYPE_TEXTURE_3D:
allowed_usage = WINED3DUSAGE_DYNAMIC
| WINED3DUSAGE_SOFTWAREPROCESSING
- | WINED3DUSAGE_TEXTURE
| WINED3DUSAGE_QUERY_FILTER
| WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING
| WINED3DUSAGE_QUERY_SRGBREAD
| WINED3DUSAGE_QUERY_SRGBWRITE
| WINED3DUSAGE_QUERY_VERTEXTEXTURE
| WINED3DUSAGE_QUERY_WRAPANDMIP;
+ allowed_bind_flags = WINED3D_BIND_SHADER_RESOURCE;
gl_type = gl_type_end = WINED3D_GL_RES_TYPE_TEX_3D;
break;
@@ -1631,7 +1642,15 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
return WINED3DERR_NOTAVAILABLE;
}
- if (usage & WINED3DUSAGE_TEXTURE)
+ if ((bind_flags & allowed_bind_flags) != bind_flags)
+ {
+ TRACE("Requested bind flags %s, but resource type %s only allows %s.\n",
+ wined3d_debug_bind_flags(bind_flags), debug_d3dresourcetype(resource_type),
+ wined3d_debug_bind_flags(allowed_bind_flags));
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (bind_flags & WINED3D_BIND_SHADER_RESOURCE)
format_flags |= WINED3DFMT_FLAG_TEXTURE;
if (usage & WINED3DUSAGE_QUERY_FILTER)
format_flags |= WINED3DFMT_FLAG_FILTERING;
@@ -1661,22 +1680,22 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
return WINED3DERR_NOTAVAILABLE;
}
- if ((usage & WINED3DUSAGE_RENDERTARGET)
+ if ((bind_flags & WINED3D_BIND_RENDER_TARGET)
&& !CheckRenderTargetCapability(adapter, adapter_format, format, gl_type))
{
- TRACE("Requested WINED3DUSAGE_RENDERTARGET, but format %s is not supported for render targets.\n",
+ TRACE("Requested WINED3D_BIND_RENDER_TARGET, but format %s is not supported for render targets.\n",
debug_d3dformat(check_format_id));
return WINED3DERR_NOTAVAILABLE;
}
/* 3D depth / stencil textures are never supported. */
- if (usage == WINED3DUSAGE_DEPTHSTENCIL && gl_type == WINED3D_GL_RES_TYPE_TEX_3D)
+ if (bind_flags == WINED3D_BIND_DEPTH_STENCIL && gl_type == WINED3D_GL_RES_TYPE_TEX_3D)
continue;
- if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
+ if ((bind_flags & WINED3D_BIND_DEPTH_STENCIL)
&& !CheckDepthStencilCapability(adapter, adapter_format, format, gl_type))
{
- TRACE("Requested WINED3DUSAGE_DEPTHSTENCIL, but format %s is not supported for depth / stencil buffers.\n",
+ TRACE("Requested WINED3D_BIND_DEPTH_STENCIL, but format %s is not supported for depth/stencil buffers.\n",
debug_d3dformat(check_format_id));
return WINED3DERR_NOTAVAILABLE;
}
@@ -1827,7 +1846,7 @@ HRESULT CDECL wined3d_check_device_type(const struct wined3d *wined3d, UINT adap
/* Validate that the back buffer format is usable for render targets. */
if (FAILED(wined3d_check_device_format(wined3d, adapter_idx, device_type, display_format,
- WINED3DUSAGE_RENDERTARGET, WINED3D_RTYPE_TEXTURE_2D, backbuffer_format)))
+ 0, WINED3D_BIND_RENDER_TARGET, WINED3D_RTYPE_TEXTURE_2D, backbuffer_format)))
{
TRACE("Format %s not allowed for render targets.\n", debug_d3dformat(backbuffer_format));
return WINED3DERR_NOTAVAILABLE;
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index ee70221191e..b1d3a521de7 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -3,7 +3,7 @@
@ cdecl wined3d_calculate_format_pitch(ptr long long long)
@ cdecl wined3d_check_depth_stencil_match(ptr long long long long long)
-@ cdecl wined3d_check_device_format(ptr long long long long long long)
+@ cdecl wined3d_check_device_format(ptr long long long long long long long)
@ cdecl wined3d_check_device_format_conversion(ptr long long long long)
@ cdecl wined3d_check_device_multisample_type(ptr long long long long long ptr)
@ cdecl wined3d_check_device_type(ptr long long long long long)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 15cbf0895ff..3575f7e02ca 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2182,7 +2182,7 @@ HRESULT __cdecl wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
enum wined3d_format_id render_target_format_id, enum wined3d_format_id depth_stencil_format_id);
HRESULT __cdecl wined3d_check_device_format(const struct wined3d *wined3d, UINT adaper_idx,
enum wined3d_device_type device_type, enum wined3d_format_id adapter_format_id, DWORD usage,
- enum wined3d_resource_type resource_type, enum wined3d_format_id check_format_id);
+ unsigned int bind_flags, enum wined3d_resource_type resource_type, enum wined3d_format_id check_format_id);
HRESULT __cdecl wined3d_check_device_format_conversion(const struct wined3d *wined3d, UINT adapter_idx,
enum wined3d_device_type device_type, enum wined3d_format_id source_format_id,
enum wined3d_format_id target_format_id);
--
2.11.0
Oct. 31, 2018
[PATCH 2/5] wined3d: Pass correct bind flags to swapchain creation functions.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d3d8/device.c | 2 +-
dlls/d3d9/device.c | 2 +-
dlls/ddraw/ddraw.c | 2 +-
dlls/dxgi/device.c | 12 ++++++------
dlls/dxgi/dxgi_private.h | 4 ++--
dlls/dxgi/swapchain.c | 6 +++---
dlls/dxgi/utils.c | 22 +++++++++++-----------
dlls/wined3d/device.c | 8 ++++----
dlls/wined3d/swapchain.c | 12 ++++++------
include/wine/wined3d.h | 2 +-
10 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index a09a72b4051..27b32faa445 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -301,7 +301,7 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch
swapchain_desc->backbuffer_height = present_parameters->BackBufferHeight;
swapchain_desc->backbuffer_format = wined3dformat_from_d3dformat(present_parameters->BackBufferFormat);
swapchain_desc->backbuffer_count = max(1, present_parameters->BackBufferCount);
- swapchain_desc->backbuffer_usage = WINED3DUSAGE_RENDERTARGET;
+ swapchain_desc->backbuffer_bind_flags = WINED3D_BIND_RENDER_TARGET;
swapchain_desc->multisample_type = present_parameters->MultiSampleType;
swapchain_desc->multisample_quality = 0; /* d3d9 only */
swapchain_desc->swap_effect = wined3dswapeffect_from_d3dswapeffect(present_parameters->SwapEffect);
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index fd92b563356..d4f5a4352ce 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -335,7 +335,7 @@ static BOOL wined3d_swapchain_desc_from_present_parameters(struct wined3d_swapch
swapchain_desc->backbuffer_height = present_parameters->BackBufferHeight;
swapchain_desc->backbuffer_format = wined3dformat_from_d3dformat(present_parameters->BackBufferFormat);
swapchain_desc->backbuffer_count = max(1, present_parameters->BackBufferCount);
- swapchain_desc->backbuffer_usage = WINED3DUSAGE_RENDERTARGET;
+ swapchain_desc->backbuffer_bind_flags = WINED3D_BIND_RENDER_TARGET;
swapchain_desc->multisample_type = present_parameters->MultiSampleType;
swapchain_desc->multisample_quality = present_parameters->MultiSampleQuality;
swapchain_desc->swap_effect = wined3dswapeffect_from_d3dswapeffect(present_parameters->SwapEffect);
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 43bc36b80ca..e0aba7bd11a 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -631,7 +631,7 @@ static HRESULT ddraw_create_swapchain(struct ddraw *ddraw, HWND window, BOOL win
swapchain_desc.backbuffer_width = mode.width;
swapchain_desc.backbuffer_height = mode.height;
swapchain_desc.backbuffer_format = mode.format_id;
- swapchain_desc.backbuffer_usage = 0;
+ swapchain_desc.backbuffer_bind_flags = 0;
swapchain_desc.backbuffer_count = 1;
swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
swapchain_desc.device_window = window;
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index 2c459ca2469..26f248800fa 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -186,12 +186,12 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac
surface_desc.format = wined3dformat_from_dxgi_format(desc->Format);
wined3d_sample_desc_from_dxgi(&surface_desc.multisample_type,
&surface_desc.multisample_quality, &desc->SampleDesc);
- surface_desc.usage = wined3d_usage_from_dxgi_usage(usage);
- surface_desc.bind_flags = 0;
- if (surface_desc.usage & WINED3DUSAGE_RENDERTARGET)
- surface_desc.bind_flags |= WINED3D_BIND_RENDER_TARGET;
- if (surface_desc.usage & WINED3DUSAGE_TEXTURE)
- surface_desc.bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
+ surface_desc.bind_flags = wined3d_bind_flags_from_dxgi_usage(usage);
+ surface_desc.usage = 0;
+ if (surface_desc.bind_flags & WINED3D_BIND_SHADER_RESOURCE)
+ surface_desc.usage |= WINED3DUSAGE_TEXTURE;
+ if (surface_desc.bind_flags & WINED3D_BIND_RENDER_TARGET)
+ surface_desc.usage |= WINED3DUSAGE_RENDERTARGET;
surface_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
surface_desc.width = desc->Width;
surface_desc.height = desc->Height;
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 78f188634fc..1268a9ca648 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -91,8 +91,8 @@ void wined3d_sample_desc_from_dxgi(enum wined3d_multisample_type *wined3d_type,
unsigned int *wined3d_quality, const DXGI_SAMPLE_DESC *dxgi_desc) DECLSPEC_HIDDEN;
void wined3d_display_mode_from_dxgi(struct wined3d_display_mode *wined3d_mode,
const DXGI_MODE_DESC *mode) DECLSPEC_HIDDEN;
-DXGI_USAGE dxgi_usage_from_wined3d_usage(DWORD wined3d_usage) DECLSPEC_HIDDEN;
-DWORD wined3d_usage_from_dxgi_usage(DXGI_USAGE usage) DECLSPEC_HIDDEN;
+DXGI_USAGE dxgi_usage_from_wined3d_bind_flags(unsigned int wined3d_bind_flags) DECLSPEC_HIDDEN;
+unsigned int wined3d_bind_flags_from_dxgi_usage(DXGI_USAGE usage) DECLSPEC_HIDDEN;
unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags) DECLSPEC_HIDDEN;
unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags) DECLSPEC_HIDDEN;
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 3eefbe50df8..0d325cf61f9 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -381,7 +381,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc(IDXGISwapChain1 *iface,
desc->BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
dxgi_sample_desc_from_wined3d(&desc->SampleDesc,
wined3d_desc.multisample_type, wined3d_desc.multisample_quality);
- desc->BufferUsage = dxgi_usage_from_wined3d_usage(wined3d_desc.backbuffer_usage);
+ desc->BufferUsage = dxgi_usage_from_wined3d_bind_flags(wined3d_desc.backbuffer_bind_flags);
desc->BufferCount = wined3d_desc.backbuffer_count;
desc->OutputWindow = wined3d_desc.device_window;
desc->Windowed = wined3d_desc.windowed;
@@ -538,7 +538,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetDesc1(IDXGISwapChain1 *iface
desc->Stereo = FALSE;
dxgi_sample_desc_from_wined3d(&desc->SampleDesc,
wined3d_desc.multisample_type, wined3d_desc.multisample_quality);
- desc->BufferUsage = dxgi_usage_from_wined3d_usage(wined3d_desc.backbuffer_usage);
+ desc->BufferUsage = dxgi_usage_from_wined3d_bind_flags(wined3d_desc.backbuffer_bind_flags);
desc->BufferCount = wined3d_desc.backbuffer_count;
desc->Scaling = DXGI_SCALING_STRETCH;
desc->SwapEffect = dxgi_swap_effect_from_wined3d(wined3d_desc.swap_effect);
@@ -858,7 +858,7 @@ HRESULT d3d11_swapchain_create(IWineDXGIDevice *device, HWND window, const DXGI_
wined3d_desc.backbuffer_height = swapchain_desc->Height;
wined3d_desc.backbuffer_format = wined3dformat_from_dxgi_format(swapchain_desc->Format);
wined3d_desc.backbuffer_count = swapchain_desc->BufferCount;
- wined3d_desc.backbuffer_usage = wined3d_usage_from_dxgi_usage(swapchain_desc->BufferUsage);
+ wined3d_desc.backbuffer_bind_flags = wined3d_bind_flags_from_dxgi_usage(swapchain_desc->BufferUsage);
wined3d_sample_desc_from_dxgi(&wined3d_desc.multisample_type,
&wined3d_desc.multisample_quality, &swapchain_desc->SampleDesc);
wined3d_desc.device_window = window;
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index 73b37fda8b5..3a67cfededf 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -455,34 +455,34 @@ void wined3d_display_mode_from_dxgi(struct wined3d_display_mode *wined3d_mode,
wined3d_mode->scanline_ordering = wined3d_scanline_ordering_from_dxgi(mode->ScanlineOrdering);
}
-DXGI_USAGE dxgi_usage_from_wined3d_usage(DWORD wined3d_usage)
+DXGI_USAGE dxgi_usage_from_wined3d_bind_flags(unsigned int wined3d_bind_flags)
{
DXGI_USAGE dxgi_usage = 0;
- if (wined3d_usage & WINED3DUSAGE_TEXTURE)
+ if (wined3d_bind_flags & WINED3D_BIND_SHADER_RESOURCE)
dxgi_usage |= DXGI_USAGE_SHADER_INPUT;
- if (wined3d_usage & WINED3DUSAGE_RENDERTARGET)
+ if (wined3d_bind_flags & WINED3D_BIND_RENDER_TARGET)
dxgi_usage |= DXGI_USAGE_RENDER_TARGET_OUTPUT;
- wined3d_usage &= ~(WINED3DUSAGE_TEXTURE | WINED3DUSAGE_RENDERTARGET);
- if (wined3d_usage)
- FIXME("Unhandled wined3d usage %#x.\n", wined3d_usage);
+ wined3d_bind_flags &= ~(WINED3D_BIND_SHADER_RESOURCE | WINED3D_BIND_RENDER_TARGET);
+ if (wined3d_bind_flags)
+ FIXME("Unhandled wined3d bind flags %#x.\n", wined3d_bind_flags);
return dxgi_usage;
}
-DWORD wined3d_usage_from_dxgi_usage(DXGI_USAGE dxgi_usage)
+unsigned int wined3d_bind_flags_from_dxgi_usage(DXGI_USAGE dxgi_usage)
{
- DWORD wined3d_usage = 0;
+ unsigned int wined3d_bind_flags = 0;
if (dxgi_usage & DXGI_USAGE_SHADER_INPUT)
- wined3d_usage |= WINED3DUSAGE_TEXTURE;
+ wined3d_bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
if (dxgi_usage & DXGI_USAGE_RENDER_TARGET_OUTPUT)
- wined3d_usage |= WINED3DUSAGE_RENDERTARGET;
+ wined3d_bind_flags |= WINED3D_BIND_RENDER_TARGET;
dxgi_usage &= ~(DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT);
if (dxgi_usage)
FIXME("Unhandled DXGI usage %#x.\n", dxgi_usage);
- return wined3d_usage;
+ return wined3d_bind_flags;
}
#define DXGI_WINED3D_SWAPCHAIN_FLAGS \
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 83b8bea9696..5515b27b069 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1092,7 +1092,7 @@ HRESULT CDECL wined3d_device_init_3d(struct wined3d_device *device,
goto err_out;
}
- if (swapchain_desc->backbuffer_count && swapchain_desc->backbuffer_usage & WINED3DUSAGE_RENDERTARGET)
+ if (swapchain_desc->backbuffer_count && swapchain_desc->backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
{
struct wined3d_resource *back_buffer = &swapchain->back_buffers[0]->resource;
struct wined3d_view_desc view_desc;
@@ -4823,8 +4823,8 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
TRACE("refresh_rate %u\n", swapchain_desc->refresh_rate);
TRACE("auto_restore_display_mode %#x\n", swapchain_desc->auto_restore_display_mode);
- if (swapchain_desc->backbuffer_usage && swapchain_desc->backbuffer_usage != WINED3DUSAGE_RENDERTARGET)
- FIXME("Got unexpected backbuffer usage %#x.\n", swapchain_desc->backbuffer_usage);
+ if (swapchain_desc->backbuffer_bind_flags && swapchain_desc->backbuffer_bind_flags != WINED3D_BIND_RENDER_TARGET)
+ FIXME("Got unexpected backbuffer bind flags %#x.\n", swapchain_desc->backbuffer_bind_flags);
if (swapchain_desc->swap_effect != WINED3D_SWAP_EFFECT_DISCARD
&& swapchain_desc->swap_effect != WINED3D_SWAP_EFFECT_SEQUENTIAL
@@ -4939,7 +4939,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
wined3d_rendertarget_view_decref(device->back_buffer_view);
device->back_buffer_view = NULL;
}
- if (swapchain->desc.backbuffer_count && swapchain->desc.backbuffer_usage & WINED3DUSAGE_RENDERTARGET)
+ if (swapchain->desc.backbuffer_count && swapchain->desc.backbuffer_bind_flags & WINED3D_BIND_RENDER_TARGET)
{
struct wined3d_resource *back_buffer = &swapchain->back_buffers[0]->resource;
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 768d27fd674..91f96a47a03 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -917,14 +917,14 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
goto err;
}
- texture_desc.usage = swapchain->desc.backbuffer_usage;
+ texture_desc.bind_flags = swapchain->desc.backbuffer_bind_flags;
+ texture_desc.usage = 0;
if (device->wined3d->flags & WINED3D_NO3D)
texture_desc.usage |= WINED3DUSAGE_OWNDC;
- texture_desc.bind_flags = 0;
- if (texture_desc.usage & WINED3DUSAGE_RENDERTARGET)
- texture_desc.bind_flags |= WINED3D_BIND_RENDER_TARGET;
- if (texture_desc.usage & WINED3DUSAGE_TEXTURE)
- texture_desc.bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
+ if (texture_desc.bind_flags & WINED3D_BIND_RENDER_TARGET)
+ texture_desc.usage |= WINED3DUSAGE_RENDERTARGET;
+ if (texture_desc.bind_flags & WINED3D_BIND_SHADER_RESOURCE)
+ texture_desc.usage |= WINED3DUSAGE_TEXTURE;
for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
{
TRACE("Creating back buffer %u.\n", i);
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 7dc47e63d5a..15cbf0895ff 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1747,7 +1747,7 @@ struct wined3d_swapchain_desc
unsigned int backbuffer_height;
enum wined3d_format_id backbuffer_format;
unsigned int backbuffer_count;
- DWORD backbuffer_usage;
+ unsigned int backbuffer_bind_flags;
enum wined3d_multisample_type multisample_type;
DWORD multisample_quality;
enum wined3d_swap_effect swap_effect;
--
2.11.0
Oct. 31, 2018
[PATCH 1/5] wined3d: Pass correct bind flags to texture creation functions.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d3d11/buffer.c | 2 +-
dlls/d3d11/d3d11_private.h | 11 ++++++++++-
dlls/d3d11/device.c | 2 +-
dlls/d3d11/texture.c | 3 +++
dlls/d3d11/utils.c | 15 ---------------
dlls/d3d8/buffer.c | 4 ++--
dlls/d3d8/d3d8_private.h | 21 +++++++++++++++++++--
dlls/d3d8/device.c | 1 +
dlls/d3d8/surface.c | 2 +-
dlls/d3d8/texture.c | 9 ++++++---
dlls/d3d8/volume.c | 2 +-
dlls/d3d9/buffer.c | 4 ++--
dlls/d3d9/d3d9_private.h | 21 +++++++++++++++++++--
dlls/d3d9/device.c | 1 +
dlls/d3d9/surface.c | 2 +-
dlls/d3d9/texture.c | 3 +++
dlls/d3d9/volume.c | 2 +-
dlls/ddraw/surface.c | 10 ++++++++++
dlls/dxgi/device.c | 5 +++++
dlls/wined3d/arb_program_shader.c | 1 +
dlls/wined3d/device.c | 3 +++
dlls/wined3d/glsl_shader.c | 1 +
dlls/wined3d/resource.c | 1 +
dlls/wined3d/surface.c | 2 ++
dlls/wined3d/swapchain.c | 7 +++++++
dlls/wined3d/texture.c | 3 ++-
include/wine/wined3d.h | 2 ++
27 files changed, 106 insertions(+), 34 deletions(-)
diff --git a/dlls/d3d11/buffer.c b/dlls/d3d11/buffer.c
index 2221a8fdd5a..fb5b8177516 100644
--- a/dlls/d3d11/buffer.c
+++ b/dlls/d3d11/buffer.c
@@ -451,7 +451,7 @@ static HRESULT d3d_buffer_init(struct d3d_buffer *buffer, struct d3d_device *dev
wined3d_desc.byte_width = buffer->desc.ByteWidth;
wined3d_desc.usage = wined3d_usage_from_d3d11(0, buffer->desc.Usage);
- wined3d_desc.bind_flags = buffer->desc.BindFlags;
+ wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(buffer->desc.BindFlags);
wined3d_desc.access = wined3d_access_from_d3d11(buffer->desc.Usage, buffer->desc.CPUAccessFlags);
wined3d_desc.misc_flags = buffer->desc.MiscFlags;
wined3d_desc.structure_byte_stride = buffer->desc.StructureByteStride;
diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h
index 787fe87b5a9..e3261a57c94 100644
--- a/dlls/d3d11/d3d11_private.h
+++ b/dlls/d3d11/d3d11_private.h
@@ -65,7 +65,6 @@ void d3d11_primitive_topology_from_wined3d_primitive_type(enum wined3d_primitive
void wined3d_primitive_type_from_d3d11_primitive_topology(D3D11_PRIMITIVE_TOPOLOGY topology,
enum wined3d_primitive_type *type, unsigned int *patch_vertex_count) DECLSPEC_HIDDEN;
unsigned int wined3d_getdata_flags_from_d3d11_async_getdata_flags(unsigned int d3d11_flags) DECLSPEC_HIDDEN;
-UINT d3d11_bind_flags_from_wined3d_usage(DWORD wined3d_usage) DECLSPEC_HIDDEN;
DWORD wined3d_usage_from_d3d11(UINT bind_flags, enum D3D11_USAGE usage) DECLSPEC_HIDDEN;
struct wined3d_resource *wined3d_resource_from_d3d11_resource(ID3D11Resource *resource) DECLSPEC_HIDDEN;
struct wined3d_resource *wined3d_resource_from_d3d10_resource(ID3D10Resource *resource) DECLSPEC_HIDDEN;
@@ -93,6 +92,16 @@ HRESULT d3d_set_private_data(struct wined3d_private_store *store,
HRESULT d3d_set_private_data_interface(struct wined3d_private_store *store,
REFGUID guid, const IUnknown *object) DECLSPEC_HIDDEN;
+static inline unsigned int wined3d_bind_flags_from_d3d11(UINT bind_flags)
+{
+ return bind_flags;
+}
+
+static inline UINT d3d11_bind_flags_from_wined3d(unsigned int bind_flags)
+{
+ return bind_flags;
+}
+
static inline void read_dword(const char **ptr, DWORD *d)
{
memcpy(d, *ptr, sizeof(*d));
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index e4c2c80e00b..8c40cf8b475 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -6070,7 +6070,7 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic
desc.SampleDesc.Count = wined3d_desc->multisample_type ? wined3d_desc->multisample_type : 1;
desc.SampleDesc.Quality = wined3d_desc->multisample_quality;
desc.Usage = D3D11_USAGE_DEFAULT;
- desc.BindFlags = d3d11_bind_flags_from_wined3d_usage(wined3d_desc->usage);
+ desc.BindFlags = d3d11_bind_flags_from_wined3d(wined3d_desc->bind_flags);
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
diff --git a/dlls/d3d11/texture.c b/dlls/d3d11/texture.c
index 36d97415a25..9df8bae00c8 100644
--- a/dlls/d3d11/texture.c
+++ b/dlls/d3d11/texture.c
@@ -457,6 +457,7 @@ HRESULT d3d_texture1d_create(struct d3d_device *device, const D3D11_TEXTURE1D_DE
wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
wined3d_desc.multisample_quality = 0;
wined3d_desc.usage = wined3d_usage_from_d3d11(desc->BindFlags, desc->Usage);
+ wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags);
wined3d_desc.access = wined3d_access_from_d3d11(desc->Usage,
desc->Usage == D3D11_USAGE_DEFAULT ? 0 : desc->CPUAccessFlags);
wined3d_desc.width = desc->Width;
@@ -1010,6 +1011,7 @@ HRESULT d3d_texture2d_create(struct d3d_device *device, const D3D11_TEXTURE2D_DE
wined3d_desc.multisample_type = desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3D_MULTISAMPLE_NONE;
wined3d_desc.multisample_quality = desc->SampleDesc.Quality;
wined3d_desc.usage = wined3d_usage_from_d3d11(desc->BindFlags, desc->Usage);
+ wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags);
wined3d_desc.access = wined3d_access_from_d3d11(desc->Usage,
desc->Usage == D3D11_USAGE_DEFAULT ? 0 : desc->CPUAccessFlags);
wined3d_desc.width = desc->Width;
@@ -1468,6 +1470,7 @@ static HRESULT d3d_texture3d_init(struct d3d_texture3d *texture, struct d3d_devi
wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
wined3d_desc.multisample_quality = 0;
wined3d_desc.usage = wined3d_usage_from_d3d11(desc->BindFlags, desc->Usage);
+ wined3d_desc.bind_flags = wined3d_bind_flags_from_d3d11(desc->BindFlags);
wined3d_desc.access = wined3d_access_from_d3d11(desc->Usage,
desc->Usage == D3D11_USAGE_DEFAULT ? 0 : desc->CPUAccessFlags);
wined3d_desc.width = desc->Width;
diff --git a/dlls/d3d11/utils.c b/dlls/d3d11/utils.c
index 8fdb00518ff..c7c682ba6c8 100644
--- a/dlls/d3d11/utils.c
+++ b/dlls/d3d11/utils.c
@@ -441,21 +441,6 @@ unsigned int wined3d_getdata_flags_from_d3d11_async_getdata_flags(unsigned int d
return WINED3DGETDATA_FLUSH;
}
-UINT d3d11_bind_flags_from_wined3d_usage(DWORD wined3d_usage)
-{
- UINT bind_flags = 0;
-
- if (wined3d_usage & WINED3DUSAGE_TEXTURE)
- bind_flags |= D3D11_BIND_SHADER_RESOURCE;
- if (wined3d_usage & WINED3DUSAGE_RENDERTARGET)
- bind_flags |= D3D11_BIND_RENDER_TARGET;
-
- wined3d_usage &= ~(WINED3DUSAGE_TEXTURE | WINED3DUSAGE_RENDERTARGET);
- if (wined3d_usage)
- FIXME("Unhandled wined3d usage %#x.\n", wined3d_usage);
- return bind_flags;
-}
-
DWORD wined3d_usage_from_d3d11(UINT bind_flags, enum D3D11_USAGE usage)
{
static const DWORD handled = D3D11_BIND_SHADER_RESOURCE
diff --git a/dlls/d3d8/buffer.c b/dlls/d3d8/buffer.c
index fb6b7bc1e92..9534c33932d 100644
--- a/dlls/d3d8/buffer.c
+++ b/dlls/d3d8/buffer.c
@@ -229,7 +229,7 @@ static HRESULT WINAPI d3d8_vertexbuffer_GetDesc(IDirect3DVertexBuffer8 *iface,
desc->Format = D3DFMT_VERTEXDATA;
desc->Type = D3DRTYPE_VERTEXBUFFER;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->FVF = buffer->fvf;
@@ -527,7 +527,7 @@ static HRESULT WINAPI d3d8_indexbuffer_GetDesc(IDirect3DIndexBuffer8 *iface,
desc->Format = d3dformat_from_wined3dformat(buffer->format);
desc->Type = D3DRTYPE_INDEXBUFFER;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h
index 40a0f0a38d4..7f6049df574 100644
--- a/dlls/d3d8/d3d8_private.h
+++ b/dlls/d3d8/d3d8_private.h
@@ -278,9 +278,14 @@ unsigned int wined3dmapflags_from_d3dmapflags(unsigned int flags) DECLSPEC_HIDDE
void load_local_constants(const DWORD *d3d8_elements, struct wined3d_shader *wined3d_vertex_shader) DECLSPEC_HIDDEN;
size_t parse_token(const DWORD *pToken) DECLSPEC_HIDDEN;
-static inline DWORD d3dusage_from_wined3dusage(unsigned int usage)
+static inline DWORD d3dusage_from_wined3dusage(unsigned int wined3d_usage, unsigned int bind_flags)
{
- return usage & WINED3DUSAGE_MASK;
+ DWORD usage = wined3d_usage & WINED3DUSAGE_MASK;
+ if (bind_flags & WINED3D_BIND_RENDER_TARGET)
+ usage |= D3DUSAGE_RENDERTARGET;
+ if (bind_flags & WINED3D_BIND_DEPTH_STENCIL)
+ usage |= D3DUSAGE_DEPTHSTENCIL;
+ return usage;
}
static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage)
@@ -318,4 +323,16 @@ static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int
}
}
+static inline unsigned int wined3d_bind_flags_from_d3d8_usage(DWORD usage)
+{
+ unsigned int bind_flags = 0;
+
+ if (usage & D3DUSAGE_RENDERTARGET)
+ bind_flags |= WINED3D_BIND_RENDER_TARGET;
+ if (usage & D3DUSAGE_DEPTHSTENCIL)
+ bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
+
+ return bind_flags;
+}
+
#endif /* __WINE_D3DX8_PRIVATE_H */
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 12d02538351..a09a72b4051 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1165,6 +1165,7 @@ static HRESULT d3d8_device_create_surface(struct d3d8_device *device, UINT width
desc.usage = usage & WINED3DUSAGE_MASK;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage);
desc.access = wined3daccess_from_d3dpool(pool, usage)
| WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = width;
diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c
index fff47f5ca15..eab9cb369af 100644
--- a/dlls/d3d8/surface.c
+++ b/dlls/d3d8/surface.c
@@ -191,7 +191,7 @@ static HRESULT WINAPI d3d8_surface_GetDesc(IDirect3DSurface8 *iface, D3DSURFACE_
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_SURFACE;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->MultiSampleType = wined3d_desc.multisample_type;
diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c
index f7ccdc7e34b..c952579ce61 100644
--- a/dlls/d3d8/texture.c
+++ b/dlls/d3d8/texture.c
@@ -253,7 +253,7 @@ static HRESULT WINAPI d3d8_texture_2d_GetLevelDesc(IDirect3DTexture8 *iface, UIN
{
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_SURFACE;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->MultiSampleType = wined3d_desc.multisample_type;
@@ -600,7 +600,7 @@ static HRESULT WINAPI d3d8_texture_cube_GetLevelDesc(IDirect3DCubeTexture8 *ifac
{
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_SURFACE;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->MultiSampleType = wined3d_desc.multisample_type;
@@ -945,7 +945,7 @@ static HRESULT WINAPI d3d8_texture_3d_GetLevelDesc(IDirect3DVolumeTexture8 *ifac
{
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_VOLUME;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->Width = wined3d_desc.width;
@@ -1110,6 +1110,7 @@ HRESULT texture_init(struct d3d8_texture *texture, struct d3d8_device *device,
desc.usage |= WINED3DUSAGE_TEXTURE;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage) | WINED3D_BIND_SHADER_RESOURCE;
desc.access = wined3daccess_from_d3dpool(pool, usage)
| WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = width;
@@ -1158,6 +1159,7 @@ HRESULT cubetexture_init(struct d3d8_texture *texture, struct d3d8_device *devic
desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP | WINED3DUSAGE_TEXTURE;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage) | WINED3D_BIND_SHADER_RESOURCE;
desc.access = wined3daccess_from_d3dpool(pool, usage)
| WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = edge_length;
@@ -1205,6 +1207,7 @@ HRESULT volumetexture_init(struct d3d8_texture *texture, struct d3d8_device *dev
desc.usage |= WINED3DUSAGE_TEXTURE;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d8_usage(usage) | WINED3D_BIND_SHADER_RESOURCE;
desc.access = wined3daccess_from_d3dpool(pool, usage);
desc.width = width;
desc.height = height;
diff --git a/dlls/d3d8/volume.c b/dlls/d3d8/volume.c
index 89aa84fdb50..29eab6a6900 100644
--- a/dlls/d3d8/volume.c
+++ b/dlls/d3d8/volume.c
@@ -125,7 +125,7 @@ static HRESULT WINAPI d3d8_volume_GetDesc(IDirect3DVolume8 *iface, D3DVOLUME_DES
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_VOLUME;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->Width = wined3d_desc.width;
diff --git a/dlls/d3d9/buffer.c b/dlls/d3d9/buffer.c
index 36a6ae3f902..ea98ef4242f 100644
--- a/dlls/d3d9/buffer.c
+++ b/dlls/d3d9/buffer.c
@@ -230,7 +230,7 @@ static HRESULT WINAPI d3d9_vertexbuffer_GetDesc(IDirect3DVertexBuffer9 *iface,
desc->Format = D3DFMT_VERTEXDATA;
desc->Type = D3DRTYPE_VERTEXBUFFER;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
desc->FVF = buffer->fvf;
@@ -526,7 +526,7 @@ static HRESULT WINAPI d3d9_indexbuffer_GetDesc(IDirect3DIndexBuffer9 *iface, D3D
desc->Format = d3dformat_from_wined3dformat(buffer->format);
desc->Type = D3DRTYPE_INDEXBUFFER;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Size = wined3d_desc.size;
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index fc6e4af6501..d6155eba60b 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -291,9 +291,14 @@ static inline struct d3d9_device *impl_from_IDirect3DDevice9Ex(IDirect3DDevice9E
return CONTAINING_RECORD(iface, struct d3d9_device, IDirect3DDevice9Ex_iface);
}
-static inline DWORD d3dusage_from_wined3dusage(unsigned int usage)
+static inline DWORD d3dusage_from_wined3dusage(unsigned int wined3d_usage, unsigned int bind_flags)
{
- return usage & WINED3DUSAGE_MASK;
+ DWORD usage = wined3d_usage & WINED3DUSAGE_MASK;
+ if (bind_flags & WINED3D_BIND_RENDER_TARGET)
+ usage |= D3DUSAGE_RENDERTARGET;
+ if (bind_flags & WINED3D_BIND_DEPTH_STENCIL)
+ usage |= D3DUSAGE_DEPTHSTENCIL;
+ return usage;
}
static inline D3DPOOL d3dpool_from_wined3daccess(unsigned int access, unsigned int usage)
@@ -331,6 +336,18 @@ static inline unsigned int wined3daccess_from_d3dpool(D3DPOOL pool, unsigned int
}
}
+static inline unsigned int wined3d_bind_flags_from_d3d9_usage(DWORD usage)
+{
+ unsigned int bind_flags = 0;
+
+ if (usage & D3DUSAGE_RENDERTARGET)
+ bind_flags |= WINED3D_BIND_RENDER_TARGET;
+ if (usage & D3DUSAGE_DEPTHSTENCIL)
+ bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
+
+ return bind_flags;
+}
+
static inline DWORD wined3dusage_from_d3dusage(unsigned int usage)
{
return usage & WINED3DUSAGE_MASK;
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index a3f410a7b97..fd92b563356 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -1392,6 +1392,7 @@ static HRESULT d3d9_device_create_surface(struct d3d9_device *device, UINT width
desc.usage = usage & WINED3DUSAGE_MASK;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage);
desc.access = wined3daccess_from_d3dpool(pool, usage)
| WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = width;
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index 0605e7142a3..50c035d93c7 100644
--- a/dlls/d3d9/surface.c
+++ b/dlls/d3d9/surface.c
@@ -223,7 +223,7 @@ static HRESULT WINAPI d3d9_surface_GetDesc(IDirect3DSurface9 *iface, D3DSURFACE_
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_SURFACE;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->MultiSampleType = wined3d_desc.multisample_type;
desc->MultiSampleQuality = wined3d_desc.multisample_quality;
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index 0858be99220..a87bef45025 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -1314,6 +1314,7 @@ HRESULT texture_init(struct d3d9_texture *texture, struct d3d9_device *device,
desc.usage |= WINED3DUSAGE_TEXTURE;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage) | WINED3D_BIND_SHADER_RESOURCE;
desc.access = wined3daccess_from_d3dpool(pool, usage)
| WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = width;
@@ -1399,6 +1400,7 @@ HRESULT cubetexture_init(struct d3d9_texture *texture, struct d3d9_device *devic
desc.usage |= WINED3DUSAGE_LEGACY_CUBEMAP | WINED3DUSAGE_TEXTURE;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage) | WINED3D_BIND_SHADER_RESOURCE;
desc.access = wined3daccess_from_d3dpool(pool, usage)
| WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = edge_length;
@@ -1470,6 +1472,7 @@ HRESULT volumetexture_init(struct d3d9_texture *texture, struct d3d9_device *dev
desc.usage |= WINED3DUSAGE_TEXTURE;
if (pool == D3DPOOL_SCRATCH)
desc.usage |= WINED3DUSAGE_SCRATCH;
+ desc.bind_flags = wined3d_bind_flags_from_d3d9_usage(usage) | WINED3D_BIND_SHADER_RESOURCE;
desc.access = wined3daccess_from_d3dpool(pool, usage);
desc.width = width;
desc.height = height;
diff --git a/dlls/d3d9/volume.c b/dlls/d3d9/volume.c
index f4c43bc589a..cb0485cd7f4 100644
--- a/dlls/d3d9/volume.c
+++ b/dlls/d3d9/volume.c
@@ -126,7 +126,7 @@ static HRESULT WINAPI d3d9_volume_GetDesc(IDirect3DVolume9 *iface, D3DVOLUME_DES
desc->Format = d3dformat_from_wined3dformat(wined3d_desc.format);
desc->Type = D3DRTYPE_VOLUME;
- desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage);
+ desc->Usage = d3dusage_from_wined3dusage(wined3d_desc.usage, wined3d_desc.bind_flags);
desc->Pool = d3dpool_from_wined3daccess(wined3d_desc.access, wined3d_desc.usage);
desc->Width = wined3d_desc.width;
desc->Height = wined3d_desc.height;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index d201d9d4146..0afc9ab4beb 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -6065,6 +6065,7 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
wined3d_desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
wined3d_desc.multisample_quality = 0;
wined3d_desc.usage = 0;
+ wined3d_desc.bind_flags = 0;
wined3d_desc.access = WINED3D_RESOURCE_ACCESS_GPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
wined3d_desc.width = desc->dwWidth;
wined3d_desc.height = desc->dwHeight;
@@ -6163,11 +6164,20 @@ HRESULT ddraw_surface_create(struct ddraw *ddraw, const DDSURFACEDESC2 *surface_
if (!(ddraw->flags & DDRAW_NO3D))
{
if (desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
+ {
wined3d_desc.usage |= WINED3DUSAGE_TEXTURE;
+ wined3d_desc.bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
+ }
if (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
+ {
wined3d_desc.usage |= WINED3DUSAGE_DEPTHSTENCIL;
+ wined3d_desc.bind_flags |= WINED3D_BIND_DEPTH_STENCIL;
+ }
else if (desc->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)
+ {
wined3d_desc.usage |= WINED3DUSAGE_RENDERTARGET;
+ wined3d_desc.bind_flags |= WINED3D_BIND_RENDER_TARGET;
+ }
}
if (desc->ddsCaps.dwCaps2 & (DDSCAPS2_TEXTUREMANAGE | DDSCAPS2_D3DTEXTUREMANAGE))
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index 51773e9c005..2c459ca2469 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -187,6 +187,11 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac
wined3d_sample_desc_from_dxgi(&surface_desc.multisample_type,
&surface_desc.multisample_quality, &desc->SampleDesc);
surface_desc.usage = wined3d_usage_from_dxgi_usage(usage);
+ surface_desc.bind_flags = 0;
+ if (surface_desc.usage & WINED3DUSAGE_RENDERTARGET)
+ surface_desc.bind_flags |= WINED3D_BIND_RENDER_TARGET;
+ if (surface_desc.usage & WINED3DUSAGE_TEXTURE)
+ surface_desc.bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
surface_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
surface_desc.width = desc->Width;
surface_desc.height = desc->Height;
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 62118fe0c6d..4dafb3442e6 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7820,6 +7820,7 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
desc.multisample_type = src_texture->resource.multisample_type;
desc.multisample_quality = src_texture->resource.multisample_quality;
desc.usage = WINED3DUSAGE_PRIVATE;
+ desc.bind_flags = 0;
desc.access = WINED3D_RESOURCE_ACCESS_GPU;
desc.width = wined3d_texture_get_level_width(src_texture, src_level);
desc.height = wined3d_texture_get_level_height(src_texture, src_level);
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 8b202fce0cf..83b8bea9696 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -576,6 +576,7 @@ static void device_load_logo(struct wined3d_device *device, const char *filename
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = WINED3DUSAGE_DYNAMIC;
+ desc.bind_flags = 0;
desc.access = WINED3D_RESOURCE_ACCESS_GPU;
desc.width = bm.bmWidth;
desc.height = bm.bmHeight;
@@ -4548,6 +4549,7 @@ static struct wined3d_texture *wined3d_device_create_cursor_texture(struct wined
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = WINED3DUSAGE_DYNAMIC;
+ desc.bind_flags = 0;
desc.access = WINED3D_RESOURCE_ACCESS_GPU;
desc.width = wined3d_texture_get_level_width(cursor_image, texture_level);
desc.height = wined3d_texture_get_level_height(cursor_image, texture_level);
@@ -4897,6 +4899,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
texture_desc.multisample_type = swapchain->desc.multisample_type;
texture_desc.multisample_quality = swapchain->desc.multisample_quality;
texture_desc.usage = WINED3DUSAGE_DEPTHSTENCIL;
+ texture_desc.bind_flags = WINED3D_BIND_DEPTH_STENCIL;
texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
texture_desc.width = swapchain->desc.backbuffer_width;
texture_desc.height = swapchain->desc.backbuffer_height;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 37d2aab20bc..545e1bff9f5 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -13213,6 +13213,7 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
desc.multisample_type = src_texture->resource.multisample_type;
desc.multisample_quality = src_texture->resource.multisample_quality;
desc.usage = WINED3DUSAGE_PRIVATE;
+ desc.bind_flags = 0;
desc.access = WINED3D_RESOURCE_ACCESS_GPU;
desc.width = wined3d_texture_get_level_width(src_texture, src_level);
desc.height = wined3d_texture_get_level_height(src_texture, src_level);
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index a1b2cbd2a0f..320d54c731d 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -289,6 +289,7 @@ void CDECL wined3d_resource_get_desc(const struct wined3d_resource *resource, st
desc->multisample_type = resource->multisample_type;
desc->multisample_quality = resource->multisample_quality;
desc->usage = resource->usage;
+ desc->bind_flags = resource->bind_flags;
desc->access = resource->access;
desc->width = resource->width;
desc->height = resource->height;
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 21375dd026f..122c643150f 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -634,6 +634,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
desc.multisample_type = WINED3D_MULTISAMPLE_NONE;
desc.multisample_quality = 0;
desc.usage = WINED3DUSAGE_SCRATCH | WINED3DUSAGE_PRIVATE;
+ desc.bind_flags = 0;
desc.access = WINED3D_RESOURCE_ACCESS_CPU | WINED3D_RESOURCE_ACCESS_MAP_R | WINED3D_RESOURCE_ACCESS_MAP_W;
desc.width = wined3d_texture_get_level_width(src_texture, texture_level);
desc.height = wined3d_texture_get_level_height(src_texture, texture_level);
@@ -2146,6 +2147,7 @@ static DWORD ffp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
desc.multisample_type = src_texture->resource.multisample_type;
desc.multisample_quality = src_texture->resource.multisample_quality;
desc.usage = WINED3DUSAGE_PRIVATE;
+ desc.bind_flags = 0;
desc.access = WINED3D_RESOURCE_ACCESS_GPU;
desc.width = wined3d_texture_get_level_width(src_texture, src_level);
desc.height = wined3d_texture_get_level_height(src_texture, src_level);
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 8de88714d10..768d27fd674 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -836,6 +836,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
texture_desc.usage = 0;
if (device->wined3d->flags & WINED3D_NO3D)
texture_desc.usage |= WINED3DUSAGE_OWNDC;
+ texture_desc.bind_flags = 0;
texture_desc.access = WINED3D_RESOURCE_ACCESS_GPU;
texture_desc.width = swapchain->desc.backbuffer_width;
texture_desc.height = swapchain->desc.backbuffer_height;
@@ -919,6 +920,11 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
texture_desc.usage = swapchain->desc.backbuffer_usage;
if (device->wined3d->flags & WINED3D_NO3D)
texture_desc.usage |= WINED3DUSAGE_OWNDC;
+ texture_desc.bind_flags = 0;
+ if (texture_desc.usage & WINED3DUSAGE_RENDERTARGET)
+ texture_desc.bind_flags |= WINED3D_BIND_RENDER_TARGET;
+ if (texture_desc.usage & WINED3DUSAGE_TEXTURE)
+ texture_desc.bind_flags |= WINED3D_BIND_SHADER_RESOURCE;
for (i = 0; i < swapchain->desc.backbuffer_count; ++i)
{
TRACE("Creating back buffer %u.\n", i);
@@ -944,6 +950,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
texture_desc.format = swapchain->desc.auto_depth_stencil_format;
texture_desc.usage = WINED3DUSAGE_DEPTHSTENCIL;
+ texture_desc.bind_flags = WINED3D_BIND_DEPTH_STENCIL;
if (FAILED(hr = device->device_parent->ops->create_swapchain_texture(device->device_parent,
device->device_parent, &texture_desc, texture_flags, &ds)))
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 87998d5552e..a98c0af231b 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -2996,7 +2996,7 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
return WINED3DERR_INVALIDCALL;
if (FAILED(hr = resource_init(&texture->resource, device, desc->resource_type, format,
- desc->multisample_type, desc->multisample_quality, desc->usage, 0, desc->access,
+ desc->multisample_type, desc->multisample_quality, desc->usage, desc->bind_flags, desc->access,
desc->width, desc->height, desc->depth, offset, parent, parent_ops, &texture_resource_ops)))
{
static unsigned int once;
@@ -3512,6 +3512,7 @@ HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture
desc->multisample_type = resource->multisample_type;
desc->multisample_quality = resource->multisample_quality;
desc->usage = resource->usage;
+ desc->bind_flags = resource->bind_flags;
desc->access = resource->access;
level_idx = sub_resource_idx % texture->level_count;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 1b3a46e6567..7dc47e63d5a 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1767,6 +1767,7 @@ struct wined3d_resource_desc
enum wined3d_multisample_type multisample_type;
unsigned int multisample_quality;
unsigned int usage;
+ unsigned int bind_flags;
unsigned int access;
unsigned int width;
unsigned int height;
@@ -1780,6 +1781,7 @@ struct wined3d_sub_resource_desc
enum wined3d_multisample_type multisample_type;
unsigned int multisample_quality;
unsigned int usage;
+ unsigned int bind_flags;
unsigned int access;
unsigned int width;
unsigned int height;
--
2.11.0
Oct. 31, 2018
Re: [PATCH v4 1/2] dinput/tests: Ensure the same GUID for Instance and Product
by Marvin
Hi,
While running your changed tests on Windows, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=43706
Your paranoid android.
=== debian9 (32 bit Wine report) ===
dinput8:
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:387: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:387: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput:
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:402: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:402: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
=== debian9 (build log) ===
=== debian9 (32 bit WoW Wine report) ===
dinput8:
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:387: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:387: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput:
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:402: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:402: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
=== debian9 (64 bit Wow Wine report) ===
dinput8:
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:387: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:387: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:387: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput:
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:402: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
dinput.c:402: Test failed: Keyboard guidInstance ({6f1d2b61-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({0ab8648a-7735-11d2-8c73-71df54a96441})
dinput.c:402: Test failed: Mouse guidInstance ({6f1d2b60-d5a0-11cf-bfc7-444553540000}) does not match guidProduct ({9e573ed8-7734-11d2-8d4a-23903fb6bdf7})
=== debian9 (build log) ===
Oct. 31, 2018
[PATCH] crypt32: Add CryptSetKeyIdentifierProperty stub.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/crypt32/cert.c | 8 ++++++++
dlls/crypt32/crypt32.spec | 1 +
2 files changed, 9 insertions(+)
diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c
index d09d049b8b..a7a2605e6b 100644
--- a/dlls/crypt32/cert.c
+++ b/dlls/crypt32/cert.c
@@ -3681,3 +3681,11 @@ const void * WINAPI CertCreateContext(DWORD dwContextType, DWORD dwEncodingType,
return NULL;
}
}
+
+BOOL WINAPI CryptSetKeyIdentifierProperty(const CRYPT_HASH_BLOB *pKeyIdentifier, DWORD dwPropId,
+ DWORD dwFlags, LPCWSTR pwszComputerName, void *pvReserved, const void *pvData)
+{
+ FIXME("(%p, 0x%x, 0x%x, %s, %p, %p): stub\n", pKeyIdentifier, dwPropId, dwFlags,
+ debugstr_w(pwszComputerName), pvReserved, pvData);
+ return FALSE;
+}
diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec
index 64d5aa93fd..fc32570b52 100644
--- a/dlls/crypt32/crypt32.spec
+++ b/dlls/crypt32/crypt32.spec
@@ -180,6 +180,7 @@
@ stdcall CryptSIPRetrieveSubjectGuidForCatalogFile(wstr long ptr)
@ stdcall CryptSIPVerifyIndirectData(ptr ptr)
@ stub CryptSetAsyncParam
+@ stdcall CryptSetKeyIdentifierProperty(ptr long long wstr ptr ptr)
@ stdcall CryptSetOIDFunctionValue(long str str wstr long ptr long)
@ stub CryptSetProviderU
@ stdcall CryptSignAndEncodeCertificate(long long long str ptr ptr ptr ptr ptr)
--
2.17.1
Oct. 31, 2018
[PATCH v4 2/2] dinput: Use the same GUID for Instance and Product
by Brendan McGrath
This matches the behaviour of DirectInput8 native and appears to be
required for some games to recognise the mouse and keyboard as
a mouse and keyboard.
Signed-off-by: Brendan McGrath <brendan(a)redmandi.com>
---
Changes since v3:
- fix test output on failure (was printing guidProduct twice)
dlls/dinput/device_private.h | 3 ---
dlls/dinput/dinput_main.c | 6 ++----
dlls/dinput/keyboard.c | 11 +++--------
dlls/dinput/mouse.c | 11 +++--------
4 files changed, 8 insertions(+), 23 deletions(-)
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 52bbec4490..d9e2997eaa 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -114,9 +114,6 @@ typedef struct
LPDIRECTINPUTEFFECT ref;
} effect_list_item;
-extern const GUID DInput_Wine_Keyboard_GUID DECLSPEC_HIDDEN;
-extern const GUID DInput_Wine_Mouse_GUID DECLSPEC_HIDDEN;
-
/* Various debug tools */
extern void _dump_DIPROPHEADER(LPCDIPROPHEADER diph) DECLSPEC_HIDDEN;
extern void _dump_OBJECTINSTANCEA(const DIDEVICEOBJECTINSTANCEA *ddoi) DECLSPEC_HIDDEN;
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 28e192af4e..6ed764e748 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1747,12 +1747,10 @@ static DWORD WINAPI hook_thread_proc(void *param)
{
if (!dev->acquired || !dev->event_proc) continue;
- if (IsEqualGUID( &dev->guid, &GUID_SysKeyboard ) ||
- IsEqualGUID( &dev->guid, &DInput_Wine_Keyboard_GUID ))
+ if (IsEqualGUID( &dev->guid, &GUID_SysKeyboard ))
kbd_cnt++;
else
- if (IsEqualGUID( &dev->guid, &GUID_SysMouse ) ||
- IsEqualGUID( &dev->guid, &DInput_Wine_Mouse_GUID ))
+ if (IsEqualGUID( &dev->guid, &GUID_SysMouse ))
mice_cnt++;
}
LeaveCriticalSection( &dinput->crit );
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index a64c59c603..642d0c0beb 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -145,10 +145,6 @@ static int KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
return ret;
}
-const GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441 */
- 0x0ab8648a, 0x7735, 0x11d2, {0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
-};
-
static DWORD get_keyboard_subtype(void)
{
DWORD kbd_type, kbd_subtype, dev_subtype;
@@ -179,7 +175,7 @@ static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD ver
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysKeyboard;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
else
@@ -203,7 +199,7 @@ static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysKeyboard;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
else
@@ -308,8 +304,7 @@ static HRESULT keyboarddev_create_device(IDirectInputImpl *dinput, REFGUID rguid
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
- if (IsEqualGUID(&GUID_SysKeyboard, rguid) || /* Generic Keyboard */
- IsEqualGUID(&DInput_Wine_Keyboard_GUID, rguid)) /* Wine Keyboard */
+ if (IsEqualGUID(&GUID_SysKeyboard, rguid)) /* Wine Keyboard */
{
SysKeyboardImpl *This;
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 6d3eff5d52..7133359351 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -93,10 +93,6 @@ static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysMouseImpl
static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam );
-const GUID DInput_Wine_Mouse_GUID = { /* 9e573ed8-7734-11d2-8d4a-23903fb6bdf7 */
- 0x9e573ed8, 0x7734, 0x11d2, {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
-};
-
static void _dump_mouse_state(const DIMOUSESTATE2 *m_state)
{
int i;
@@ -121,7 +117,7 @@ static void fill_mouse_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD versio
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysMouse;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
else
@@ -145,7 +141,7 @@ static void fill_mouse_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD versio
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysMouse;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
else
@@ -257,8 +253,7 @@ static HRESULT mousedev_create_device(IDirectInputImpl *dinput, REFGUID rguid, R
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
- if (IsEqualGUID(&GUID_SysMouse, rguid) || /* Generic Mouse */
- IsEqualGUID(&DInput_Wine_Mouse_GUID, rguid)) /* Wine Mouse */
+ if (IsEqualGUID(&GUID_SysMouse, rguid)) /* Wine Mouse */
{
SysMouseImpl *This;
--
2.17.1
Oct. 31, 2018
[PATCH v4 1/2] dinput/tests: Ensure the same GUID for Instance and Product
by Brendan McGrath
These tests ensure the Instance GUID and Product GUIDs are the same
for keyboard and mouse.
Signed-off-by: Brendan McGrath <brendan(a)redmandi.com>
---
Changes since v3:
- fix test output on failure (was printing guidProduct twice)
dlls/dinput/tests/dinput.c | 13 +++++++++++++
dlls/dinput8/tests/dinput.c | 13 +++++++++++++
2 files changed, 26 insertions(+)
diff --git a/dlls/dinput/tests/dinput.c b/dlls/dinput/tests/dinput.c
index 7e2da9ff32..6eec038a35 100644
--- a/dlls/dinput/tests/dinput.c
+++ b/dlls/dinput/tests/dinput.c
@@ -392,6 +392,19 @@ static BOOL CALLBACK enum_devices_callback(const DIDEVICEINSTANCEA *instance, vo
{
struct enum_devices_test *enum_test = context;
+ if ((instance->dwDevType & 0xff) == DIDEVTYPE_KEYBOARD ||
+ (instance->dwDevType & 0xff) == DIDEVTYPE_MOUSE) {
+ const char *device = ((instance->dwDevType & 0xff) ==
+ DIDEVTYPE_KEYBOARD) ? "Keyboard" : "Mouse";
+ int cmp = memcmp(&instance->guidInstance,
+ &instance->guidProduct,
+ sizeof(instance->guidInstance));
+ ok(cmp == 0, "%s guidInstance (%s) does not match guidProduct (%s)\n",
+ device,
+ wine_dbgstr_guid(&instance->guidInstance),
+ wine_dbgstr_guid(&instance->guidProduct));
+ }
+
enum_test->device_count++;
return enum_test->return_value;
}
diff --git a/dlls/dinput8/tests/dinput.c b/dlls/dinput8/tests/dinput.c
index b093437096..4eabb58c61 100644
--- a/dlls/dinput8/tests/dinput.c
+++ b/dlls/dinput8/tests/dinput.c
@@ -377,6 +377,19 @@ static BOOL CALLBACK enum_devices_callback(const DIDEVICEINSTANCEA *instance, vo
instance->wUsagePage,
instance->wUsage);
+ if ((instance->dwDevType & 0xff) == DI8DEVTYPE_KEYBOARD ||
+ (instance->dwDevType & 0xff) == DI8DEVTYPE_MOUSE) {
+ const char *device = ((instance->dwDevType & 0xff) ==
+ DI8DEVTYPE_KEYBOARD) ? "Keyboard" : "Mouse";
+ int cmp = memcmp(&instance->guidInstance,
+ &instance->guidProduct,
+ sizeof(instance->guidInstance));
+ ok(cmp == 0, "%s guidInstance (%s) does not match guidProduct (%s)\n",
+ device,
+ wine_dbgstr_guid(&instance->guidInstance),
+ wine_dbgstr_guid(&instance->guidProduct));
+ }
+
enum_test->device_count++;
return enum_test->return_value;
}
--
2.17.1
Oct. 31, 2018
[PATCH] testbot/build: Fix a typo in WineReconfig.pl.
by Francois Gouget
The build is now derived directly from the mission.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
I have updated the debian9 VM already so no patch has been impacted.
testbot/bin/build/WineReconfig.pl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/build/WineReconfig.pl b/testbot/bin/build/WineReconfig.pl
index 53ce319032..898f72c5b6 100755
--- a/testbot/bin/build/WineReconfig.pl
+++ b/testbot/bin/build/WineReconfig.pl
@@ -108,12 +108,12 @@ sub UpdateWinePrefixes($)
{
next if ($Mission->{test} eq "build");
- SetupWineEnvironment($Build);
+ SetupWineEnvironment($Mission->{Build});
InfoMsg "\nRecreating the $Mission->{Build} wineprefix\n";
# Wait for the wineprefix creation to complete so it is really done
# before the snapshot gets updated.
- my $ErrMessage = CreateWinePrefix($Build, "wait");
+ my $ErrMessage = CreateWinePrefix($Mission->{Build}, "wait");
if (defined $ErrMessage)
{
LogMsg "$ErrMessage\n";
--
2.19.1
Oct. 31, 2018
[PATCH 2/2] rpcrt4: Avoid reference leaks when unmarshalling [in, out] interface pointers.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/rpcrt4/ndr_ole.c | 10 ++++++++--
dlls/rpcrt4/tests/ndr_marshall.c | 2 --
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/dlls/rpcrt4/ndr_ole.c b/dlls/rpcrt4/ndr_ole.c
index 8608691231..c8026c0ff1 100644
--- a/dlls/rpcrt4/ndr_ole.c
+++ b/dlls/rpcrt4/ndr_ole.c
@@ -338,19 +338,25 @@ unsigned char * WINAPI NdrInterfacePointerUnmarshall(PMIDL_STUB_MESSAGE pStubMsg
PFORMAT_STRING pFormat,
unsigned char fMustAlloc)
{
+ IUnknown **unk = (IUnknown **)ppMemory;
LPSTREAM stream;
HRESULT hr;
TRACE("(%p,%p,%p,%d)\n", pStubMsg, ppMemory, pFormat, fMustAlloc);
if (!LoadCOM()) return NULL;
- *(LPVOID*)ppMemory = NULL;
+
+ /* Avoid reference leaks for [in, out] pointers. */
+ if (pStubMsg->IsClient && *unk)
+ IUnknown_Release(*unk);
+
+ *unk = NULL;
if (pStubMsg->Buffer + sizeof(DWORD) < (unsigned char *)pStubMsg->RpcMsg->Buffer + pStubMsg->BufferLength) {
ULONG size;
hr = RpcStream_Create(pStubMsg, FALSE, &size, &stream);
if (hr == S_OK) {
if (size != 0)
- hr = COM_UnmarshalInterface(stream, &IID_NULL, (LPVOID*)ppMemory);
+ hr = COM_UnmarshalInterface(stream, &IID_NULL, (void **)unk);
IStream_Release(stream);
}
diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c
index 5da03e2ef7..d436b42648 100644
--- a/dlls/rpcrt4/tests/ndr_marshall.c
+++ b/dlls/rpcrt4/tests/ndr_marshall.c
@@ -1327,9 +1327,7 @@ static void test_iface_ptr(void)
ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
ok(!my_free_called, "free called %d\n", my_free_called);
ok(server_obj.ref > 1, "got %d references\n", server_obj.ref);
-todo_wine
ok(client_obj.ref == 1, "got %d references\n", client_obj.ref);
-client_obj.ref = 1;
hr = IPersist_GetClassID(proxy, &clsid);
ok(hr == S_OK, "got hr %#x\n", hr);
--
2.19.1
Oct. 30, 2018
[PATCH 1/2] rpcrt4: Add some tests for marshalling interface pointers.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/rpcrt4/tests/ndr_marshall.c | 276 +++++++++++++++++++++++++++++++
1 file changed, 276 insertions(+)
diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c
index de2fd0151a..5da03e2ef7 100644
--- a/dlls/rpcrt4/tests/ndr_marshall.c
+++ b/dlls/rpcrt4/tests/ndr_marshall.c
@@ -21,6 +21,7 @@
#define _WIN32_WINNT 0x0500
#define NTDDI_WIN2K 0x05000000
#define NTDDI_VERSION NTDDI_WIN2K /* for some MIDL_STUB_MESSAGE fields */
+#define COBJMACROS
#include <stdarg.h>
@@ -1173,6 +1174,280 @@ static void test_simple_struct(void)
test_pointer_marshal(fmtstr_pointer_struct, &ps1, 17, wiredata, 21, ps1_cmp, 2, "pointer_struct");
}
+struct testiface
+{
+ IPersist IPersist_iface;
+ LONG ref;
+};
+
+static struct testiface *impl_from_IPersist(IPersist *iface)
+{
+ return CONTAINING_RECORD(iface, struct testiface, IPersist_iface);
+}
+
+static HRESULT WINAPI test_persist_QueryInterface(IPersist *iface, REFIID iid, void **out)
+{
+ if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IPersist))
+ {
+ *out = iface;
+ IPersist_AddRef(iface);
+ return S_OK;
+ }
+
+ *out = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI test_persist_AddRef(IPersist *iface)
+{
+ struct testiface *unk = impl_from_IPersist(iface);
+ return ++unk->ref;
+}
+
+static ULONG WINAPI test_persist_Release(IPersist *iface)
+{
+ struct testiface *unk = impl_from_IPersist(iface);
+ return --unk->ref;
+}
+
+static HRESULT WINAPI test_persist_GetClassId(IPersist *iface, GUID *clsid)
+{
+ *clsid = IID_IPersist;
+ return S_OK;
+}
+
+static IPersistVtbl testiface_vtbl = {
+ test_persist_QueryInterface,
+ test_persist_AddRef,
+ test_persist_Release,
+ test_persist_GetClassId,
+};
+
+static void test_iface_ptr(void)
+{
+ struct testiface server_obj = {{&testiface_vtbl}, 1};
+ struct testiface client_obj = {{&testiface_vtbl}, 1};
+
+ MIDL_STUB_MESSAGE StubMsg;
+ MIDL_STUB_DESC StubDesc;
+ RPC_MESSAGE RpcMessage;
+ IPersist *proxy;
+ HRESULT hr;
+ GUID clsid;
+ void *ptr;
+ LONG ref;
+
+ static const unsigned char fmtstr_ip[] =
+ {
+ FC_IP,
+ FC_CONSTANT_IID,
+ NdrFcLong(0x0000010c),
+ NdrFcShort(0x0000),
+ NdrFcShort(0x0000),
+ 0xc0,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x46,
+ };
+
+ CoInitialize(NULL);
+
+ StubDesc = Object_StubDesc;
+ StubDesc.pFormatTypes = fmtstr_ip;
+
+ NdrClientInitializeNew(&RpcMessage, &StubMsg, &StubDesc, 0);
+ StubMsg.BufferLength = 0;
+ NdrInterfacePointerBufferSize(&StubMsg, (unsigned char *)&client_obj.IPersist_iface, fmtstr_ip);
+
+ StubMsg.RpcMsg->Buffer = StubMsg.BufferStart = StubMsg.Buffer = HeapAlloc(GetProcessHeap(), 0, StubMsg.BufferLength);
+ StubMsg.BufferEnd = StubMsg.BufferStart + StubMsg.BufferLength;
+
+ /* server -> client */
+
+ StubMsg.IsClient = 0;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ IPersist_AddRef(&server_obj.IPersist_iface);
+ ptr = NdrInterfacePointerMarshall(&StubMsg, (unsigned char *)&server_obj.IPersist_iface, fmtstr_ip);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(server_obj.ref > 2, "got %d references\n", server_obj.ref);
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+
+ NdrInterfacePointerFree(&StubMsg, (unsigned char *)&server_obj.IPersist_iface, fmtstr_ip);
+ ok(server_obj.ref > 1, "got %d references\n", server_obj.ref);
+
+ StubMsg.IsClient = 1;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ proxy = NULL;
+ ptr = NdrInterfacePointerUnmarshall(&StubMsg, (unsigned char **)&proxy, fmtstr_ip, 0);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(!!proxy, "mem not alloced\n");
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+ ok(server_obj.ref > 1, "got %d references\n", server_obj.ref);
+
+ hr = IPersist_GetClassID(proxy, &clsid);
+ ok(hr == S_OK, "got hr %#x\n", hr);
+ ok(IsEqualGUID(&clsid, &IID_IPersist), "wrong clsid %s\n", wine_dbgstr_guid(&clsid));
+
+ ref = IPersist_Release(proxy);
+ ok(ref == 1, "got %d references\n", ref);
+ ok(server_obj.ref == 1, "got %d references\n", server_obj.ref);
+
+ /* An existing interface pointer is released; this is necessary so that an
+ * [in, out] pointer which changes does not leak references. */
+
+ StubMsg.IsClient = 0;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ IPersist_AddRef(&server_obj.IPersist_iface);
+ ptr = NdrInterfacePointerMarshall(&StubMsg, (unsigned char *)&server_obj.IPersist_iface, fmtstr_ip);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(server_obj.ref > 2, "got %d references\n", server_obj.ref);
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+
+ NdrInterfacePointerFree(&StubMsg, (unsigned char *)&server_obj.IPersist_iface, fmtstr_ip);
+ ok(server_obj.ref > 1, "got %d references\n", server_obj.ref);
+
+ StubMsg.IsClient = 1;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ proxy = &client_obj.IPersist_iface;
+ IPersist_AddRef(proxy);
+ ptr = NdrInterfacePointerUnmarshall(&StubMsg, (unsigned char **)&proxy, fmtstr_ip, 0);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(!!proxy && proxy != &client_obj.IPersist_iface, "mem not alloced\n");
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+ ok(server_obj.ref > 1, "got %d references\n", server_obj.ref);
+todo_wine
+ ok(client_obj.ref == 1, "got %d references\n", client_obj.ref);
+client_obj.ref = 1;
+
+ hr = IPersist_GetClassID(proxy, &clsid);
+ ok(hr == S_OK, "got hr %#x\n", hr);
+ ok(IsEqualGUID(&clsid, &IID_IPersist), "wrong clsid %s\n", wine_dbgstr_guid(&clsid));
+
+ ref = IPersist_Release(proxy);
+ ok(ref == 1, "got %d references\n", ref);
+ ok(server_obj.ref == 1, "got %d references\n", server_obj.ref);
+
+ /* client -> server */
+
+ StubMsg.IsClient = 1;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ IPersist_AddRef(&client_obj.IPersist_iface);
+ ptr = NdrInterfacePointerMarshall(&StubMsg, (unsigned char *)&client_obj.IPersist_iface, fmtstr_ip);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(client_obj.ref > 2, "got %d references\n", client_obj.ref);
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+
+ StubMsg.IsClient = 0;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ proxy = NULL;
+ ptr = NdrInterfacePointerUnmarshall(&StubMsg, (unsigned char **)&proxy, fmtstr_ip, 0);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(!!proxy, "mem not alloced\n");
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+ ok(client_obj.ref > 2, "got %d references\n", client_obj.ref);
+
+ hr = IPersist_GetClassID(proxy, &clsid);
+ ok(hr == S_OK, "got hr %#x\n", hr);
+ ok(IsEqualGUID(&clsid, &IID_IPersist), "wrong clsid %s\n", wine_dbgstr_guid(&clsid));
+
+ ref = IPersist_Release(proxy);
+ ok(client_obj.ref > 1, "got %d references\n", client_obj.ref);
+ ok(ref == client_obj.ref, "expected %d references, got %d\n", client_obj.ref, ref);
+
+ NdrInterfacePointerFree(&StubMsg, (unsigned char *)proxy, fmtstr_ip);
+ ok(client_obj.ref == 1, "got %d references\n", client_obj.ref);
+
+ /* same, but free the interface after calling NdrInterfacePointerFree */
+
+ StubMsg.IsClient = 1;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ IPersist_AddRef(&client_obj.IPersist_iface);
+ ptr = NdrInterfacePointerMarshall(&StubMsg, (unsigned char *)&client_obj.IPersist_iface, fmtstr_ip);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(client_obj.ref > 2, "got %d references\n", client_obj.ref);
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+
+ StubMsg.IsClient = 0;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ proxy = NULL;
+ ptr = NdrInterfacePointerUnmarshall(&StubMsg, (unsigned char **)&proxy, fmtstr_ip, 0);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(!!proxy, "mem not alloced\n");
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+ ok(client_obj.ref > 2, "got %d references\n", client_obj.ref);
+
+ NdrInterfacePointerFree(&StubMsg, (unsigned char *)proxy, fmtstr_ip);
+ ok(client_obj.ref > 1, "got %d references\n", client_obj.ref);
+
+ hr = IPersist_GetClassID(proxy, &clsid);
+ ok(hr == S_OK, "got hr %#x\n", hr);
+ ok(IsEqualGUID(&clsid, &IID_IPersist), "wrong clsid %s\n", wine_dbgstr_guid(&clsid));
+
+ ref = IPersist_Release(proxy);
+ ok(ref == 1, "got %d references\n", ref);
+ ok(client_obj.ref == 1, "got %d references\n", client_obj.ref);
+
+ /* An existing interface pointer is *not* released (in fact, it is ignored
+ * and may be invalid). In practice it will always be NULL anyway. */
+
+ StubMsg.IsClient = 1;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ IPersist_AddRef(&client_obj.IPersist_iface);
+ ptr = NdrInterfacePointerMarshall(&StubMsg, (unsigned char *)&client_obj.IPersist_iface, fmtstr_ip);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(client_obj.ref > 2, "got %d references\n", client_obj.ref);
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+
+ StubMsg.IsClient = 0;
+ my_alloc_called = my_free_called = 0;
+ StubMsg.Buffer = StubMsg.BufferStart;
+ proxy = &server_obj.IPersist_iface;
+ IPersist_AddRef(proxy);
+ ptr = NdrInterfacePointerUnmarshall(&StubMsg, (unsigned char **)&proxy, fmtstr_ip, 0);
+ ok(!ptr, "ret %p\n", ptr);
+ ok(!!proxy && proxy != &server_obj.IPersist_iface, "mem not alloced\n");
+ ok(!my_alloc_called, "alloc called %d\n", my_alloc_called);
+ ok(!my_free_called, "free called %d\n", my_free_called);
+ ok(client_obj.ref > 2, "got %d references\n", client_obj.ref);
+ ok(server_obj.ref == 2, "got %d references\n", server_obj.ref);
+ IPersist_Release(&server_obj.IPersist_iface);
+
+ hr = IPersist_GetClassID(proxy, &clsid);
+ ok(hr == S_OK, "got hr %#x\n", hr);
+ ok(IsEqualGUID(&clsid, &IID_IPersist), "wrong clsid %s\n", wine_dbgstr_guid(&clsid));
+
+ ref = IPersist_Release(proxy);
+ ok(client_obj.ref > 1, "got %d references\n", client_obj.ref);
+ ok(ref == client_obj.ref, "expected %d references, got %d\n", client_obj.ref, ref);
+
+ NdrInterfacePointerFree(&StubMsg, (unsigned char *)proxy, fmtstr_ip);
+ ok(client_obj.ref == 1, "got %d references\n", client_obj.ref);
+
+ CoUninitialize();
+}
+
static void test_fullpointer_xlat(void)
{
PFULL_PTR_XLAT_TABLES pXlatTables;
@@ -2635,6 +2910,7 @@ START_TEST( ndr_marshall )
test_simple_types();
test_nontrivial_pointer_types();
test_simple_struct();
+ test_iface_ptr();
test_fullpointer_xlat();
test_client_init();
test_server_init();
--
2.19.1
Oct. 30, 2018