From: Kimmo Myllyvirta kimmo.myllyvirta@gmail.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
Rebased and modified.
Avoids excessive buffer swaps.
--- dlls/dxgi/swapchain.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 8e7dccbf9618..2983ec59438c 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -532,10 +532,16 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_Present1(IDXGISwapChain1 *iface, TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n", iface, sync_interval, flags, present_parameters);
+ if (flags & ~DXGI_PRESENT_TEST) + FIXME("Unimplemented flags %#x.\n", flags); + if (flags & DXGI_PRESENT_TEST) + { + WARN("Returning S_OK for DXGI_PRESENT_TEST.\n"); + return S_OK; + } + if (sync_interval) FIXME("Unimplemented sync interval %u.\n", sync_interval); - if (flags) - FIXME("Unimplemented flags %#x.\n", flags); if (present_parameters) FIXME("Ignored present parameters %p.\n", present_parameters);
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d8/device.c | 1 + dlls/d3d9/device.c | 2 +- dlls/ddraw/ddraw.c | 1 + dlls/dxgi/factory.c | 1 + dlls/wined3d/device.c | 3 +++ dlls/wined3d/swapchain.c | 2 +- include/wine/wined3d.h | 1 + 7 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 506961a215bd..e7577d707868 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -207,6 +207,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->multisample_type = present_parameters->MultiSampleType; swapchain_desc->multisample_quality = 0; /* d3d9 only */ swapchain_desc->swap_effect = present_parameters->SwapEffect; diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 51b4896353d8..0a76227f6dd1 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -229,6 +229,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->multisample_type = present_parameters->MultiSampleType; swapchain_desc->multisample_quality = present_parameters->MultiSampleQuality; swapchain_desc->swap_effect = present_parameters->SwapEffect; @@ -817,7 +818,6 @@ static HRESULT d3d9_device_reset(struct d3d9_device *device, struct wined3d_display_mode wined3d_mode; HRESULT hr;
- if (!extended && device->device_state == D3D9_DEVICE_STATE_LOST) { WARN("App not active, returning D3DERR_DEVICELOST.\n"); diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 27be401a2e57..5d1db804dc46 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -630,6 +630,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 = WINED3DUSAGE_RENDERTARGET; swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_COPY; swapchain_desc.device_window = window; swapchain_desc.windowed = windowed; diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c index f38d67ccff6d..0020917ca693 100644 --- a/dlls/dxgi/factory.c +++ b/dlls/dxgi/factory.c @@ -313,6 +313,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChainForHwnd(IDXGIFactor 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 = WINED3DUSAGE_RENDERTARGET; wined3d_sample_desc_from_dxgi(&wined3d_desc.multisample_type, &wined3d_desc.multisample_quality, &swapchain_desc->SampleDesc); wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD; diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index a25b98d74964..5bd8804c17da 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4732,6 +4732,9 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, TRACE("swap_interval %u\n", swapchain_desc->swap_interval); TRACE("auto_restore_display_mode %#x\n", swapchain_desc->auto_restore_display_mode);
+ if (swapchain_desc->backbuffer_usage != WINED3DUSAGE_RENDERTARGET) + FIXME("Got unexpected backbuffer usage %#x.\n", swapchain_desc->backbuffer_usage); + /* No special treatment of these parameters. Just store them */ swapchain->desc.swap_effect = swapchain_desc->swap_effect; swapchain->desc.enable_auto_depth_stencil = swapchain_desc->enable_auto_depth_stencil; diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index dd3655f61c46..f73931301cc7 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -920,7 +920,7 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3 goto err; }
- texture_desc.usage |= WINED3DUSAGE_RENDERTARGET; + texture_desc.usage = swapchain->desc.backbuffer_usage; 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 a519e94bb304..8c274926e0a3 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -1712,6 +1712,7 @@ struct wined3d_swapchain_desc UINT backbuffer_height; enum wined3d_format_id backbuffer_format; UINT backbuffer_count; + DWORD backbuffer_usage; enum wined3d_multisample_type multisample_type; DWORD multisample_quality; enum wined3d_swap_effect swap_effect;
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/dxgi/device.c | 11 +++++------ dlls/dxgi/dxgi_private.h | 6 ++++++ dlls/dxgi/factory.c | 2 +- dlls/dxgi/swapchain.c | 4 ++-- dlls/dxgi/utils.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index 2539ca272606..b61d5abdb50a 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -169,24 +169,23 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac UINT i; UINT j;
- TRACE("iface %p, desc %p, surface_count %u, usage %#x, shared_resource %p, surface %p\n", + TRACE("iface %p, desc %p, surface_count %u, usage %#x, shared_resource %p, surface %p.\n", iface, desc, surface_count, usage, shared_resource, surface);
hr = IWineDXGIDevice_QueryInterface(iface, &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent); if (FAILED(hr)) { - ERR("Device should implement IWineDXGIDeviceParent\n"); + ERR("Device should implement IWineDXGIDeviceParent.\n"); return E_FAIL; }
device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent);
- FIXME("Implement DXGI<->wined3d usage conversion\n"); surface_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D; 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 = usage; + surface_desc.usage = wined3d_usage_from_dxgi_usage(usage); surface_desc.pool = WINED3D_POOL_DEFAULT; surface_desc.width = desc->Width; surface_desc.height = desc->Height; @@ -212,11 +211,11 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac wined3d_texture_decref(wined3d_texture); if (FAILED(hr)) { - ERR("Surface should implement IDXGISurface\n"); + ERR("Surface should implement IDXGISurface.\n"); goto fail; }
- TRACE("Created IDXGISurface %p (%u/%u)\n", surface[i], i + 1, surface_count); + TRACE("Created IDXGISurface %p (%u/%u).\n", surface[i], i + 1, surface_count); } wined3d_mutex_unlock(); IWineDXGIDeviceParent_Release(dxgi_device_parent); diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h index b8af8c361914..b97b67a7f951 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -38,6 +38,10 @@ #include "wine/wined3d.h" #include "wine/winedxgi.h"
+#ifndef ARRAY_SIZE +#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) +#endif + enum dxgi_frame_latency { DXGI_FRAME_LATENCY_DEFAULT = 3, @@ -92,6 +96,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; 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; HRESULT dxgi_get_private_data(struct wined3d_private_store *store, diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c index 0020917ca693..8d2407895029 100644 --- a/dlls/dxgi/factory.c +++ b/dlls/dxgi/factory.c @@ -313,7 +313,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChainForHwnd(IDXGIFactor 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 = WINED3DUSAGE_RENDERTARGET; + wined3d_desc.backbuffer_usage = wined3d_usage_from_dxgi_usage(swapchain_desc->BufferUsage); wined3d_sample_desc_from_dxgi(&wined3d_desc.multisample_type, &wined3d_desc.multisample_quality, &swapchain_desc->SampleDesc); wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD; diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 2983ec59438c..66126f8940ea 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -295,7 +295,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDesc(IDXGISwapChain1 *iface, desc->BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 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_RENDER_TARGET_OUTPUT; + desc->BufferUsage = dxgi_usage_from_wined3d_usage(wined3d_desc.backbuffer_usage); desc->BufferCount = wined3d_desc.backbuffer_count; desc->OutputWindow = wined3d_desc.device_window; desc->Windowed = wined3d_desc.windowed; @@ -452,7 +452,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_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_RENDER_TARGET_OUTPUT; + desc->BufferUsage = dxgi_usage_from_wined3d_usage(wined3d_desc.backbuffer_usage); desc->BufferCount = wined3d_desc.backbuffer_count; desc->Scaling = DXGI_SCALING_STRETCH; desc->SwapEffect = DXGI_SWAP_EFFECT_DISCARD; diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c index db74a487f2ee..a881746fb31b 100644 --- a/dlls/dxgi/utils.c +++ b/dlls/dxgi/utils.c @@ -453,6 +453,36 @@ 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 = 0; + + if (wined3d_usage & WINED3DUSAGE_TEXTURE) + dxgi_usage |= DXGI_USAGE_SHADER_INPUT; + if (wined3d_usage & WINED3DUSAGE_RENDERTARGET) + dxgi_usage |= DXGI_USAGE_RENDER_TARGET_OUTPUT; + + wined3d_usage &= ~(WINED3DUSAGE_TEXTURE | WINED3DUSAGE_RENDERTARGET); + if (wined3d_usage) + FIXME("Unhandled wined3d usage %#x.\n", wined3d_usage); + return dxgi_usage; +} + +DWORD wined3d_usage_from_dxgi_usage(DXGI_USAGE dxgi_usage) +{ + DWORD wined3d_usage = 0; + + if (dxgi_usage & DXGI_USAGE_SHADER_INPUT) + wined3d_usage |= WINED3DUSAGE_TEXTURE; + if (dxgi_usage & DXGI_USAGE_RENDER_TARGET_OUTPUT) + wined3d_usage |= WINED3DUSAGE_RENDERTARGET; + + 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; +} + #define DXGI_WINED3D_SWAPCHAIN_FLAGS \ (WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE | WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
Signed-off-by: Józef Kucia jkucia@codeweavers.com ---
Version 2: * Remove ARRAY_SIZE() (it was used in the initial version of the patch). * Modify FIXME() messages.
--- dlls/dxgi/device.c | 11 +++++------ dlls/dxgi/dxgi_private.h | 2 ++ dlls/dxgi/factory.c | 2 +- dlls/dxgi/swapchain.c | 13 +++++++------ dlls/dxgi/utils.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 13 deletions(-)
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c index 2539ca272606..b61d5abdb50a 100644 --- a/dlls/dxgi/device.c +++ b/dlls/dxgi/device.c @@ -169,24 +169,23 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac UINT i; UINT j;
- TRACE("iface %p, desc %p, surface_count %u, usage %#x, shared_resource %p, surface %p\n", + TRACE("iface %p, desc %p, surface_count %u, usage %#x, shared_resource %p, surface %p.\n", iface, desc, surface_count, usage, shared_resource, surface);
hr = IWineDXGIDevice_QueryInterface(iface, &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent); if (FAILED(hr)) { - ERR("Device should implement IWineDXGIDeviceParent\n"); + ERR("Device should implement IWineDXGIDeviceParent.\n"); return E_FAIL; }
device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent);
- FIXME("Implement DXGI<->wined3d usage conversion\n"); surface_desc.resource_type = WINED3D_RTYPE_TEXTURE_2D; 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 = usage; + surface_desc.usage = wined3d_usage_from_dxgi_usage(usage); surface_desc.pool = WINED3D_POOL_DEFAULT; surface_desc.width = desc->Width; surface_desc.height = desc->Height; @@ -212,11 +211,11 @@ static HRESULT STDMETHODCALLTYPE dxgi_device_CreateSurface(IWineDXGIDevice *ifac wined3d_texture_decref(wined3d_texture); if (FAILED(hr)) { - ERR("Surface should implement IDXGISurface\n"); + ERR("Surface should implement IDXGISurface.\n"); goto fail; }
- TRACE("Created IDXGISurface %p (%u/%u)\n", surface[i], i + 1, surface_count); + TRACE("Created IDXGISurface %p (%u/%u).\n", surface[i], i + 1, surface_count); } wined3d_mutex_unlock(); IWineDXGIDeviceParent_Release(dxgi_device_parent); diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h index b8af8c361914..2fe43310b468 100644 --- a/dlls/dxgi/dxgi_private.h +++ b/dlls/dxgi/dxgi_private.h @@ -92,6 +92,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; 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; HRESULT dxgi_get_private_data(struct wined3d_private_store *store, diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c index 0020917ca693..8d2407895029 100644 --- a/dlls/dxgi/factory.c +++ b/dlls/dxgi/factory.c @@ -313,7 +313,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChainForHwnd(IDXGIFactor 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 = WINED3DUSAGE_RENDERTARGET; + wined3d_desc.backbuffer_usage = wined3d_usage_from_dxgi_usage(swapchain_desc->BufferUsage); wined3d_sample_desc_from_dxgi(&wined3d_desc.multisample_type, &wined3d_desc.multisample_quality, &swapchain_desc->SampleDesc); wined3d_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD; diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 2983ec59438c..9df1f56f15a4 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -273,7 +273,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDesc(IDXGISwapChain1 *iface, struct dxgi_swapchain *swapchain = impl_from_IDXGISwapChain1(iface); struct wined3d_swapchain_desc wined3d_desc;
- FIXME("iface %p, desc %p partial stub!\n", iface, desc); + TRACE("iface %p, desc %p.\n", iface, desc);
if (!desc) { @@ -285,7 +285,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDesc(IDXGISwapChain1 *iface, wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); wined3d_mutex_unlock();
- FIXME("Ignoring ScanlineOrdering, Scaling, BufferUsage and SwapEffect.\n"); + FIXME("Ignoring ScanlineOrdering, Scaling and SwapEffect.\n");
desc->BufferDesc.Width = wined3d_desc.backbuffer_width; desc->BufferDesc.Height = wined3d_desc.backbuffer_height; @@ -294,8 +294,9 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDesc(IDXGISwapChain1 *iface, desc->BufferDesc.Format = dxgi_format_from_wined3dformat(wined3d_desc.backbuffer_format); desc->BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 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_RENDER_TARGET_OUTPUT; + 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->BufferCount = wined3d_desc.backbuffer_count; desc->OutputWindow = wined3d_desc.device_window; desc->Windowed = wined3d_desc.windowed; @@ -444,7 +445,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_swapchain_GetDesc1(IDXGISwapChain1 *iface, wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &wined3d_desc); wined3d_mutex_unlock();
- FIXME("Ignoring Stereo, BufferUsage, Scaling, SwapEffect and AlphaMode.\n"); + FIXME("Ignoring Stereo, Scaling, SwapEffect and AlphaMode.\n");
desc->Width = wined3d_desc.backbuffer_width; desc->Height = wined3d_desc.backbuffer_height; @@ -452,7 +453,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_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_RENDER_TARGET_OUTPUT; + desc->BufferUsage = dxgi_usage_from_wined3d_usage(wined3d_desc.backbuffer_usage); desc->BufferCount = wined3d_desc.backbuffer_count; desc->Scaling = DXGI_SCALING_STRETCH; desc->SwapEffect = DXGI_SWAP_EFFECT_DISCARD; diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c index db74a487f2ee..a881746fb31b 100644 --- a/dlls/dxgi/utils.c +++ b/dlls/dxgi/utils.c @@ -453,6 +453,36 @@ 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 = 0; + + if (wined3d_usage & WINED3DUSAGE_TEXTURE) + dxgi_usage |= DXGI_USAGE_SHADER_INPUT; + if (wined3d_usage & WINED3DUSAGE_RENDERTARGET) + dxgi_usage |= DXGI_USAGE_RENDER_TARGET_OUTPUT; + + wined3d_usage &= ~(WINED3DUSAGE_TEXTURE | WINED3DUSAGE_RENDERTARGET); + if (wined3d_usage) + FIXME("Unhandled wined3d usage %#x.\n", wined3d_usage); + return dxgi_usage; +} + +DWORD wined3d_usage_from_dxgi_usage(DXGI_USAGE dxgi_usage) +{ + DWORD wined3d_usage = 0; + + if (dxgi_usage & DXGI_USAGE_SHADER_INPUT) + wined3d_usage |= WINED3DUSAGE_TEXTURE; + if (dxgi_usage & DXGI_USAGE_RENDER_TARGET_OUTPUT) + wined3d_usage |= WINED3DUSAGE_RENDERTARGET; + + 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; +} + #define DXGI_WINED3D_SWAPCHAIN_FLAGS \ (WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE | WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/d3d10core/tests/device.c | 4 ++-- dlls/d3d11/d3d11_private.h | 1 + dlls/d3d11/device.c | 9 +++------ dlls/d3d11/tests/d3d11.c | 4 ++-- dlls/d3d11/utils.c | 15 +++++++++++++++ 5 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/dlls/d3d10core/tests/device.c b/dlls/d3d10core/tests/device.c index ca0fd8be4997..86a8f43d4e93 100644 --- a/dlls/d3d10core/tests/device.c +++ b/dlls/d3d10core/tests/device.c @@ -8758,13 +8758,13 @@ static void test_swapchain_flip(void) ok(SUCCEEDED(hr), "Failed to create shader resource view, hr %#x.\n", hr);
ID3D10Texture2D_GetDesc(backbuffer_0, &texture_desc); - todo_wine ok((texture_desc.BindFlags & (D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE)) + ok((texture_desc.BindFlags & (D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE)) == (D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE), "Got unexpected bind flags %x.\n", texture_desc.BindFlags); ok(texture_desc.Usage == D3D10_USAGE_DEFAULT, "Got unexpected usage %u.\n", texture_desc.Usage);
ID3D10Texture2D_GetDesc(backbuffer_1, &texture_desc); - todo_wine ok((texture_desc.BindFlags & (D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE)) + ok((texture_desc.BindFlags & (D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE)) == (D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE), "Got unexpected bind flags %x.\n", texture_desc.BindFlags); ok(texture_desc.Usage == D3D10_USAGE_DEFAULT, "Got unexpected usage %u.\n", texture_desc.Usage); diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h index a184b9377a02..9089398e5dfc 100644 --- a/dlls/d3d11/d3d11_private.h +++ b/dlls/d3d11/d3d11_private.h @@ -67,6 +67,7 @@ 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; diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 86778f313355..cde5b3cc57bc 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -5771,11 +5771,8 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic D3D11_TEXTURE2D_DESC desc; HRESULT hr;
- FIXME("device_parent %p, container_parent %p, wined3d_desc %p, texture flags %#x, " - "wined3d_texture %p partial stub!\n", device_parent, container_parent, - wined3d_desc, texture_flags, wined3d_texture); - - FIXME("Implement DXGI<->wined3d usage conversion.\n"); + TRACE("device_parent %p, container_parent %p, wined3d_desc %p, texture_flags %#x, wined3d_texture %p.\n", + device_parent, container_parent, wined3d_desc, texture_flags, wined3d_texture);
desc.Width = wined3d_desc->width; desc.Height = wined3d_desc->height; @@ -5785,7 +5782,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_RENDER_TARGET; + desc.BindFlags = d3d11_bind_flags_from_wined3d_usage(wined3d_desc->usage); desc.CPUAccessFlags = 0; desc.MiscFlags = 0;
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c index 19e428c2f5bc..ca71718c4e9b 100644 --- a/dlls/d3d11/tests/d3d11.c +++ b/dlls/d3d11/tests/d3d11.c @@ -11265,13 +11265,13 @@ static void test_swapchain_flip(void) ok(SUCCEEDED(hr), "Failed to create shader resource view, hr %#x.\n", hr);
ID3D11Texture2D_GetDesc(backbuffer_0, &texture_desc); - todo_wine ok((texture_desc.BindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)) + ok((texture_desc.BindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)) == (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE), "Got unexpected bind flags %x.\n", texture_desc.BindFlags); ok(texture_desc.Usage == D3D11_USAGE_DEFAULT, "Got unexpected usage %u.\n", texture_desc.Usage);
ID3D11Texture2D_GetDesc(backbuffer_1, &texture_desc); - todo_wine ok((texture_desc.BindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)) + ok((texture_desc.BindFlags & (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE)) == (D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE), "Got unexpected bind flags %x.\n", texture_desc.BindFlags); ok(texture_desc.Usage == D3D11_USAGE_DEFAULT, "Got unexpected usage %u.\n", texture_desc.Usage); diff --git a/dlls/d3d11/utils.c b/dlls/d3d11/utils.c index c72216def534..ae761f448b74 100644 --- a/dlls/d3d11/utils.c +++ b/dlls/d3d11/utils.c @@ -438,6 +438,21 @@ 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
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=35539
Your paranoid android.
=== wvistau64 (32 bit d3d11) === d3d11.c:5017: Test failed: Got unexpected IAVertices count: 0. d3d11.c:5018: Test failed: Got unexpected IAPrimitives count: 0. d3d11.c:5019: Test failed: Got unexpected VSInvocations count: 0. d3d11.c:5022: Test failed: Got unexpected CInvocations count: 0. d3d11.c:5023: Test failed: Got unexpected CPrimitives count: 0.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/dxgi/tests/device.c | 94 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 6 deletions(-)
diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c index f7b3ba07856f..4ad5b9f6745c 100644 --- a/dlls/dxgi/tests/device.c +++ b/dlls/dxgi/tests/device.c @@ -3039,18 +3039,24 @@ static void test_swapchain_resize(void)
static void test_swapchain_parameters(void) { + DXGI_USAGE usage, expected_usage, broken_usage; + D3D10_TEXTURE2D_DESC d3d10_texture_desc; + D3D11_TEXTURE2D_DESC d3d11_texture_desc; + unsigned int expected_bind_flags; + ID3D10Texture2D *d3d10_texture; + ID3D11Texture2D *d3d11_texture; + DXGI_SWAP_CHAIN_DESC desc; IDXGISwapChain *swapchain; - IUnknown *obj; + IDXGIResource *resource; IDXGIAdapter *adapter; IDXGIFactory *factory; IDXGIDevice *device; - IDXGIResource *resource; - DXGI_SWAP_CHAIN_DESC desc; - HRESULT hr; unsigned int i, j; ULONG refcount; - DXGI_USAGE usage, expected_usage, broken_usage; + IUnknown *obj; HWND window; + HRESULT hr; + static const struct { BOOL windowed; @@ -3122,6 +3128,19 @@ static void test_swapchain_parameters(void) {FALSE, 17, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, {FALSE, 17, DXGI_SWAP_EFFECT_FLIP_DISCARD, DXGI_ERROR_INVALID_CALL, DXGI_ERROR_INVALID_CALL, 0}, }; + static const DXGI_USAGE usage_tests[] = + { + 0, + DXGI_USAGE_BACK_BUFFER, + DXGI_USAGE_SHADER_INPUT, + DXGI_USAGE_RENDER_TARGET_OUTPUT, + DXGI_USAGE_DISCARD_ON_PRESENT, + DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER, + DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_DISCARD_ON_PRESENT, + DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_DISCARD_ON_PRESENT, + DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT, + DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_DISCARD_ON_PRESENT, + };
if (!(device = create_device(0))) { @@ -3132,7 +3151,7 @@ static void test_swapchain_parameters(void) 0, 0, 640, 480, 0, 0, 0, 0);
hr = IDXGIDevice_QueryInterface(device, &IID_IUnknown, (void **)&obj); - ok(SUCCEEDED(hr), "IDXGIDevice does not implement IUnknown\n"); + ok(SUCCEEDED(hr), "IDXGIDevice does not implement IUnknown.\n");
hr = IDXGIDevice_GetAdapter(device, &adapter); ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr); @@ -3228,6 +3247,69 @@ static void test_swapchain_parameters(void) IDXGISwapChain_Release(swapchain); }
+ for (i = 0; i < sizeof(usage_tests) / sizeof(*usage_tests); ++i) + { + usage = usage_tests[i]; + + memset(&desc, 0, sizeof(desc)); + desc.BufferDesc.Width = registry_mode.dmPelsWidth; + desc.BufferDesc.Height = registry_mode.dmPelsHeight; + desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.BufferUsage = usage; + desc.BufferCount = 1; + desc.OutputWindow = window; + desc.Windowed = TRUE; + desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + hr = IDXGIFactory_CreateSwapChain(factory, obj, &desc, &swapchain); + ok(hr == S_OK, "Got unexpected hr %#x, test %u.\n", hr, i); + + hr = IDXGISwapChain_GetDesc(swapchain, &desc); + ok(hr == S_OK, "Failed to get swapchain desc, hr %#x, test %u.\n", hr, i); + todo_wine_if(usage & ~(DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT)) + ok(desc.BufferUsage == usage, "Got usage %#x, expected %#x, test %u.\n", desc.BufferUsage, usage, i); + + expected_bind_flags = 0; + if (usage & DXGI_USAGE_RENDER_TARGET_OUTPUT) + expected_bind_flags |= D3D11_BIND_RENDER_TARGET; + if (usage & DXGI_USAGE_SHADER_INPUT) + expected_bind_flags |= D3D11_BIND_SHADER_RESOURCE; + + hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_ID3D10Texture2D, (void **)&d3d10_texture); + ok(hr == S_OK, "Failed to get d3d10 texture, hr %#x, test %u.\n", hr, i); + ID3D10Texture2D_GetDesc(d3d10_texture, &d3d10_texture_desc); + ok(d3d10_texture_desc.BindFlags == expected_bind_flags, + "Got d3d10 bind flags %#x, expected %#x, test %u.\n", + d3d10_texture_desc.BindFlags, expected_bind_flags, i); + ID3D10Texture2D_Release(d3d10_texture); + + hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_ID3D11Texture2D, (void **)&d3d11_texture); + ok(hr == S_OK || broken(hr == E_NOINTERFACE), "Failed to get d3d11 texture, hr %#x, test %u.\n", hr, i); + if (SUCCEEDED(hr)) + { + ID3D11Texture2D_GetDesc(d3d11_texture, &d3d11_texture_desc); + ok(d3d11_texture_desc.BindFlags == expected_bind_flags, + "Got d3d11 bind flags %#x, expected %#x, test %u.\n", + d3d11_texture_desc.BindFlags, expected_bind_flags, i); + ID3D11Texture2D_Release(d3d11_texture); + } + + hr = IDXGISwapChain_GetBuffer(swapchain, 0, &IID_IDXGIResource, (void **)&resource); + todo_wine ok(hr == S_OK, "Failed to get buffer, hr %#x, test %u.\n", hr, i); + if (FAILED(hr)) + { + IDXGISwapChain_Release(swapchain); + continue; + } + expected_usage = usage | DXGI_USAGE_BACK_BUFFER | DXGI_USAGE_DISCARD_ON_PRESENT; + hr = IDXGIResource_GetUsage(resource, &usage); + ok(hr == S_OK, "Failed to get resource usage, hr %#x, test %u.\n", hr, i); + ok(usage == expected_usage, "Got usage %x, expected %x, test %u.\n", usage, expected_usage, i); + IDXGIResource_Release(resource); + + IDXGISwapChain_Release(swapchain); + } + IDXGIFactory_Release(factory); IDXGIAdapter_Release(adapter); IUnknown_Release(obj);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com