Wine-devel
Threads by month
- ----- 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
- 608 discussions
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/comctl32/edit.c | 2 --
include/commctrl.h | 7 +++++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c
index aeba9f73e7..249e08b3a1 100644
--- a/dlls/comctl32/edit.c
+++ b/dlls/comctl32/edit.c
@@ -23,9 +23,7 @@
*
* TODO:
* - EDITBALLOONTIP structure
- * - EM_GETCUEBANNER/Edit_GetCueBannerText
* - EM_HIDEBALLOONTIP/Edit_HideBalloonTip
- * - EM_SETCUEBANNER/Edit_SetCueBannerText
* - EM_SHOWBALLOONTIP/Edit_ShowBalloonTip
* - EM_GETIMESTATUS, EM_SETIMESTATUS
* - EN_ALIGN_LTR_EC
diff --git a/include/commctrl.h b/include/commctrl.h
index 77f460a99d..aed91809d6 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -5259,6 +5259,13 @@ typedef struct _tagEDITBALLOONTIP
#define EM_NOSETFOCUS (ECM_FIRST + 7)
#define EM_TAKEFOCUS (ECM_FIRST + 8)
+#define Edit_SetCueBannerText(hwnd, text) \
+ (BOOL)SNDMSG((hwnd), EM_SETCUEBANNER, 0, (LPARAM)(text))
+#define Edit_SetCueBannerTextFocused(hwnd, text, drawfocused) \
+ (BOOL)SNDMSG((hwnd), EM_SETCUEBANNER, (WPARAM)drawfocused, (LPARAM)text)
+#define Edit_GetCueBannerText(hwnd, buff, buff_size) \
+ (BOOL)SNDMSG((hwnd), EM_GETCUEBANNER, (WPARAM)(buff), (LPARAM)(buff_size))
+
/**************************************************************************
* Listbox control
*/
--
2.19.1
1
1
[PATCH] crypt32: CryptFreeOIDFunctionAddress should not unload a registered module.
by Dmitry Timoshkov 31 Oct '18
by Dmitry Timoshkov 31 Oct '18
31 Oct '18
MSDN states that hModule passed to CryptInstallOIDFunctionAddress() should be
used to prevent this module to be unloaded by CryptFreeOIDFunctionAddress in
case the provider's DLL uses CryptRegisterOIDFunction to add its own entries.
This patch fixes a crash that is caused by exactly this scenario.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/crypt32/oid.c | 43 ++++++++++++++++++++++++++++++++++++++++---
1 file changed, 40 insertions(+), 3 deletions(-)
diff --git a/dlls/crypt32/oid.c b/dlls/crypt32/oid.c
index d6c411c791..6dc894e60c 100644
--- a/dlls/crypt32/oid.c
+++ b/dlls/crypt32/oid.c
@@ -59,6 +59,7 @@ struct OIDFunctionSet
struct OIDFunction
{
+ HMODULE hModule;
DWORD encoding;
CRYPT_OID_FUNC_ENTRY entry;
struct list next;
@@ -271,6 +272,7 @@ BOOL WINAPI CryptInstallOIDFunctionAddress(HMODULE hModule,
else
func->entry.pszOID = rgFuncEntry[i].pszOID;
func->entry.pvFuncAddr = rgFuncEntry[i].pvFuncAddr;
+ func->hModule = hModule;
list_add_tail(&set->functions, &func->next);
}
else
@@ -428,6 +430,38 @@ BOOL WINAPI CryptGetOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet,
return ret;
}
+static BOOL is_module_registered(HMODULE hModule)
+{
+ struct OIDFunctionSet *set;
+ BOOL ret = FALSE;
+
+ EnterCriticalSection(&funcSetCS);
+
+ LIST_FOR_EACH_ENTRY(set, &funcSets, struct OIDFunctionSet, next)
+ {
+ struct OIDFunction *function;
+
+ EnterCriticalSection(&set->cs);
+
+ LIST_FOR_EACH_ENTRY(function, &set->functions, struct OIDFunction, next)
+ {
+ if (function->hModule == hModule)
+ {
+ ret = TRUE;
+ break;
+ }
+ }
+
+ LeaveCriticalSection(&set->cs);
+
+ if (ret) break;
+ }
+
+ LeaveCriticalSection(&funcSetCS);
+
+ return ret;
+}
+
BOOL WINAPI CryptFreeOIDFunctionAddress(HCRYPTOIDFUNCADDR hFuncAddr,
DWORD dwFlags)
{
@@ -441,9 +475,12 @@ BOOL WINAPI CryptFreeOIDFunctionAddress(HCRYPTOIDFUNCADDR hFuncAddr,
{
struct FuncAddr *addr = hFuncAddr;
- CryptMemFree(addr->dllList);
- FreeLibrary(addr->lib);
- CryptMemFree(addr);
+ if (!is_module_registered(addr->lib))
+ {
+ CryptMemFree(addr->dllList);
+ FreeLibrary(addr->lib);
+ CryptMemFree(addr);
+ }
}
return TRUE;
}
--
2.17.1
1
0
31 Oct '18
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/font.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 5fc0de733d..6666249864 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -3883,6 +3883,8 @@ HRESULT create_font_collection(IDWriteFactory5 *factory, IDWriteFontFileEnumerat
if (FAILED(hr))
break;
}
+
+ IDWriteFontFileStream_Release(stream);
}
LIST_FOR_EACH_ENTRY_SAFE(fileenum, fileenum2, &scannedfiles, struct fontfile_enum, entry) {
--
2.19.1
1
0
[PATCH v4 1/2] dinput/tests: Ensure the same GUID for Instance and Product
by Brendan McGrath 31 Oct '18
by Brendan McGrath 31 Oct '18
31 Oct '18
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
2
4
[PATCH 5/5] wined3d: Validate format capabilities against the bind flags instead of the usage flags in resource_init().
by Henri Verbeet 31 Oct '18
by Henri Verbeet 31 Oct '18
31 Oct '18
Note that buffer resources don't have an inherent format, so validating bind
flags against WINED3DFMT_UNKNOWN doesn't make a lot of sense. This wasn't an
issue previously because d3d11 doesn't set the usage flags corresponding to
the bind flags for buffer resources, and earlier versions of D3D didn't allow
buffers to be used as e.g. shader resources.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/resource.c | 47 ++++++++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 512546d699b..ff584567975 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -107,28 +107,33 @@ HRESULT resource_init(struct wined3d_resource *resource, struct wined3d_device *
if (base_type == WINED3D_GL_RES_TYPE_COUNT)
base_type = gl_type;
- if ((usage & WINED3DUSAGE_RENDERTARGET) && !(format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET))
+ if (type != WINED3D_RTYPE_BUFFER)
{
- WARN("Format %s cannot be used for render targets.\n", debug_d3dformat(format->id));
- continue;
- }
- if ((usage & WINED3DUSAGE_DEPTHSTENCIL)
- && !(format->flags[gl_type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
- {
- WARN("Format %s cannot be used for depth/stencil buffers.\n", debug_d3dformat(format->id));
- continue;
- }
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
- && usage & (WINED3DUSAGE_RENDERTARGET | WINED3DUSAGE_DEPTHSTENCIL)
- && !(format->flags[gl_type] & WINED3DFMT_FLAG_FBO_ATTACHABLE))
- {
- WARN("Render target or depth stencil is not FBO attachable.\n");
- continue;
- }
- if ((usage & WINED3DUSAGE_TEXTURE) && !(format->flags[gl_type] & WINED3DFMT_FLAG_TEXTURE))
- {
- WARN("Format %s cannot be used for texturing.\n", debug_d3dformat(format->id));
- continue;
+ if ((bind_flags & WINED3D_BIND_RENDER_TARGET)
+ && !(format->flags[gl_type] & WINED3DFMT_FLAG_RENDERTARGET))
+ {
+ WARN("Format %s cannot be used for render targets.\n", debug_d3dformat(format->id));
+ continue;
+ }
+ if ((bind_flags & WINED3D_BIND_DEPTH_STENCIL)
+ && !(format->flags[gl_type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
+ {
+ WARN("Format %s cannot be used for depth/stencil buffers.\n", debug_d3dformat(format->id));
+ continue;
+ }
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
+ && bind_flags & (WINED3D_BIND_RENDER_TARGET | WINED3D_BIND_DEPTH_STENCIL)
+ && !(format->flags[gl_type] & WINED3DFMT_FLAG_FBO_ATTACHABLE))
+ {
+ WARN("Render target or depth stencil is not FBO attachable.\n");
+ continue;
+ }
+ if ((bind_flags & WINED3D_BIND_SHADER_RESOURCE)
+ && !(format->flags[gl_type] & WINED3DFMT_FLAG_TEXTURE))
+ {
+ WARN("Format %s cannot be used for texturing.\n", debug_d3dformat(format->id));
+ continue;
+ }
}
if (((width & (width - 1)) || (height & (height - 1)))
&& !d3d_info->texture_npot
--
2.11.0
1
0
31 Oct '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/buffer.c | 2 +-
dlls/wined3d/context.c | 14 +++++++-------
dlls/wined3d/directx.c | 14 +++++++-------
dlls/wined3d/resource.c | 4 ++--
dlls/wined3d/surface.c | 2 +-
dlls/wined3d/swapchain.c | 4 ++--
dlls/wined3d/texture.c | 8 ++++----
dlls/wined3d/utils.c | 4 ++--
dlls/wined3d/view.c | 6 +++---
dlls/wined3d/wined3d_private.h | 2 +-
10 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 4c90d820a89..020116da7f6 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1354,7 +1354,7 @@ static HRESULT wined3d_buffer_init(struct wined3d_buffer *buffer, struct wined3d
const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data,
void *parent, const struct wined3d_parent_ops *parent_ops)
{
- const struct wined3d_format *format = wined3d_get_format(device->adapter, WINED3DFMT_UNKNOWN, desc->usage);
+ const struct wined3d_format *format = wined3d_get_format(device->adapter, WINED3DFMT_UNKNOWN, desc->bind_flags);
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
struct wined3d_resource *resource = &buffer->resource;
BOOL dynamic_buffer_ok;
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 3446c8df9e9..9784f38c10b 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -2005,9 +2005,9 @@ BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
const struct wined3d_format *color_format;
const struct wined3d_d3d_info *d3d_info;
const struct wined3d_gl_info *gl_info;
+ unsigned int target_bind_flags;
BOOL aux_buffers = FALSE;
HGLRC ctx, share_ctx;
- DWORD target_usage;
unsigned int i;
gl_info = context->gl_info;
@@ -2052,7 +2052,7 @@ BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
return FALSE;
color_format = target->resource.format;
- target_usage = target->resource.usage;
+ target_bind_flags = target->resource.bind_flags;
/* In case of ORM_BACKBUFFER, make sure to request an alpha component for
* X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
@@ -2061,9 +2061,9 @@ BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
aux_buffers = TRUE;
if (color_format->id == WINED3DFMT_B4G4R4X4_UNORM)
- color_format = wined3d_get_format(device->adapter, WINED3DFMT_B4G4R4A4_UNORM, target_usage);
+ color_format = wined3d_get_format(device->adapter, WINED3DFMT_B4G4R4A4_UNORM, target_bind_flags);
else if (color_format->id == WINED3DFMT_B8G8R8X8_UNORM)
- color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_usage);
+ color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
}
/* DirectDraw supports 8bit paletted render targets and these are used by
@@ -2073,7 +2073,7 @@ BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
* For this reason we require a format with 8bit alpha, so request
* A8R8G8B8. */
if (color_format->id == WINED3DFMT_P8_UINT)
- color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_usage);
+ color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
/* When using FBOs for off-screen rendering, we only use the drawable for
* presentation blits, and don't do any rendering to it. That means we
@@ -2085,8 +2085,8 @@ BOOL wined3d_adapter_gl_create_context(struct wined3d_context *context,
* conflicting pixel formats. */
if (wined3d_settings.offscreen_rendering_mode != ORM_BACKBUFFER)
{
- color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_usage);
- ds_format = wined3d_get_format(device->adapter, WINED3DFMT_UNKNOWN, WINED3DUSAGE_DEPTHSTENCIL);
+ color_format = wined3d_get_format(device->adapter, WINED3DFMT_B8G8R8A8_UNORM, target_bind_flags);
+ ds_format = wined3d_get_format(device->adapter, WINED3DFMT_UNKNOWN, WINED3D_BIND_DEPTH_STENCIL);
}
/* Try to find a pixel format which matches our requirements. */
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 00bc737d3fe..a03465f8077 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -763,7 +763,7 @@ UINT CDECL wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT ad
return 0;
adapter = &wined3d->adapters[adapter_idx];
- format = wined3d_get_format(adapter, format_id, WINED3DUSAGE_RENDERTARGET);
+ format = wined3d_get_format(adapter, format_id, WINED3D_BIND_RENDER_TARGET);
format_bits = format->byte_count * CHAR_BIT;
memset(&mode, 0, sizeof(mode));
@@ -817,7 +817,7 @@ HRESULT CDECL wined3d_enum_adapter_modes(const struct wined3d *wined3d, UINT ada
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
- format = wined3d_get_format(adapter, format_id, WINED3DUSAGE_RENDERTARGET);
+ format = wined3d_get_format(adapter, format_id, WINED3D_BIND_RENDER_TARGET);
format_bits = format->byte_count * CHAR_BIT;
memset(&m, 0, sizeof(m));
@@ -1076,7 +1076,7 @@ HRESULT CDECL wined3d_set_adapter_display_mode(struct wined3d *wined3d,
TRACE("mode %ux%u@%u %s %#x.\n", mode->width, mode->height, mode->refresh_rate,
debug_d3dformat(mode->format_id), mode->scanline_ordering);
- format = wined3d_get_format(adapter, mode->format_id, WINED3DUSAGE_RENDERTARGET);
+ format = wined3d_get_format(adapter, mode->format_id, WINED3D_BIND_RENDER_TARGET);
new_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
new_mode.dmBitsPerPel = format->byte_count * CHAR_BIT;
@@ -1318,8 +1318,8 @@ HRESULT CDECL wined3d_check_depth_stencil_match(const struct wined3d *wined3d,
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
- rt_format = wined3d_get_format(adapter, render_target_format_id, WINED3DUSAGE_RENDERTARGET);
- ds_format = wined3d_get_format(adapter, depth_stencil_format_id, WINED3DUSAGE_DEPTHSTENCIL);
+ rt_format = wined3d_get_format(adapter, render_target_format_id, WINED3D_BIND_RENDER_TARGET);
+ ds_format = wined3d_get_format(adapter, depth_stencil_format_id, WINED3D_BIND_DEPTH_STENCIL);
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
if ((rt_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_RENDERTARGET)
@@ -1538,8 +1538,8 @@ HRESULT CDECL wined3d_check_device_format(const struct wined3d *wined3d, UINT ad
return WINED3DERR_INVALIDCALL;
adapter = &wined3d->adapters[adapter_idx];
- adapter_format = wined3d_get_format(adapter, adapter_format_id, WINED3DUSAGE_RENDERTARGET);
- format = wined3d_get_format(adapter, check_format_id, usage);
+ adapter_format = wined3d_get_format(adapter, adapter_format_id, WINED3D_BIND_RENDER_TARGET);
+ format = wined3d_get_format(adapter, check_format_id, bind_flags);
if (usage & WINED3DUSAGE_RENDERTARGET)
bind_flags |= WINED3D_BIND_RENDER_TARGET;
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 320d54c731d..512546d699b 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -487,6 +487,6 @@ const struct wined3d_format *wined3d_resource_get_decompress_format(const struct
const struct wined3d_adapter *adapter = resource->device->adapter;
if (resource->format_flags & (WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE)
&& !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL))
- return wined3d_get_format(adapter, WINED3DFMT_B8G8R8A8_UNORM_SRGB, resource->usage);
- return wined3d_get_format(adapter, WINED3DFMT_B8G8R8A8_UNORM, resource->usage);
+ return wined3d_get_format(adapter, WINED3DFMT_B8G8R8A8_UNORM_SRGB, resource->bind_flags);
+ return wined3d_get_format(adapter, WINED3DFMT_B8G8R8A8_UNORM, resource->bind_flags);
}
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 122c643150f..40d8974672e 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1614,7 +1614,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
format = texture->resource.format;
if ((conversion = wined3d_format_get_color_key_conversion(texture, TRUE)))
- format = wined3d_get_format(device->adapter, conversion->dst_format, texture->resource.usage);
+ format = wined3d_get_format(device->adapter, conversion->dst_format, texture->resource.bind_flags);
/* Don't use PBOs for converted surfaces. During PBO conversion we look at
* WINED3D_TEXTURE_CONVERTED but it isn't set (yet) in all cases it is
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 91f96a47a03..4ab1594f063 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -669,7 +669,7 @@ static void wined3d_swapchain_apply_sample_count_override(const struct wined3d_s
adapter = swapchain->device->adapter;
gl_info = &adapter->gl_info;
- if (!(format = wined3d_get_format(adapter, format_id, WINED3DUSAGE_RENDERTARGET)))
+ if (!(format = wined3d_get_format(adapter, format_id, WINED3D_BIND_RENDER_TARGET)))
return;
if ((t = min(wined3d_settings.sample_count, gl_info->limits.samples)))
@@ -726,7 +726,7 @@ static void wined3d_swapchain_cs_init(void *object)
* request a depth/stencil buffer in the likely case it's needed later. */
for (i = 0; i < ARRAY_SIZE(formats); ++i)
{
- swapchain->ds_format = wined3d_get_format(adapter, formats[i], WINED3DUSAGE_DEPTHSTENCIL);
+ swapchain->ds_format = wined3d_get_format(adapter, formats[i], WINED3D_BIND_DEPTH_STENCIL);
if ((swapchain->context[0] = context_create(swapchain, swapchain->front_buffer, swapchain->ds_format)))
break;
TRACE("Depth stencil format %s is not supported, trying next format.\n", debug_d3dformat(formats[i]));
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index a98c0af231b..45de4a10d1a 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -1575,7 +1575,7 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
device = texture->resource.device;
gl_info = &device->adapter->gl_info;
d3d_info = &device->adapter->d3d_info;
- format = wined3d_get_format(device->adapter, format_id, texture->resource.usage);
+ format = wined3d_get_format(device->adapter, format_id, texture->resource.bind_flags);
resource_size = wined3d_format_calculate_size(format, device->surface_alignment, width, height, 1);
if (!resource_size)
@@ -1774,7 +1774,7 @@ void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct win
else if ((conversion = wined3d_format_get_color_key_conversion(texture, TRUE)))
{
texture->flags |= WINED3D_TEXTURE_CONVERTED;
- format = wined3d_get_format(device->adapter, conversion->dst_format, resource->usage);
+ format = wined3d_get_format(device->adapter, conversion->dst_format, resource->bind_flags);
TRACE("Using format %s for color key conversion.\n", debug_d3dformat(format->id));
}
format_gl = wined3d_format_gl(format);
@@ -2896,7 +2896,7 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
WARN("Texture cannot be created with a format of WINED3DFMT_UNKNOWN.\n");
return WINED3DERR_INVALIDCALL;
}
- format = wined3d_get_format(device->adapter, desc->format, desc->usage);
+ format = wined3d_get_format(device->adapter, desc->format, desc->bind_flags);
if (desc->usage & WINED3DUSAGE_DYNAMIC && (wined3d_resource_access_is_managed(desc->access)
|| desc->usage & WINED3DUSAGE_SCRATCH))
@@ -3645,7 +3645,7 @@ HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct
if (desc->multisample_type != WINED3D_MULTISAMPLE_NONE)
{
- const struct wined3d_format *format = wined3d_get_format(device->adapter, desc->format, desc->usage);
+ const struct wined3d_format *format = wined3d_get_format(device->adapter, desc->format, desc->bind_flags);
if (desc->multisample_type == WINED3D_MULTISAMPLE_NON_MASKABLE
&& desc->multisample_quality >= wined3d_popcount(format->multisample_types))
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 0bc4a37df45..73e8cf25f78 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -4060,7 +4060,7 @@ fail:
}
const struct wined3d_format *wined3d_get_format(const struct wined3d_adapter *adapter,
- enum wined3d_format_id format_id, unsigned int resource_usage)
+ enum wined3d_format_id format_id, unsigned int bind_flags)
{
const struct wined3d_format *format;
int idx = get_format_idx(format_id);
@@ -4075,7 +4075,7 @@ const struct wined3d_format *wined3d_get_format(const struct wined3d_adapter *ad
format = get_format_by_idx(adapter, idx);
- if (resource_usage & WINED3DUSAGE_DEPTHSTENCIL && wined3d_format_is_typeless(format))
+ if (bind_flags & WINED3D_BIND_DEPTH_STENCIL && wined3d_format_is_typeless(format))
{
for (i = 0; i < ARRAY_SIZE(typeless_depth_stencil_formats); ++i)
{
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 59a30eadf53..1e0f49ffd07 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -87,7 +87,7 @@ static const struct wined3d_format *validate_resource_view(const struct wined3d_
const struct wined3d_adapter *adapter = resource->device->adapter;
const struct wined3d_format *format;
- format = wined3d_get_format(adapter, desc->format_id, resource->usage);
+ format = wined3d_get_format(adapter, desc->format_id, resource->bind_flags);
if (resource->type == WINED3D_RTYPE_BUFFER && (desc->flags & WINED3D_VIEW_BUFFER_RAW))
{
if (format->id != WINED3DFMT_R32_TYPELESS)
@@ -96,7 +96,7 @@ static const struct wined3d_format *validate_resource_view(const struct wined3d_
return NULL;
}
- format = wined3d_get_format(adapter, WINED3DFMT_R32_UINT, resource->usage);
+ format = wined3d_get_format(adapter, WINED3DFMT_R32_UINT, resource->bind_flags);
}
if (wined3d_format_is_typeless(format))
@@ -118,7 +118,7 @@ static const struct wined3d_format *validate_resource_view(const struct wined3d_
return NULL;
}
- format = wined3d_get_format(adapter, WINED3DFMT_R32_UINT, resource->usage);
+ format = wined3d_get_format(adapter, WINED3DFMT_R32_UINT, resource->bind_flags);
element_size = buffer->structure_byte_stride;
}
else
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 9a01ed29ff9..5b7ddfce10d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4425,7 +4425,7 @@ struct wined3d_format
};
const struct wined3d_format *wined3d_get_format(const struct wined3d_adapter *adapter,
- enum wined3d_format_id format_id, unsigned int resource_usage) DECLSPEC_HIDDEN;
+ enum wined3d_format_id format_id, unsigned int bind_flags) DECLSPEC_HIDDEN;
void wined3d_format_calculate_pitch(const struct wined3d_format *format, unsigned int alignment,
unsigned int width, unsigned int height, unsigned int *row_pitch, unsigned int *slice_pitch) DECLSPEC_HIDDEN;
UINT wined3d_format_calculate_size(const struct wined3d_format *format,
--
2.11.0
1
0
31 Oct '18
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
1
0
[PATCH 2/5] wined3d: Pass correct bind flags to swapchain creation functions.
by Henri Verbeet 31 Oct '18
by Henri Verbeet 31 Oct '18
31 Oct '18
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
1
0
[PATCH 1/5] wined3d: Pass correct bind flags to texture creation functions.
by Henri Verbeet 31 Oct '18
by Henri Verbeet 31 Oct '18
31 Oct '18
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
1
0
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
1
0