Module: wine Branch: master Commit: 7b7d26a731c2c6bf03824638a8fa367d9b191b74 URL: https://gitlab.winehq.org/wine/wine/-/commit/7b7d26a731c2c6bf03824638a8fa367...
Author: Zebediah Figura zfigura@codeweavers.com Date: Mon Apr 10 17:21:29 2023 -0500
dxgi: Create d3d11 swapchain textures directly from d3d11_swapchain_init().
Using the IWineDXGIDeviceParent::swapchain_texture_created() callback.
---
dlls/d3d11/device.c | 41 ++--------------------------------------- dlls/dxgi/swapchain.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 39 deletions(-)
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 01f5599c7d0..4cf066ef945 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -6898,49 +6898,12 @@ static HRESULT CDECL device_parent_create_swapchain_texture(struct wined3d_devic struct wined3d_texture **wined3d_texture) { struct d3d_device *device = device_from_wined3d_device_parent(device_parent); - struct d3d_texture2d *texture; - ID3D11Texture2D *texture_iface; - D3D11_TEXTURE2D_DESC desc; - HRESULT hr;
TRACE("device_parent %p, container_parent %p, wined3d_desc %p, texture_flags %#lx, wined3d_texture %p.\n", device_parent, container_parent, wined3d_desc, texture_flags, wined3d_texture);
- desc.Width = wined3d_desc->width; - desc.Height = wined3d_desc->height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = dxgi_format_from_wined3dformat(wined3d_desc->format); - 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(wined3d_desc->bind_flags); - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - - if (texture_flags & WINED3D_TEXTURE_CREATE_GET_DC) - { - desc.MiscFlags |= D3D11_RESOURCE_MISC_GDI_COMPATIBLE; - texture_flags &= ~WINED3D_TEXTURE_CREATE_GET_DC; - } - - if (texture_flags) - FIXME("Unhandled flags %#lx.\n", texture_flags); - - if (FAILED(hr = d3d11_device_CreateTexture2D(&device->ID3D11Device2_iface, - &desc, NULL, &texture_iface))) - { - WARN("Failed to create 2D texture, hr %#lx.\n", hr); - return hr; - } - - texture = impl_from_ID3D11Texture2D(texture_iface); - - *wined3d_texture = texture->wined3d_texture; - wined3d_texture_incref(*wined3d_texture); - ID3D11Texture2D_Release(&texture->ID3D11Texture2D_iface); - - return S_OK; + return wined3d_texture_create(device->wined3d_device, wined3d_desc, 1, 1, + texture_flags, NULL, NULL, &d3d_null_wined3d_parent_ops, wined3d_texture); }
static const struct wined3d_device_parent_ops d3d_wined3d_device_parent_ops = diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 910286b8c5f..0ba9db96108 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -848,6 +848,41 @@ static const struct wined3d_swapchain_state_parent_ops d3d11_swapchain_state_par d3d11_swapchain_windowed_state_changed, };
+static HRESULT d3d11_swapchain_create_d3d11_textures(struct d3d11_swapchain *swapchain, + struct dxgi_device *device, struct wined3d_swapchain_desc *desc) +{ + IWineDXGIDeviceParent *dxgi_device_parent; + unsigned int texture_flags = 0; + unsigned int i; + HRESULT hr; + + if (FAILED(hr = IWineDXGIDevice_QueryInterface(&device->IWineDXGIDevice_iface, + &IID_IWineDXGIDeviceParent, (void **)&dxgi_device_parent))) + { + ERR("Device should implement IWineDXGIDeviceParent.\n"); + return E_FAIL; + } + + if (desc->flags & WINED3D_SWAPCHAIN_GDI_COMPATIBLE) + texture_flags |= WINED3D_TEXTURE_CREATE_GET_DC; + + for (i = 0; i < desc->backbuffer_count; ++i) + { + IDXGISurface *surface; + + if (FAILED(hr = IWineDXGIDeviceParent_register_swapchain_texture(dxgi_device_parent, + wined3d_swapchain_get_back_buffer(swapchain->wined3d_swapchain, i), texture_flags, &surface))) + { + ERR("Failed to create parent swapchain texture, hr %#lx.\n", hr); + break; + } + IDXGISurface_Release(surface); + } + + IWineDXGIDeviceParent_Release(dxgi_device_parent); + return hr; +} + HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_device *device, struct wined3d_swapchain_desc *desc) { @@ -891,6 +926,14 @@ HRESULT d3d11_swapchain_init(struct d3d11_swapchain *swapchain, struct dxgi_devi swapchain, &d3d11_swapchain_wined3d_parent_ops, &swapchain->wined3d_swapchain))) { WARN("Failed to create wined3d swapchain, hr %#lx.\n", hr); + if (hr == WINED3DERR_INVALIDCALL) + hr = E_INVALIDARG; + goto cleanup; + } + + if (FAILED(hr = d3d11_swapchain_create_d3d11_textures(swapchain, device, desc))) + { + ERR("Failed to create d3d11 textures, hr %#lx.\n", hr); goto cleanup; }