[PATCH 3/6] dxgi: Factor out d3d12_swapchain_create_vulkan_swapchain().
Józef Kucia
jkucia at codeweavers.com
Wed Aug 29 05:53:36 CDT 2018
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/dxgi/swapchain.c | 228 ++++++++++++++++++++++++++------------------------
1 file changed, 119 insertions(+), 109 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 0b651c4853bd..71183f6f20bf 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1023,8 +1023,7 @@ static HRESULT vk_select_memory_type(const struct dxgi_vk_funcs *vk_funcs,
return E_FAIL;
}
-static HRESULT d3d12_swapchain_create_user_buffers(struct d3d12_swapchain *swapchain,
- const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat vk_format)
+static HRESULT d3d12_swapchain_create_user_buffers(struct d3d12_swapchain *swapchain, VkFormat vk_format)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
VkDeviceSize image_offset[DXGI_MAX_SWAP_CHAIN_BUFFERS];
@@ -1043,8 +1042,8 @@ static HRESULT d3d12_swapchain_create_user_buffers(struct d3d12_swapchain *swapc
image_info.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
image_info.imageType = VK_IMAGE_TYPE_2D;
image_info.format = vk_format;
- image_info.extent.width = swapchain_desc->Width;
- image_info.extent.height = swapchain_desc->Height;
+ image_info.extent.width = swapchain->desc.Width;
+ image_info.extent.height = swapchain->desc.Height;
image_info.extent.depth = 1;
image_info.mipLevels = 1;
image_info.arrayLayers = 1;
@@ -1141,8 +1140,7 @@ static void vk_cmd_image_barrier(const struct dxgi_vk_funcs *vk_funcs, VkCommand
}
static HRESULT d3d12_swapchain_prepare_command_buffers(struct d3d12_swapchain *swapchain,
- const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, uint32_t queue_family_index,
- VkImage vk_swapchain_images[DXGI_MAX_SWAP_CHAIN_BUFFERS])
+ uint32_t queue_family_index, VkImage vk_swapchain_images[DXGI_MAX_SWAP_CHAIN_BUFFERS])
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
VkDevice vk_device = swapchain->vk_device;
@@ -1208,8 +1206,8 @@ static HRESULT d3d12_swapchain_prepare_command_buffers(struct d3d12_swapchain *s
blit.srcOffsets[0].x = 0;
blit.srcOffsets[0].y = 0;
blit.srcOffsets[0].z = 0;
- blit.srcOffsets[1].x = swapchain_desc->Width;
- blit.srcOffsets[1].y = swapchain_desc->Height;
+ blit.srcOffsets[1].x = swapchain->desc.Width;
+ blit.srcOffsets[1].y = swapchain->desc.Height;
blit.srcOffsets[1].z = 1;
blit.dstSubresource = blit.srcSubresource;
blit.dstOffsets[0] = blit.srcOffsets[0];
@@ -1252,14 +1250,15 @@ static HRESULT d3d12_swapchain_prepare_command_buffers(struct d3d12_swapchain *s
}
static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
- ID3D12Device *device, ID3D12CommandQueue *queue,
- const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat vk_swapchain_format, VkFormat vk_format)
+ VkFormat vk_swapchain_format, VkFormat vk_format)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
VkImage vk_swapchain_images[DXGI_MAX_SWAP_CHAIN_BUFFERS];
struct vkd3d_image_resource_create_info resource_info;
VkSwapchainKHR vk_swapchain = swapchain->vk_swapchain;
+ ID3D12CommandQueue *queue = swapchain->command_queue;
VkDevice vk_device = swapchain->vk_device;
+ ID3D12Device *device = swapchain->device;
uint32_t image_count, queue_family_index;
D3D12_COMMAND_QUEUE_DESC queue_desc;
unsigned int i;
@@ -1271,8 +1270,8 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
WARN("Failed to get Vulkan swapchain images, vr %d.\n", vr);
return hresult_from_vk_result(vr);
}
- if (image_count != swapchain_desc->BufferCount)
- FIXME("Got %u swapchain images, expected %u.\n", image_count, swapchain_desc->BufferCount);
+ if (image_count != swapchain->desc.BufferCount)
+ FIXME("Got %u swapchain images, expected %u.\n", image_count, swapchain->desc.BufferCount);
if (image_count > ARRAY_SIZE(vk_swapchain_images))
return E_FAIL;
swapchain->buffer_count = image_count;
@@ -1287,8 +1286,8 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
resource_info.next = NULL;
resource_info.desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
resource_info.desc.Alignment = 0;
- resource_info.desc.Width = swapchain_desc->Width;
- resource_info.desc.Height = swapchain_desc->Height;
+ resource_info.desc.Width = swapchain->desc.Width;
+ resource_info.desc.Height = swapchain->desc.Height;
resource_info.desc.DepthOrArraySize = 1;
resource_info.desc.MipLevels = 1;
resource_info.desc.Format = dxgi_format_from_vk_format(vk_format);
@@ -1311,10 +1310,10 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
TRACE("Creating user swapchain buffers for format conversion.\n");
- if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain, swapchain_desc, vk_format)))
+ if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain, vk_format)))
return hr;
- if (FAILED(hr = d3d12_swapchain_prepare_command_buffers(swapchain, swapchain_desc,
+ if (FAILED(hr = d3d12_swapchain_prepare_command_buffers(swapchain,
queue_family_index, vk_swapchain_images)))
return hr;
}
@@ -1391,6 +1390,103 @@ static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain)
}
}
+static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *swapchain)
+{
+ VkPhysicalDevice vk_physical_device = swapchain->vk_physical_device;
+ const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
+ VkSwapchainCreateInfoKHR vk_swapchain_desc;
+ VkDevice vk_device = swapchain->vk_device;
+ VkFormat vk_format, vk_swapchain_format;
+ VkSurfaceCapabilitiesKHR surface_caps;
+ VkSwapchainKHR vk_swapchain;
+ VkImageUsageFlags usage;
+ VkResult vr;
+ HRESULT hr;
+
+ if (!(vk_format = vkd3d_get_vk_format(swapchain->desc.Format)))
+ {
+ WARN("Invalid format %#x.\n", swapchain->desc.Format);
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
+ if (FAILED(hr = select_vk_format(vk_funcs, vk_physical_device,
+ swapchain->vk_surface, &swapchain->desc, &vk_swapchain_format)))
+ return hr;
+
+ if ((vr = vk_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device,
+ swapchain->vk_surface, &surface_caps)) < 0)
+ {
+ WARN("Failed to get surface capabilities, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ if (surface_caps.maxImageCount && (swapchain->desc.BufferCount > surface_caps.maxImageCount
+ || swapchain->desc.BufferCount < surface_caps.minImageCount))
+ {
+ WARN("Buffer count %u is not supported (%u-%u).\n", swapchain->desc.BufferCount,
+ surface_caps.minImageCount, surface_caps.maxImageCount);
+ return DXGI_ERROR_UNSUPPORTED;
+ }
+
+ if (swapchain->desc.Width > surface_caps.maxImageExtent.width
+ || swapchain->desc.Width < surface_caps.minImageExtent.width
+ || swapchain->desc.Height > surface_caps.maxImageExtent.height
+ || swapchain->desc.Height < surface_caps.minImageExtent.height)
+ {
+ FIXME("Swapchain dimensions %ux%u are not supported (%u-%u x %u-%u).\n",
+ swapchain->desc.Width, swapchain->desc.Height,
+ surface_caps.minImageExtent.width, surface_caps.maxImageExtent.width,
+ surface_caps.minImageExtent.height, surface_caps.maxImageExtent.height);
+ }
+
+ if (!(surface_caps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR))
+ {
+ FIXME("Unsupported alpha mode.\n");
+ return DXGI_ERROR_UNSUPPORTED;
+ }
+
+ usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ usage |= surface_caps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ usage |= surface_caps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ if (!(usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) || !(usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT))
+ WARN("Transfer not supported for swapchain images.\n");
+
+ vk_swapchain_desc.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ vk_swapchain_desc.pNext = NULL;
+ vk_swapchain_desc.flags = 0;
+ vk_swapchain_desc.surface = swapchain->vk_surface;
+ vk_swapchain_desc.minImageCount = swapchain->desc.BufferCount;
+ vk_swapchain_desc.imageFormat = vk_swapchain_format;
+ vk_swapchain_desc.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ vk_swapchain_desc.imageExtent.width = swapchain->desc.Width;
+ vk_swapchain_desc.imageExtent.height = swapchain->desc.Height;
+ vk_swapchain_desc.imageArrayLayers = 1;
+ vk_swapchain_desc.imageUsage = usage;
+ vk_swapchain_desc.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ vk_swapchain_desc.queueFamilyIndexCount = 0;
+ vk_swapchain_desc.pQueueFamilyIndices = NULL;
+ vk_swapchain_desc.preTransform = surface_caps.currentTransform;
+ vk_swapchain_desc.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+ vk_swapchain_desc.presentMode = VK_PRESENT_MODE_FIFO_KHR;
+ vk_swapchain_desc.clipped = VK_TRUE;
+ vk_swapchain_desc.oldSwapchain = swapchain->vk_swapchain;
+ if ((vr = vk_funcs->p_vkCreateSwapchainKHR(vk_device, &vk_swapchain_desc, NULL, &vk_swapchain)) < 0)
+ {
+ WARN("Failed to create Vulkan swapchain, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ if (swapchain->vk_swapchain)
+ vk_funcs->p_vkDestroySwapchainKHR(swapchain->vk_device, swapchain->vk_swapchain, NULL);
+
+ swapchain->vk_swapchain = vk_swapchain;
+
+ if (FAILED(hr = d3d12_swapchain_create_buffers(swapchain, vk_swapchain_format, vk_format)))
+ return hr;
+
+ return S_OK;
+}
+
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface)
{
return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain3_iface);
@@ -2153,20 +2249,15 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
- struct VkSwapchainCreateInfoKHR vk_swapchain_desc;
- struct VkWin32SurfaceCreateInfoKHR surface_desc;
- VkSwapchainKHR vk_swapchain = VK_NULL_HANDLE;
- VkSurfaceKHR vk_surface = VK_NULL_HANDLE;
- VkFormat vk_swapchain_format, vk_format;
- VkSurfaceCapabilitiesKHR surface_caps;
+ VkWin32SurfaceCreateInfoKHR surface_desc;
VkPhysicalDevice vk_physical_device;
- VkFence vk_fence = VK_NULL_HANDLE;
VkFenceCreateInfo fence_desc;
uint32_t queue_family_index;
- VkImageUsageFlags usage;
+ VkSurfaceKHR vk_surface;
VkInstance vk_instance;
VkBool32 supported;
VkDevice vk_device;
+ VkFence vk_fence;
VkResult vr;
HRESULT hr;
@@ -2194,12 +2285,6 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
return DXGI_ERROR_UNSUPPORTED;
}
- if (!(vk_format = vkd3d_get_vk_format(swapchain_desc->Format)))
- {
- WARN("Invalid format %#x.\n", swapchain_desc->Format);
- return DXGI_ERROR_INVALID_CALL;
- }
-
if (swapchain_desc->BufferUsage && swapchain_desc->BufferUsage != DXGI_USAGE_RENDER_TARGET_OUTPUT)
FIXME("Ignoring buffer usage %#x.\n", swapchain_desc->BufferUsage);
if (swapchain_desc->Scaling != DXGI_SCALING_STRETCH)
@@ -2252,81 +2337,15 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
return DXGI_ERROR_UNSUPPORTED;
}
- if (FAILED(hr = select_vk_format(vk_funcs, vk_physical_device,
- vk_surface, swapchain_desc, &vk_swapchain_format)))
+ ID3D12CommandQueue_AddRef(swapchain->command_queue = queue);
+ ID3D12Device_AddRef(swapchain->device = device);
+
+ if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
{
d3d12_swapchain_destroy(swapchain);
return hr;
}
- if ((vr = vk_funcs->p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device,
- vk_surface, &surface_caps)) < 0)
- {
- WARN("Failed to get surface capabilities, vr %d.\n", vr);
- d3d12_swapchain_destroy(swapchain);
- return hresult_from_vk_result(vr);
- }
-
- if (surface_caps.maxImageCount && (swapchain_desc->BufferCount > surface_caps.maxImageCount
- || swapchain_desc->BufferCount < surface_caps.minImageCount))
- {
- WARN("Buffer count %u is not supported (%u-%u).\n", swapchain_desc->BufferCount,
- surface_caps.minImageCount, surface_caps.maxImageCount);
- d3d12_swapchain_destroy(swapchain);
- return DXGI_ERROR_UNSUPPORTED;
- }
-
- if (swapchain_desc->Width > surface_caps.maxImageExtent.width
- || swapchain_desc->Width < surface_caps.minImageExtent.width
- || swapchain_desc->Height > surface_caps.maxImageExtent.height
- || swapchain_desc->Height < surface_caps.minImageExtent.height)
- {
- FIXME("Swapchain dimensions %ux%u are not supported (%u-%u x %u-%u).\n",
- swapchain_desc->Width, swapchain_desc->Height,
- surface_caps.minImageExtent.width, surface_caps.maxImageExtent.width,
- surface_caps.minImageExtent.height, surface_caps.maxImageExtent.height);
- }
-
- if (!(surface_caps.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR))
- {
- FIXME("Unsupported alpha mode.\n");
- d3d12_swapchain_destroy(swapchain);
- return DXGI_ERROR_UNSUPPORTED;
- }
-
- usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
- usage |= surface_caps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
- usage |= surface_caps.supportedUsageFlags & VK_IMAGE_USAGE_TRANSFER_DST_BIT;
- if (!(usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT) || !(usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT))
- WARN("Transfer not supported for swapchain images.\n");
-
- vk_swapchain_desc.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
- vk_swapchain_desc.pNext = NULL;
- vk_swapchain_desc.flags = 0;
- vk_swapchain_desc.surface = vk_surface;
- vk_swapchain_desc.minImageCount = swapchain_desc->BufferCount;
- vk_swapchain_desc.imageFormat = vk_swapchain_format;
- vk_swapchain_desc.imageColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
- vk_swapchain_desc.imageExtent.width = swapchain_desc->Width;
- vk_swapchain_desc.imageExtent.height = swapchain_desc->Height;
- vk_swapchain_desc.imageArrayLayers = 1;
- vk_swapchain_desc.imageUsage = usage;
- vk_swapchain_desc.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
- vk_swapchain_desc.queueFamilyIndexCount = 0;
- vk_swapchain_desc.pQueueFamilyIndices = NULL;
- vk_swapchain_desc.preTransform = surface_caps.currentTransform;
- vk_swapchain_desc.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
- vk_swapchain_desc.presentMode = VK_PRESENT_MODE_FIFO_KHR;
- vk_swapchain_desc.clipped = VK_TRUE;
- vk_swapchain_desc.oldSwapchain = VK_NULL_HANDLE;
- if ((vr = vk_funcs->p_vkCreateSwapchainKHR(vk_device, &vk_swapchain_desc, NULL, &vk_swapchain)) < 0)
- {
- WARN("Failed to create Vulkan swapchain, vr %d.\n", vr);
- d3d12_swapchain_destroy(swapchain);
- return hresult_from_vk_result(vr);
- }
- swapchain->vk_swapchain = vk_swapchain;
-
fence_desc.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fence_desc.pNext = NULL;
fence_desc.flags = 0;
@@ -2338,13 +2357,6 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
}
swapchain->vk_fence = vk_fence;
- if (FAILED(hr = d3d12_swapchain_create_buffers(swapchain, device, queue,
- swapchain_desc, vk_swapchain_format, vk_format)))
- {
- d3d12_swapchain_destroy(swapchain);
- return hr;
- }
-
if (FAILED(hr = d3d12_swapchain_acquire_next_image(swapchain)))
{
WARN("Failed to acquire Vulkan image, hr %#x.\n", hr);
@@ -2352,8 +2364,6 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
return hr;
}
- ID3D12CommandQueue_AddRef(swapchain->command_queue = queue);
- ID3D12Device_AddRef(swapchain->device = device);
IWineDXGIFactory_AddRef(swapchain->factory = factory);
return S_OK;
--
2.16.4
More information about the wine-devel
mailing list