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
August 2018
- 62 participants
- 701 discussions
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/swapchain.c | 118 +++++++++++++++++++++++++++++++++++++-------------
1 file changed, 88 insertions(+), 30 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 71183f6f20bf..b285f3d33e0a 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1344,6 +1344,34 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
return S_OK;
}
+static HRESULT d3d12_swapchain_acquire_next_image(struct d3d12_swapchain *swapchain)
+{
+ const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
+ VkDevice vk_device = swapchain->vk_device;
+ VkFence vk_fence = swapchain->vk_fence;
+ VkResult vr;
+
+ if ((vr = vk_funcs->p_vkAcquireNextImageKHR(vk_device, swapchain->vk_swapchain, UINT64_MAX,
+ VK_NULL_HANDLE, vk_fence, &swapchain->current_buffer_index)) < 0)
+ {
+ ERR("Failed to acquire next Vulkan image, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ if ((vr = vk_funcs->p_vkWaitForFences(vk_device, 1, &vk_fence, VK_TRUE, UINT64_MAX)) != VK_SUCCESS)
+ {
+ ERR("Failed to wait for fence, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+ if ((vr = vk_funcs->p_vkResetFences(vk_device, 1, &vk_fence)) < 0)
+ {
+ ERR("Failed to reset fence, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ return S_OK;
+}
+
static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
@@ -1700,10 +1728,68 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetDesc(IDXGISwapChain3 *iface,
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *iface,
UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags)
{
- FIXME("iface %p, buffer_count %u, width %u, height %u, format %s, flags %#x stub!\n",
+ struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain3(iface);
+ DXGI_SWAP_CHAIN_DESC1 *desc;
+ unsigned int i;
+ ULONG refcount;
+ HRESULT hr;
+
+ TRACE("iface %p, buffer_count %u, width %u, height %u, format %s, flags %#x.\n",
iface, buffer_count, width, height, debug_dxgi_format(format), flags);
- return E_NOTIMPL;
+ if (flags)
+ FIXME("Ignoring flags %#x.\n", flags);
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ ID3D12Resource_AddRef(swapchain->buffers[i]);
+ if ((refcount = ID3D12Resource_Release(swapchain->buffers[i])))
+ {
+ WARN("Buffer %p has %u references left.\n", swapchain->buffers[i], refcount);
+ return DXGI_ERROR_INVALID_CALL;
+ }
+ }
+
+ desc = &swapchain->desc;
+
+ if (!buffer_count)
+ buffer_count = desc->BufferCount;
+ if (!width || !height)
+ {
+ RECT client_rect;
+
+ if (!GetClientRect(swapchain->window, &client_rect))
+ {
+ WARN("Failed to get client rect, last error %#x.\n", GetLastError());
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
+ if (!width)
+ width = client_rect.right;
+ if (!height)
+ height = client_rect.bottom;
+ }
+ if (!format)
+ format = desc->Format;
+
+ if (desc->Width == width && desc->Height == height
+ && desc->Format == format && desc->BufferCount == buffer_count)
+ return S_OK;
+
+ d3d12_swapchain_destroy_buffers(swapchain);
+
+ desc->Width = width;
+ desc->Height = height;
+ desc->Format = format;
+ desc->BufferCount = buffer_count;
+
+ if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
+ {
+ ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
+ return hr;
+ }
+
+ return d3d12_swapchain_acquire_next_image(swapchain);
}
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeTarget(IDXGISwapChain3 *iface,
@@ -1800,34 +1886,6 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_GetCoreWindow(IDXGISwapChain3 *
return DXGI_ERROR_INVALID_CALL;
}
-static HRESULT d3d12_swapchain_acquire_next_image(struct d3d12_swapchain *swapchain)
-{
- const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
- VkDevice vk_device = swapchain->vk_device;
- VkFence vk_fence = swapchain->vk_fence;
- VkResult vr;
-
- if ((vr = vk_funcs->p_vkAcquireNextImageKHR(vk_device, swapchain->vk_swapchain, UINT64_MAX,
- VK_NULL_HANDLE, vk_fence, &swapchain->current_buffer_index)) < 0)
- {
- ERR("Failed to acquire next Vulkan image, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
-
- if ((vr = vk_funcs->p_vkWaitForFences(vk_device, 1, &vk_fence, VK_TRUE, UINT64_MAX)) != VK_SUCCESS)
- {
- ERR("Failed to wait for fence, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
- if ((vr = vk_funcs->p_vkResetFences(vk_device, 1, &vk_fence)) < 0)
- {
- ERR("Failed to reset fence, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
-
- return S_OK;
-}
-
static HRESULT d3d12_swapchain_blit_buffer(struct d3d12_swapchain *swapchain, VkQueue vk_queue)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
--
2.16.4
2
1
29 Aug '18
Signed-off-by: Józef Kucia <jkucia(a)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
2
1
29 Aug '18
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/swapchain.c | 84 +++++++++++++++++++++++++++++++--------------------
1 file changed, 51 insertions(+), 33 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index a2fc37d7efb9..0b651c4853bd 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1345,6 +1345,52 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
return S_OK;
}
+static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain)
+{
+ const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
+ VkQueue vk_queue;
+ unsigned int i;
+
+ if (swapchain->command_queue)
+ {
+ if ((vk_queue = vkd3d_acquire_vk_queue(swapchain->command_queue)))
+ {
+ vk_funcs->p_vkQueueWaitIdle(vk_queue);
+
+ vkd3d_release_vk_queue(swapchain->command_queue);
+ }
+ else
+ {
+ WARN("Failed to acquire Vulkan queue.\n");
+ }
+ }
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ if (swapchain->buffers[i])
+ {
+ vkd3d_resource_decref(swapchain->buffers[i]);
+ swapchain->buffers[i] = NULL;
+ }
+
+ if (swapchain->vk_device)
+ {
+ vk_funcs->p_vkDestroyImage(swapchain->vk_device, swapchain->vk_images[i], NULL);
+ swapchain->vk_images[i] = VK_NULL_HANDLE;
+ vk_funcs->p_vkDestroySemaphore(swapchain->vk_device, swapchain->vk_semaphores[i], NULL);
+ swapchain->vk_semaphores[i] = VK_NULL_HANDLE;
+ }
+ }
+
+ if (swapchain->vk_device)
+ {
+ vk_funcs->p_vkFreeMemory(swapchain->vk_device, swapchain->vk_memory, NULL);
+ swapchain->vk_memory = VK_NULL_HANDLE;
+ vk_funcs->p_vkDestroyCommandPool(swapchain->vk_device, swapchain->vk_cmd_pool, NULL);
+ swapchain->vk_cmd_pool = VK_NULL_HANDLE;
+ }
+}
+
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface)
{
return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain3_iface);
@@ -1388,49 +1434,18 @@ static ULONG STDMETHODCALLTYPE d3d12_swapchain_AddRef(IDXGISwapChain3 *iface)
static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
- VkQueue vk_queue;
- unsigned int i;
+
+ d3d12_swapchain_destroy_buffers(swapchain);
if (swapchain->command_queue)
- {
- if ((vk_queue = vkd3d_acquire_vk_queue(swapchain->command_queue)))
- {
- vk_funcs->p_vkQueueWaitIdle(vk_queue);
-
- vkd3d_release_vk_queue(swapchain->command_queue);
- }
- else
- {
- WARN("Failed to acquire Vulkan queue.\n");
- }
-
ID3D12CommandQueue_Release(swapchain->command_queue);
- }
-
- if (swapchain->factory)
- IWineDXGIFactory_Release(swapchain->factory);
wined3d_private_store_cleanup(&swapchain->private_store);
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- if (swapchain->buffers[i])
- vkd3d_resource_decref(swapchain->buffers[i]);
-
- if (swapchain->vk_device)
- {
- vk_funcs->p_vkDestroyImage(swapchain->vk_device, swapchain->vk_images[i], NULL);
- vk_funcs->p_vkDestroySemaphore(swapchain->vk_device, swapchain->vk_semaphores[i], NULL);
- }
- }
-
if (swapchain->vk_device)
{
vk_funcs->p_vkDestroyFence(swapchain->vk_device, swapchain->vk_fence, NULL);
vk_funcs->p_vkDestroySwapchainKHR(swapchain->vk_device, swapchain->vk_swapchain, NULL);
-
- vk_funcs->p_vkFreeMemory(swapchain->vk_device, swapchain->vk_memory, NULL);
- vk_funcs->p_vkDestroyCommandPool(swapchain->vk_device, swapchain->vk_cmd_pool, NULL);
}
if (swapchain->vk_instance)
@@ -1438,6 +1453,9 @@ static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain)
if (swapchain->device)
ID3D12Device_Release(swapchain->device);
+
+ if (swapchain->factory)
+ IWineDXGIFactory_Release(swapchain->factory);
}
static ULONG STDMETHODCALLTYPE d3d12_swapchain_Release(IDXGISwapChain3 *iface)
--
2.16.4
2
1
[PATCH 1/6] dxgi: Move D3D12 helper functions closer to the top of the file.
by Józef Kucia 29 Aug '18
by Józef Kucia 29 Aug '18
29 Aug '18
We need to re-create a Vulkan swapchain in ResizeBuffers().
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/swapchain.c | 872 +++++++++++++++++++++++++-------------------------
1 file changed, 436 insertions(+), 436 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 101f2d185e17..a2fc37d7efb9 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -909,6 +909,442 @@ struct d3d12_swapchain
DXGI_SWAP_CHAIN_FULLSCREEN_DESC fullscreen_desc;
};
+static DXGI_FORMAT dxgi_format_from_vk_format(VkFormat vk_format)
+{
+ switch (vk_format)
+ {
+ case VK_FORMAT_B8G8R8A8_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
+ case VK_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM;
+ case VK_FORMAT_R8G8B8A8_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
+ case VK_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM;
+ default:
+ WARN("Unhandled format %#x.\n", vk_format);
+ return DXGI_FORMAT_UNKNOWN;
+ }
+}
+
+static VkFormat get_swapchain_fallback_format(VkFormat vk_format)
+{
+ switch (vk_format)
+ {
+ case VK_FORMAT_R8G8B8A8_SRGB: return VK_FORMAT_B8G8R8A8_SRGB;
+ case VK_FORMAT_R8G8B8A8_UNORM: return VK_FORMAT_B8G8R8A8_UNORM;
+ default:
+ WARN("Unhandled format %#x.\n", vk_format);
+ return VK_FORMAT_UNDEFINED;
+ }
+}
+
+static HRESULT select_vk_format(const struct dxgi_vk_funcs *vk_funcs,
+ VkPhysicalDevice vk_physical_device, VkSurfaceKHR vk_surface,
+ const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat *vk_format)
+{
+ VkSurfaceFormatKHR *formats;
+ uint32_t format_count;
+ VkFormat format;
+ unsigned int i;
+ VkResult vr;
+
+ *vk_format = VK_FORMAT_UNDEFINED;
+
+ format = vkd3d_get_vk_format(swapchain_desc->Format);
+
+ vr = vk_funcs->p_vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device, vk_surface, &format_count, NULL);
+ if (vr < 0 || !format_count)
+ {
+ WARN("Failed to get supported surface formats, vr %d.\n", vr);
+ return DXGI_ERROR_INVALID_CALL;
+ }
+
+ if (!(formats = heap_calloc(format_count, sizeof(*formats))))
+ return E_OUTOFMEMORY;
+
+ if ((vr = vk_funcs->p_vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device,
+ vk_surface, &format_count, formats)) < 0)
+ {
+ WARN("Failed to enumerate supported surface formats, vr %d.\n", vr);
+ heap_free(formats);
+ return hresult_from_vk_result(vr);
+ }
+
+ for (i = 0; i < format_count; ++i)
+ {
+ if (formats[i].format == format && formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
+ break;
+ }
+ if (i == format_count)
+ {
+ /* Try to create a swapchain with format conversion. */
+ format = get_swapchain_fallback_format(format);
+ WARN("Failed to find Vulkan swapchain format for %s.\n", debug_dxgi_format(swapchain_desc->Format));
+ for (i = 0; i < format_count; ++i)
+ {
+ if (formats[i].format == format && formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
+ {
+ format = formats[i].format;
+ break;
+ }
+ }
+ }
+ heap_free(formats);
+ if (i == format_count)
+ {
+ FIXME("Failed to find Vulkan swapchain format for %s.\n", debug_dxgi_format(swapchain_desc->Format));
+ return DXGI_ERROR_UNSUPPORTED;
+ }
+
+ TRACE("Using Vulkan swapchain format %#x.\n", format);
+
+ *vk_format = format;
+ return S_OK;
+}
+
+static HRESULT vk_select_memory_type(const struct dxgi_vk_funcs *vk_funcs,
+ VkPhysicalDevice vk_physical_device, uint32_t memory_type_mask,
+ VkMemoryPropertyFlags flags, uint32_t *memory_type_index)
+{
+ VkPhysicalDeviceMemoryProperties memory_properties;
+ unsigned int i;
+
+ vk_funcs->p_vkGetPhysicalDeviceMemoryProperties(vk_physical_device, &memory_properties);
+ for (i = 0; i < memory_properties.memoryTypeCount; ++i)
+ {
+ if (!(memory_type_mask & (1u << i)))
+ continue;
+
+ if ((memory_properties.memoryTypes[i].propertyFlags & flags) == flags)
+ {
+ *memory_type_index = i;
+ return S_OK;
+ }
+ }
+
+ FIXME("Failed to find memory type (allowed types %#x).\n", memory_type_mask);
+ return E_FAIL;
+}
+
+static HRESULT d3d12_swapchain_create_user_buffers(struct d3d12_swapchain *swapchain,
+ const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat vk_format)
+{
+ const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
+ VkDeviceSize image_offset[DXGI_MAX_SWAP_CHAIN_BUFFERS];
+ VkDevice vk_device = swapchain->vk_device;
+ VkMemoryAllocateInfo allocate_info;
+ VkMemoryRequirements requirements;
+ VkImageCreateInfo image_info;
+ uint32_t memory_type_mask;
+ VkDeviceSize memory_size;
+ unsigned int i;
+ VkResult vr;
+ HRESULT hr;
+
+ memset(&image_info, 0, sizeof(image_info));
+ image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ 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.depth = 1;
+ image_info.mipLevels = 1;
+ image_info.arrayLayers = 1;
+ image_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
+ | VK_IMAGE_USAGE_TRANSFER_DST_BIT
+ | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ image_info.queueFamilyIndexCount = 0;
+ image_info.pQueueFamilyIndices = NULL;
+ image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ if ((vr = vk_funcs->p_vkCreateImage(vk_device, &image_info, NULL, &swapchain->vk_images[i])) < 0)
+ {
+ WARN("Failed to create Vulkan image, vr %d.\n", vr);
+ swapchain->vk_images[i] = VK_NULL_HANDLE;
+ return hresult_from_vk_result(vr);
+ }
+ }
+
+ memory_size = 0;
+ memory_type_mask = ~0u;
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ vk_funcs->p_vkGetImageMemoryRequirements(vk_device, swapchain->vk_images[i], &requirements);
+
+ TRACE("Size %s, alignment %s, memory types %#x.\n",
+ wine_dbgstr_longlong(requirements.size), wine_dbgstr_longlong(requirements.alignment),
+ requirements.memoryTypeBits);
+
+ image_offset[i] = (memory_size + (requirements.alignment - 1)) & ~(requirements.alignment - 1);
+ memory_size = image_offset[i] + requirements.size;
+
+ memory_type_mask &= requirements.memoryTypeBits;
+ }
+
+ TRACE("Allocating %s bytes for user images.\n", wine_dbgstr_longlong(memory_size));
+
+ allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ allocate_info.pNext = NULL;
+ allocate_info.allocationSize = memory_size;
+
+ if (FAILED(hr = vk_select_memory_type(vk_funcs, swapchain->vk_physical_device,
+ memory_type_mask, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &allocate_info.memoryTypeIndex)))
+ return hr;
+
+ if ((vr = vk_funcs->p_vkAllocateMemory(vk_device, &allocate_info, NULL, &swapchain->vk_memory)) < 0)
+ {
+ WARN("Failed to allocate device memory, vr %d.\n", vr);
+ swapchain->vk_memory = VK_NULL_HANDLE;
+ return hresult_from_vk_result(vr);
+ }
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ if ((vr = vk_funcs->p_vkBindImageMemory(vk_device, swapchain->vk_images[i],
+ swapchain->vk_memory, image_offset[i])) < 0)
+ {
+ WARN("Failed to bind image memory, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+ }
+
+ return S_OK;
+}
+
+static void vk_cmd_image_barrier(const struct dxgi_vk_funcs *vk_funcs, VkCommandBuffer cmd_buffer,
+ VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,
+ VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask,
+ VkImageLayout old_layout, VkImageLayout new_layout, VkImage image)
+{
+ VkImageMemoryBarrier barrier;
+
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.pNext = NULL;
+ barrier.srcAccessMask = src_access_mask;
+ barrier.dstAccessMask = dst_access_mask;
+ barrier.oldLayout = old_layout;
+ barrier.newLayout = new_layout;
+ barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
+ barrier.image = image;
+ barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ barrier.subresourceRange.baseMipLevel = 0;
+ barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
+ barrier.subresourceRange.baseArrayLayer = 0;
+ barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
+
+ vk_funcs->p_vkCmdPipelineBarrier(cmd_buffer,
+ src_stage_mask, dst_stage_mask, 0, 0, NULL, 0, NULL, 1, &barrier);
+}
+
+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])
+{
+ const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
+ VkDevice vk_device = swapchain->vk_device;
+ VkCommandBufferAllocateInfo allocate_info;
+ VkSemaphoreCreateInfo semaphore_info;
+ VkCommandBufferBeginInfo begin_info;
+ VkCommandPoolCreateInfo pool_info;
+ VkImageBlit blit;
+ unsigned int i;
+ VkResult vr;
+
+ pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
+ pool_info.pNext = NULL;
+ pool_info.flags = 0;
+ pool_info.queueFamilyIndex = queue_family_index;
+
+ if ((vr = vk_funcs->p_vkCreateCommandPool(vk_device, &pool_info,
+ NULL, &swapchain->vk_cmd_pool)) < 0)
+ {
+ WARN("Failed to create command pool, vr %d.\n", vr);
+ swapchain->vk_cmd_pool = VK_NULL_HANDLE;
+ return hresult_from_vk_result(vr);
+ }
+
+ allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
+ allocate_info.pNext = NULL;
+ allocate_info.commandPool = swapchain->vk_cmd_pool;
+ allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
+ allocate_info.commandBufferCount = swapchain->buffer_count;
+
+ if ((vr = vk_funcs->p_vkAllocateCommandBuffers(vk_device, &allocate_info,
+ swapchain->vk_cmd_buffers)) < 0)
+ {
+ WARN("Failed to allocate command buffers, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ VkCommandBuffer vk_cmd_buffer = swapchain->vk_cmd_buffers[i];
+
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ begin_info.pNext = NULL;
+ begin_info.flags = 0;
+ begin_info.pInheritanceInfo = NULL;
+
+ if ((vr = vk_funcs->p_vkBeginCommandBuffer(vk_cmd_buffer, &begin_info)) < 0)
+ {
+ WARN("Failed to begin command buffer, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ vk_cmd_image_barrier(vk_funcs, vk_cmd_buffer,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ 0, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ vk_swapchain_images[i]);
+
+ blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ blit.srcSubresource.mipLevel = 0;
+ blit.srcSubresource.baseArrayLayer = 0;
+ blit.srcSubresource.layerCount = 1;
+ 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].z = 1;
+ blit.dstSubresource = blit.srcSubresource;
+ blit.dstOffsets[0] = blit.srcOffsets[0];
+ blit.dstOffsets[1] = blit.srcOffsets[1];
+
+ vk_funcs->p_vkCmdBlitImage(vk_cmd_buffer,
+ swapchain->vk_images[i], VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ vk_swapchain_images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ 1, &blit, VK_FILTER_NEAREST);
+
+ vk_cmd_image_barrier(vk_funcs, vk_cmd_buffer,
+ VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ VK_ACCESS_TRANSFER_WRITE_BIT, 0,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ vk_swapchain_images[i]);
+
+ if ((vr = vk_funcs->p_vkEndCommandBuffer(vk_cmd_buffer)) < 0)
+ {
+ WARN("Failed to end command buffer, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+ }
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
+ semaphore_info.pNext = NULL;
+ semaphore_info.flags = 0;
+
+ if ((vr = vk_funcs->p_vkCreateSemaphore(vk_device, &semaphore_info,
+ NULL, &swapchain->vk_semaphores[i])) < 0)
+ {
+ WARN("Failed to create semaphore, vr %d.\n", vr);
+ swapchain->vk_semaphores[i] = VK_NULL_HANDLE;
+ return hresult_from_vk_result(vr);
+ }
+ }
+
+ return S_OK;
+}
+
+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)
+{
+ 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;
+ VkDevice vk_device = swapchain->vk_device;
+ uint32_t image_count, queue_family_index;
+ D3D12_COMMAND_QUEUE_DESC queue_desc;
+ unsigned int i;
+ VkResult vr;
+ HRESULT hr;
+
+ if ((vr = vk_funcs->p_vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &image_count, NULL)) < 0)
+ {
+ 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 > ARRAY_SIZE(vk_swapchain_images))
+ return E_FAIL;
+ swapchain->buffer_count = image_count;
+ if ((vr = vk_funcs->p_vkGetSwapchainImagesKHR(vk_device, vk_swapchain,
+ &image_count, vk_swapchain_images)) < 0)
+ {
+ WARN("Failed to get Vulkan swapchain images, vr %d.\n", vr);
+ return hresult_from_vk_result(vr);
+ }
+
+ resource_info.type = VKD3D_STRUCTURE_TYPE_IMAGE_RESOURCE_CREATE_INFO;
+ 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.DepthOrArraySize = 1;
+ resource_info.desc.MipLevels = 1;
+ resource_info.desc.Format = dxgi_format_from_vk_format(vk_format);
+ resource_info.desc.SampleDesc.Count = 1;
+ resource_info.desc.SampleDesc.Quality = 0;
+ resource_info.desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+ resource_info.desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
+ resource_info.flags = VKD3D_RESOURCE_INITIAL_STATE_TRANSITION | VKD3D_RESOURCE_PRESENT_STATE_TRANSITION;
+
+ if (vk_swapchain_format != vk_format)
+ {
+ queue_desc = ID3D12CommandQueue_GetDesc(queue);
+ if (queue_desc.Type != D3D12_COMMAND_LIST_TYPE_DIRECT)
+ {
+ /* vkCmdBlitImage() is only supported for Graphics queues. */
+ FIXME("Format conversion not implemented for command queue type %#x.\n", queue_desc.Type);
+ return E_NOTIMPL;
+ }
+ queue_family_index = vkd3d_get_vk_queue_family_index(queue);
+
+ TRACE("Creating user swapchain buffers for format conversion.\n");
+
+ if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain, swapchain_desc, vk_format)))
+ return hr;
+
+ if (FAILED(hr = d3d12_swapchain_prepare_command_buffers(swapchain, swapchain_desc,
+ queue_family_index, vk_swapchain_images)))
+ return hr;
+ }
+
+ for (i = 0; i < swapchain->buffer_count; ++i)
+ {
+ if (swapchain->vk_images[i])
+ {
+ resource_info.vk_image = swapchain->vk_images[i];
+ resource_info.present_state = D3D12_RESOURCE_STATE_COPY_SOURCE;
+ }
+ else
+ {
+ resource_info.vk_image = vk_swapchain_images[i];
+ resource_info.present_state = D3D12_RESOURCE_STATE_PRESENT;
+ }
+
+ if (FAILED(hr = vkd3d_create_image_resource(device, &resource_info, &swapchain->buffers[i])))
+ {
+ WARN("Failed to create vkd3d resource for Vulkan image %u, hr %#x.\n", i, hr);
+ return hr;
+ }
+
+ vkd3d_resource_incref(swapchain->buffers[i]);
+ ID3D12Resource_Release(swapchain->buffers[i]);
+ }
+
+ return S_OK;
+}
+
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface)
{
return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain3_iface);
@@ -1694,442 +2130,6 @@ static BOOL init_vk_funcs(struct dxgi_vk_funcs *dxgi, VkInstance vk_instance, Vk
return TRUE;
}
-static DXGI_FORMAT dxgi_format_from_vk_format(VkFormat vk_format)
-{
- switch (vk_format)
- {
- case VK_FORMAT_B8G8R8A8_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
- case VK_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM;
- case VK_FORMAT_R8G8B8A8_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
- case VK_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM;
- default:
- WARN("Unhandled format %#x.\n", vk_format);
- return DXGI_FORMAT_UNKNOWN;
- }
-}
-
-static VkFormat get_swapchain_fallback_format(VkFormat vk_format)
-{
- switch (vk_format)
- {
- case VK_FORMAT_R8G8B8A8_SRGB: return VK_FORMAT_B8G8R8A8_SRGB;
- case VK_FORMAT_R8G8B8A8_UNORM: return VK_FORMAT_B8G8R8A8_UNORM;
- default:
- WARN("Unhandled format %#x.\n", vk_format);
- return VK_FORMAT_UNDEFINED;
- }
-}
-
-static HRESULT select_vk_format(const struct dxgi_vk_funcs *vk_funcs,
- VkPhysicalDevice vk_physical_device, VkSurfaceKHR vk_surface,
- const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat *vk_format)
-{
- VkSurfaceFormatKHR *formats;
- uint32_t format_count;
- VkFormat format;
- unsigned int i;
- VkResult vr;
-
- *vk_format = VK_FORMAT_UNDEFINED;
-
- format = vkd3d_get_vk_format(swapchain_desc->Format);
-
- vr = vk_funcs->p_vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device, vk_surface, &format_count, NULL);
- if (vr < 0 || !format_count)
- {
- WARN("Failed to get supported surface formats, vr %d.\n", vr);
- return DXGI_ERROR_INVALID_CALL;
- }
-
- if (!(formats = heap_calloc(format_count, sizeof(*formats))))
- return E_OUTOFMEMORY;
-
- if ((vr = vk_funcs->p_vkGetPhysicalDeviceSurfaceFormatsKHR(vk_physical_device,
- vk_surface, &format_count, formats)) < 0)
- {
- WARN("Failed to enumerate supported surface formats, vr %d.\n", vr);
- heap_free(formats);
- return hresult_from_vk_result(vr);
- }
-
- for (i = 0; i < format_count; ++i)
- {
- if (formats[i].format == format && formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
- break;
- }
- if (i == format_count)
- {
- /* Try to create a swapchain with format conversion. */
- format = get_swapchain_fallback_format(format);
- WARN("Failed to find Vulkan swapchain format for %s.\n", debug_dxgi_format(swapchain_desc->Format));
- for (i = 0; i < format_count; ++i)
- {
- if (formats[i].format == format && formats[i].colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
- {
- format = formats[i].format;
- break;
- }
- }
- }
- heap_free(formats);
- if (i == format_count)
- {
- FIXME("Failed to find Vulkan swapchain format for %s.\n", debug_dxgi_format(swapchain_desc->Format));
- return DXGI_ERROR_UNSUPPORTED;
- }
-
- TRACE("Using Vulkan swapchain format %#x.\n", format);
-
- *vk_format = format;
- return S_OK;
-}
-
-static HRESULT vk_select_memory_type(const struct dxgi_vk_funcs *vk_funcs,
- VkPhysicalDevice vk_physical_device, uint32_t memory_type_mask,
- VkMemoryPropertyFlags flags, uint32_t *memory_type_index)
-{
- VkPhysicalDeviceMemoryProperties memory_properties;
- unsigned int i;
-
- vk_funcs->p_vkGetPhysicalDeviceMemoryProperties(vk_physical_device, &memory_properties);
- for (i = 0; i < memory_properties.memoryTypeCount; ++i)
- {
- if (!(memory_type_mask & (1u << i)))
- continue;
-
- if ((memory_properties.memoryTypes[i].propertyFlags & flags) == flags)
- {
- *memory_type_index = i;
- return S_OK;
- }
- }
-
- FIXME("Failed to find memory type (allowed types %#x).\n", memory_type_mask);
- return E_FAIL;
-}
-
-static HRESULT d3d12_swapchain_create_user_buffers(struct d3d12_swapchain *swapchain,
- const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, VkFormat vk_format)
-{
- const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
- VkDeviceSize image_offset[DXGI_MAX_SWAP_CHAIN_BUFFERS];
- VkDevice vk_device = swapchain->vk_device;
- VkMemoryAllocateInfo allocate_info;
- VkMemoryRequirements requirements;
- VkImageCreateInfo image_info;
- uint32_t memory_type_mask;
- VkDeviceSize memory_size;
- unsigned int i;
- VkResult vr;
- HRESULT hr;
-
- memset(&image_info, 0, sizeof(image_info));
- image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
- 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.depth = 1;
- image_info.mipLevels = 1;
- image_info.arrayLayers = 1;
- image_info.samples = VK_SAMPLE_COUNT_1_BIT;
- image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
- image_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT
- | VK_IMAGE_USAGE_TRANSFER_DST_BIT
- | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
- image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- image_info.queueFamilyIndexCount = 0;
- image_info.pQueueFamilyIndices = NULL;
- image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
-
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- if ((vr = vk_funcs->p_vkCreateImage(vk_device, &image_info, NULL, &swapchain->vk_images[i])) < 0)
- {
- WARN("Failed to create Vulkan image, vr %d.\n", vr);
- swapchain->vk_images[i] = VK_NULL_HANDLE;
- return hresult_from_vk_result(vr);
- }
- }
-
- memory_size = 0;
- memory_type_mask = ~0u;
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- vk_funcs->p_vkGetImageMemoryRequirements(vk_device, swapchain->vk_images[i], &requirements);
-
- TRACE("Size %s, alignment %s, memory types %#x.\n",
- wine_dbgstr_longlong(requirements.size), wine_dbgstr_longlong(requirements.alignment),
- requirements.memoryTypeBits);
-
- image_offset[i] = (memory_size + (requirements.alignment - 1)) & ~(requirements.alignment - 1);
- memory_size = image_offset[i] + requirements.size;
-
- memory_type_mask &= requirements.memoryTypeBits;
- }
-
- TRACE("Allocating %s bytes for user images.\n", wine_dbgstr_longlong(memory_size));
-
- allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- allocate_info.pNext = NULL;
- allocate_info.allocationSize = memory_size;
-
- if (FAILED(hr = vk_select_memory_type(vk_funcs, swapchain->vk_physical_device,
- memory_type_mask, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &allocate_info.memoryTypeIndex)))
- return hr;
-
- if ((vr = vk_funcs->p_vkAllocateMemory(vk_device, &allocate_info, NULL, &swapchain->vk_memory)) < 0)
- {
- WARN("Failed to allocate device memory, vr %d.\n", vr);
- swapchain->vk_memory = VK_NULL_HANDLE;
- return hresult_from_vk_result(vr);
- }
-
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- if ((vr = vk_funcs->p_vkBindImageMemory(vk_device, swapchain->vk_images[i],
- swapchain->vk_memory, image_offset[i])) < 0)
- {
- WARN("Failed to bind image memory, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
- }
-
- return S_OK;
-}
-
-static void vk_cmd_image_barrier(const struct dxgi_vk_funcs *vk_funcs, VkCommandBuffer cmd_buffer,
- VkPipelineStageFlags src_stage_mask, VkPipelineStageFlags dst_stage_mask,
- VkAccessFlags src_access_mask, VkAccessFlags dst_access_mask,
- VkImageLayout old_layout, VkImageLayout new_layout, VkImage image)
-{
- VkImageMemoryBarrier barrier;
-
- barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- barrier.pNext = NULL;
- barrier.srcAccessMask = src_access_mask;
- barrier.dstAccessMask = dst_access_mask;
- barrier.oldLayout = old_layout;
- barrier.newLayout = new_layout;
- barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
- barrier.image = image;
- barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- barrier.subresourceRange.baseMipLevel = 0;
- barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
- barrier.subresourceRange.baseArrayLayer = 0;
- barrier.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
-
- vk_funcs->p_vkCmdPipelineBarrier(cmd_buffer,
- src_stage_mask, dst_stage_mask, 0, 0, NULL, 0, NULL, 1, &barrier);
-}
-
-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])
-{
- const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
- VkDevice vk_device = swapchain->vk_device;
- VkCommandBufferAllocateInfo allocate_info;
- VkSemaphoreCreateInfo semaphore_info;
- VkCommandBufferBeginInfo begin_info;
- VkCommandPoolCreateInfo pool_info;
- VkImageBlit blit;
- unsigned int i;
- VkResult vr;
-
- pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
- pool_info.pNext = NULL;
- pool_info.flags = 0;
- pool_info.queueFamilyIndex = queue_family_index;
-
- if ((vr = vk_funcs->p_vkCreateCommandPool(vk_device, &pool_info,
- NULL, &swapchain->vk_cmd_pool)) < 0)
- {
- WARN("Failed to create command pool, vr %d.\n", vr);
- swapchain->vk_cmd_pool = VK_NULL_HANDLE;
- return hresult_from_vk_result(vr);
- }
-
- allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
- allocate_info.pNext = NULL;
- allocate_info.commandPool = swapchain->vk_cmd_pool;
- allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
- allocate_info.commandBufferCount = swapchain->buffer_count;
-
- if ((vr = vk_funcs->p_vkAllocateCommandBuffers(vk_device, &allocate_info,
- swapchain->vk_cmd_buffers)) < 0)
- {
- WARN("Failed to allocate command buffers, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
-
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- VkCommandBuffer vk_cmd_buffer = swapchain->vk_cmd_buffers[i];
-
- begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
- begin_info.pNext = NULL;
- begin_info.flags = 0;
- begin_info.pInheritanceInfo = NULL;
-
- if ((vr = vk_funcs->p_vkBeginCommandBuffer(vk_cmd_buffer, &begin_info)) < 0)
- {
- WARN("Failed to begin command buffer, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
-
- vk_cmd_image_barrier(vk_funcs, vk_cmd_buffer,
- VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
- 0, VK_ACCESS_TRANSFER_WRITE_BIT,
- VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- vk_swapchain_images[i]);
-
- blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- blit.srcSubresource.mipLevel = 0;
- blit.srcSubresource.baseArrayLayer = 0;
- blit.srcSubresource.layerCount = 1;
- 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].z = 1;
- blit.dstSubresource = blit.srcSubresource;
- blit.dstOffsets[0] = blit.srcOffsets[0];
- blit.dstOffsets[1] = blit.srcOffsets[1];
-
- vk_funcs->p_vkCmdBlitImage(vk_cmd_buffer,
- swapchain->vk_images[i], VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- vk_swapchain_images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- 1, &blit, VK_FILTER_NEAREST);
-
- vk_cmd_image_barrier(vk_funcs, vk_cmd_buffer,
- VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
- VK_ACCESS_TRANSFER_WRITE_BIT, 0,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
- vk_swapchain_images[i]);
-
- if ((vr = vk_funcs->p_vkEndCommandBuffer(vk_cmd_buffer)) < 0)
- {
- WARN("Failed to end command buffer, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
- }
-
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
- semaphore_info.pNext = NULL;
- semaphore_info.flags = 0;
-
- if ((vr = vk_funcs->p_vkCreateSemaphore(vk_device, &semaphore_info,
- NULL, &swapchain->vk_semaphores[i])) < 0)
- {
- WARN("Failed to create semaphore, vr %d.\n", vr);
- swapchain->vk_semaphores[i] = VK_NULL_HANDLE;
- return hresult_from_vk_result(vr);
- }
- }
-
- return S_OK;
-}
-
-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)
-{
- 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;
- VkDevice vk_device = swapchain->vk_device;
- uint32_t image_count, queue_family_index;
- D3D12_COMMAND_QUEUE_DESC queue_desc;
- unsigned int i;
- VkResult vr;
- HRESULT hr;
-
- if ((vr = vk_funcs->p_vkGetSwapchainImagesKHR(vk_device, vk_swapchain, &image_count, NULL)) < 0)
- {
- 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 > ARRAY_SIZE(vk_swapchain_images))
- return E_FAIL;
- swapchain->buffer_count = image_count;
- if ((vr = vk_funcs->p_vkGetSwapchainImagesKHR(vk_device, vk_swapchain,
- &image_count, vk_swapchain_images)) < 0)
- {
- WARN("Failed to get Vulkan swapchain images, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
-
- resource_info.type = VKD3D_STRUCTURE_TYPE_IMAGE_RESOURCE_CREATE_INFO;
- 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.DepthOrArraySize = 1;
- resource_info.desc.MipLevels = 1;
- resource_info.desc.Format = dxgi_format_from_vk_format(vk_format);
- resource_info.desc.SampleDesc.Count = 1;
- resource_info.desc.SampleDesc.Quality = 0;
- resource_info.desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
- resource_info.desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
- resource_info.flags = VKD3D_RESOURCE_INITIAL_STATE_TRANSITION | VKD3D_RESOURCE_PRESENT_STATE_TRANSITION;
-
- if (vk_swapchain_format != vk_format)
- {
- queue_desc = ID3D12CommandQueue_GetDesc(queue);
- if (queue_desc.Type != D3D12_COMMAND_LIST_TYPE_DIRECT)
- {
- /* vkCmdBlitImage() is only supported for Graphics queues. */
- FIXME("Format conversion not implemented for command queue type %#x.\n", queue_desc.Type);
- return E_NOTIMPL;
- }
- queue_family_index = vkd3d_get_vk_queue_family_index(queue);
-
- TRACE("Creating user swapchain buffers for format conversion.\n");
-
- if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain, swapchain_desc, vk_format)))
- return hr;
-
- if (FAILED(hr = d3d12_swapchain_prepare_command_buffers(swapchain, swapchain_desc,
- queue_family_index, vk_swapchain_images)))
- return hr;
- }
-
- for (i = 0; i < swapchain->buffer_count; ++i)
- {
- if (swapchain->vk_images[i])
- {
- resource_info.vk_image = swapchain->vk_images[i];
- resource_info.present_state = D3D12_RESOURCE_STATE_COPY_SOURCE;
- }
- else
- {
- resource_info.vk_image = vk_swapchain_images[i];
- resource_info.present_state = D3D12_RESOURCE_STATE_PRESENT;
- }
-
- if (FAILED(hr = vkd3d_create_image_resource(device, &resource_info, &swapchain->buffers[i])))
- {
- WARN("Failed to create vkd3d resource for Vulkan image %u, hr %#x.\n", i, hr);
- return hr;
- }
-
- vkd3d_resource_incref(swapchain->buffers[i]);
- ID3D12Resource_Release(swapchain->buffers[i]);
- }
-
- return S_OK;
-}
-
static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGIFactory *factory,
ID3D12Device *device, ID3D12CommandQueue *queue, HWND window,
const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc)
--
2.16.4
2
1
[PATCH 5/5] msi/tests: Add more tests for remote MsiSummaryInfoGetProperty.
by Dmitry Timoshkov 29 Aug '18
by Dmitry Timoshkov 29 Aug '18
29 Aug '18
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/msi/tests/custom.c | 69 +++++++++++++++++++++++++++--------------
1 file changed, 46 insertions(+), 23 deletions(-)
diff --git a/dlls/msi/tests/custom.c b/dlls/msi/tests/custom.c
index a727bbd4df..f06aee0675 100644
--- a/dlls/msi/tests/custom.c
+++ b/dlls/msi/tests/custom.c
@@ -277,10 +277,14 @@ static void test_props(MSIHANDLE hinst)
static void test_db(MSIHANDLE hinst)
{
+ static const UINT prop_type[20] = { VT_EMPTY, VT_EMPTY, VT_LPSTR, VT_EMPTY, VT_EMPTY,
+ VT_EMPTY, VT_EMPTY, VT_LPSTR, VT_EMPTY, VT_LPSTR,
+ VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_I4,
+ VT_I4, VT_EMPTY, VT_EMPTY, VT_EMPTY, VT_EMPTY };
MSIHANDLE hdb, view, rec, rec2, suminfo;
char buffer[10];
DWORD sz;
- UINT r, count, type;
+ UINT r, count, type, i;
INT int_value;
FILETIME ft;
@@ -466,30 +470,49 @@ static void test_db(MSIHANDLE hinst)
r = MsiSummaryInfoGetPropertyA(suminfo, 0, NULL, NULL, NULL, NULL, NULL);
ok(hinst, r == RPC_X_NULL_REF_POINTER, "got %u\n", r);
- type = 0xdeadbeef;
- int_value = 0xdeadbeef;
- strcpy(buffer, "deadbeef");
- sz = sizeof(buffer);
- r = MsiSummaryInfoGetPropertyA(suminfo, PID_AUTHOR, &type, &int_value, &ft, buffer, &sz);
- ok(hinst, !r, "got %u\n", r);
- ok(hinst, type == 0, "got %u\n", type);
- ok(hinst, int_value == 0, "got %u\n", int_value);
- ok(hinst, sz == sizeof(buffer), "got %u\n", sz);
- ok(hinst, !lstrcmpA(buffer, "deadbeef"), "got %s\n", buffer);
+ for (i = 0; i < 20; i++)
+ {
+ /* for some reason query for PID_TITLE leads to install failure under Windows */
+ if (i == PID_TITLE) continue;
+
+ type = 0xdeadbeef;
+ int_value = 0xdeadbeef;
+ *buffer = 0;
+ sz = sizeof(buffer);
+ r = MsiSummaryInfoGetPropertyA(suminfo, i, &type, &int_value, &ft, buffer, &sz);
+ if (sz == sizeof(buffer) || i == PID_TEMPLATE)
+ ok(hinst, !r, "%u: got %u\n", i, r);
+ else
+ ok(hinst, r == ERROR_MORE_DATA, "%u: got %u\n", i, r);
+ ok(hinst, type == prop_type[i], "%u: expected %u, got %u\n", i, prop_type[i], type);
+ if (i == PID_PAGECOUNT)
+ ok(hinst, int_value == 100, "%u: got %u\n", i, int_value);
+ else
+ ok(hinst, int_value == 0, "%u: got %u\n", i, int_value);
+ if (i == PID_TEMPLATE)
+ {
+ ok(hinst, sz == 5, "%u: got %u\n", i, sz);
+ ok(hinst, !lstrcmpA(buffer, ";1033"), "%u: got %s\n", i, buffer);
+ }
+ else if (i == PID_REVNUMBER)
+ {
+ ok(hinst, sz == 76, "%u: got %u\n", i, sz);
+ ok(hinst, !lstrcmpA(buffer, "{004757CA"), "%u: got %s\n", i, buffer);
+ }
+ else
+ {
+ ok(hinst, sz == sizeof(buffer), "%u: got %u\n", i, sz);
+ ok(hinst, !*buffer, "%u: got %s\n", i, buffer);
+ }
+ }
- type = 0xdeadbeef;
- int_value = 0xdeadbeef;
- strcpy(buffer, "deadbeef");
- sz = sizeof(buffer);
- r = MsiSummaryInfoGetPropertyA(suminfo, PID_CODEPAGE, &type, &int_value, &ft, buffer, &sz);
- ok(hinst, !r, "got %u\n", r);
- ok(hinst, type == 0, "got %u\n", type);
- ok(hinst, int_value == 0, "got %u\n", int_value);
- ok(hinst, sz == sizeof(buffer), "got %u\n", sz);
- ok(hinst, !lstrcmpA(buffer, "deadbeef"), "got %s\n", buffer);
+ GetSystemTimeAsFileTime(&ft);
- r = MsiSummaryInfoSetPropertyA(suminfo, PID_CODEPAGE, VT_I2, 1252, &ft, "");
- ok(hinst, r == ERROR_FUNCTION_FAILED, "got %u\n", r);
+ for (i = 0; i < 20; i++)
+ {
+ r = MsiSummaryInfoSetPropertyA(suminfo, i, prop_type[i], 1252, &ft, "");
+ ok(hinst, r == ERROR_FUNCTION_FAILED, "%u: got %u\n", i, r);
+ }
r = MsiSummaryInfoSetPropertyW(suminfo, PID_CODEPAGE, VT_I2, 1252, &ft, NULL);
ok(hinst, r == ERROR_FUNCTION_FAILED, "got %u\n", r);
--
2.17.1
2
1
29 Aug '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
include/vkd3d.h | 1 +
libs/vkd3d/utils.c | 18 +++++++++++++++
libs/vkd3d/vkd3d.map | 1 +
tests/vkd3d_api.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 84 insertions(+)
diff --git a/include/vkd3d.h b/include/vkd3d.h
index fcff16681fec..de805420f67a 100644
--- a/include/vkd3d.h
+++ b/include/vkd3d.h
@@ -144,6 +144,7 @@ HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_size,
REFIID iid, void **deserializer);
+DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format);
VkFormat vkd3d_get_vk_format(DXGI_FORMAT format);
#endif /* VKD3D_NO_PROTOTYPES */
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
index 11c46dd46ac7..682822e8b89a 100644
--- a/libs/vkd3d/utils.c
+++ b/libs/vkd3d/utils.c
@@ -200,6 +200,24 @@ bool dxgi_format_is_typeless(DXGI_FORMAT dxgi_format)
}
}
+DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format)
+{
+ DXGI_FORMAT dxgi_format;
+ VkFormat vk_format;
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(vkd3d_formats); ++i)
+ {
+ vk_format = vkd3d_formats[i].vk_format;
+ dxgi_format = vkd3d_formats[i].dxgi_format;
+ if (vk_format == format && !dxgi_format_is_typeless(dxgi_format))
+ return dxgi_format;
+ }
+
+ FIXME("Unhandled Vulkan format %#x.\n", format);
+ return DXGI_FORMAT_UNKNOWN;
+}
+
bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level)
{
static const D3D_FEATURE_LEVEL valid_feature_levels[] =
diff --git a/libs/vkd3d/vkd3d.map b/libs/vkd3d/vkd3d.map
index 7d0f83889957..f43c85c1f9d4 100644
--- a/libs/vkd3d/vkd3d.map
+++ b/libs/vkd3d/vkd3d.map
@@ -7,6 +7,7 @@ global:
vkd3d_create_instance;
vkd3d_create_root_signature_deserializer;
vkd3d_get_device_parent;
+ vkd3d_get_dxgi_format;
vkd3d_get_vk_device;
vkd3d_get_vk_format;
vkd3d_get_vk_physical_device;
diff --git a/tests/vkd3d_api.c b/tests/vkd3d_api.c
index 2c022ba1d575..e0912c549147 100644
--- a/tests/vkd3d_api.c
+++ b/tests/vkd3d_api.c
@@ -899,6 +899,69 @@ static void test_vulkan_resource_present_state(void)
destroy_test_context(&context);
}
+static void test_formats(void)
+{
+ DXGI_FORMAT dxgi_format, format;
+ VkFormat vk_format;
+ unsigned int i;
+
+ static const DXGI_FORMAT formats[] =
+ {
+ DXGI_FORMAT_R32G32B32A32_FLOAT,
+ DXGI_FORMAT_R32G32B32A32_UINT,
+ DXGI_FORMAT_R32G32B32A32_SINT,
+ DXGI_FORMAT_R32G32B32_FLOAT,
+ DXGI_FORMAT_R32G32B32_UINT,
+ DXGI_FORMAT_R32G32B32_SINT,
+ DXGI_FORMAT_R16G16B16A16_FLOAT,
+ DXGI_FORMAT_R16G16B16A16_UNORM,
+ DXGI_FORMAT_R16G16B16A16_UINT,
+ DXGI_FORMAT_R16G16B16A16_SNORM,
+ DXGI_FORMAT_R16G16B16A16_SINT,
+ DXGI_FORMAT_R32G32_FLOAT,
+ DXGI_FORMAT_R32G32_UINT,
+ DXGI_FORMAT_R32G32_SINT,
+ DXGI_FORMAT_R10G10B10A2_UNORM,
+ DXGI_FORMAT_R11G11B10_FLOAT,
+ DXGI_FORMAT_R8G8B8A8_UNORM,
+ DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
+ DXGI_FORMAT_R8G8B8A8_UINT,
+ DXGI_FORMAT_R8G8B8A8_SNORM,
+ DXGI_FORMAT_R8G8B8A8_SINT,
+ DXGI_FORMAT_R16G16_FLOAT,
+ DXGI_FORMAT_R16G16_UNORM,
+ DXGI_FORMAT_R16G16_UINT,
+ DXGI_FORMAT_R16G16_SNORM,
+ DXGI_FORMAT_R16G16_SINT,
+ DXGI_FORMAT_D32_FLOAT,
+ DXGI_FORMAT_R32_FLOAT,
+ DXGI_FORMAT_R32_UINT,
+ DXGI_FORMAT_R32_SINT,
+ DXGI_FORMAT_R8G8_UNORM,
+ DXGI_FORMAT_R8G8_UINT,
+ DXGI_FORMAT_R8G8_SNORM,
+ DXGI_FORMAT_R8G8_SINT,
+ DXGI_FORMAT_R16_FLOAT,
+ DXGI_FORMAT_D16_UNORM,
+ DXGI_FORMAT_R16_UNORM,
+ DXGI_FORMAT_R16_UINT,
+ DXGI_FORMAT_R16_SNORM,
+ DXGI_FORMAT_R16_SINT,
+ DXGI_FORMAT_R8_UNORM,
+ DXGI_FORMAT_R8_UINT,
+ DXGI_FORMAT_R8_SNORM,
+ DXGI_FORMAT_R8_SINT,
+ };
+
+ for (i = 0; i < ARRAY_SIZE(formats); ++i)
+ {
+ format = formats[i];
+ vk_format = vkd3d_get_vk_format(format);
+ dxgi_format = vkd3d_get_dxgi_format(vk_format);
+ ok(dxgi_format == format, "Got format %#x, expected %#x.\n", dxgi_format, format);
+ }
+}
+
static bool have_d3d12_device(void)
{
ID3D12Device *device;
@@ -927,4 +990,5 @@ START_TEST(vkd3d_api)
run_test(test_vkd3d_queue);
run_test(test_resource_internal_refcount);
run_test(test_vulkan_resource_present_state);
+ run_test(test_formats);
}
--
2.16.4
2
1
29 Aug '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/resource.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index b71313487d97..7acd00d44483 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1479,6 +1479,17 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
if (desc->u.Texture2D.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2D.ResourceMinLODClamp);
break;
+ case D3D12_SRV_DIMENSION_TEXTURE2DARRAY:
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MostDetailedMip;
+ vkd3d_desc.miplevel_count = desc->u.Texture2DArray.MipLevels;
+ vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
+ vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
+ if (desc->u.Texture2DArray.PlaneSlice)
+ FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
+ if (desc->u.Texture2DArray.ResourceMinLODClamp)
+ FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2DArray.ResourceMinLODClamp);
+ break;
case D3D12_SRV_DIMENSION_TEXTURE3D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;
vkd3d_desc.miplevel_idx = desc->u.Texture3D.MostDetailedMip;
@@ -1868,6 +1879,14 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
if (desc->u.Texture2D.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice);
break;
+ case D3D12_RTV_DIMENSION_TEXTURE2DARRAY:
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MipSlice;
+ vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
+ vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
+ if (desc->u.Texture2DArray.PlaneSlice)
+ FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice);
+ break;
case D3D12_RTV_DIMENSION_TEXTURE3D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture3D.MipSlice;
@@ -1952,6 +1971,12 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
case D3D12_DSV_DIMENSION_TEXTURE2D:
vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice;
break;
+ case D3D12_DSV_DIMENSION_TEXTURE2DARRAY:
+ vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
+ vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MipSlice;
+ vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice;
+ vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize;
+ break;
default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
}
--
2.16.4
2
1
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/utils.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
index 18e3aa18014b..11c46dd46ac7 100644
--- a/libs/vkd3d/utils.c
+++ b/libs/vkd3d/utils.c
@@ -29,22 +29,37 @@ static const struct vkd3d_format vkd3d_formats[] =
{DXGI_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_UINT, 16, 1, 1, 1, COLOR},
{DXGI_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_SINT, 16, 1, 1, 1, COLOR},
{DXGI_FORMAT_R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, 12, 1, 1, 1, COLOR},
- {DXGI_FORMAT_R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32_UINT, 12, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R32G32B32_SINT, VK_FORMAT_R32G32B32_SINT, 12, 1, 1, 1, COLOR},
{DXGI_FORMAT_R16G16B16A16_TYPELESS, VK_FORMAT_R16G16B16A16_SFLOAT, 8, 1, 1, 1, COLOR},
{DXGI_FORMAT_R16G16B16A16_FLOAT, VK_FORMAT_R16G16B16A16_SFLOAT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM, 8, 1, 1, 1, COLOR},
{DXGI_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R32G32_TYPELESS, VK_FORMAT_R32G32_SFLOAT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R32G32_UINT, VK_FORMAT_R32G32_UINT, 8, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R32G32_SINT, VK_FORMAT_R32G32_SINT, 8, 1, 1, 1, COLOR},
{DXGI_FORMAT_R10G10B10A2_UNORM, VK_FORMAT_A2B10G10R10_UNORM_PACK32, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R11G11B10_FLOAT, VK_FORMAT_B10G11R11_UFLOAT_PACK32, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8_TYPELESS, VK_FORMAT_R8G8_UNORM, 2, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8_UNORM, VK_FORMAT_R8G8_UNORM, 2, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UINT, 2, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_SNORM, 2, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R8G8_SINT, VK_FORMAT_R8G8_SINT, 2, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8B8A8_TYPELESS, VK_FORMAT_R8G8B8A8_UNORM, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, VK_FORMAT_R8G8B8A8_SRGB, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UINT, 4, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SNORM, 4, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SINT, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R16G16_TYPELESS, VK_FORMAT_R16G16_SFLOAT, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R16G16_FLOAT, VK_FORMAT_R16G16_SFLOAT, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R16G16_UNORM, VK_FORMAT_R16G16_UNORM, 4, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16G16_UINT, VK_FORMAT_R16G16_UINT, 4, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16G16_SNORM, VK_FORMAT_R16G16_SNORM, 4, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SINT, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_R32_TYPELESS, VK_FORMAT_R32_UINT, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_D32_FLOAT, VK_FORMAT_D32_SFLOAT, 4, 1, 1, 1, DEPTH},
{DXGI_FORMAT_R32_FLOAT, VK_FORMAT_R32_SFLOAT, 4, 1, 1, 1, COLOR},
@@ -54,10 +69,14 @@ static const struct vkd3d_format vkd3d_formats[] =
{DXGI_FORMAT_R16_FLOAT, VK_FORMAT_R16_SFLOAT, 2, 1, 1, 1, COLOR},
{DXGI_FORMAT_D16_UNORM, VK_FORMAT_D16_UNORM, 2, 1, 1, 1, DEPTH},
{DXGI_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, 2, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16_UINT, VK_FORMAT_R16_UINT, 2, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16_SNORM, VK_FORMAT_R16_SNORM, 2, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R16_SINT, VK_FORMAT_R16_SINT, 2, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8_TYPELESS, VK_FORMAT_R8_UNORM, 1, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, 1, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8_UINT, VK_FORMAT_R8_UINT, 1, 1, 1, 1, COLOR},
{DXGI_FORMAT_R8_SNORM, VK_FORMAT_R8_SNORM, 1, 1, 1, 1, COLOR},
+ {DXGI_FORMAT_R8_SINT, VK_FORMAT_R8_SINT, 1, 1, 1, 1, COLOR},
{DXGI_FORMAT_A8_UNORM, VK_FORMAT_R8_UNORM, 1, 1, 1, 1, COLOR},
{DXGI_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM, 4, 1, 1, 1, COLOR},
{DXGI_FORMAT_B8G8R8A8_TYPELESS, VK_FORMAT_B8G8R8A8_UNORM, 4, 1, 1, 1, COLOR},
--
2.16.4
2
1
[PATCH vkd3d 7/9] vkd3d: Create vkd3d_views in vkd3d_create_texture_view().
by Józef Kucia 29 Aug '18
by Józef Kucia 29 Aug '18
29 Aug '18
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/resource.c | 51 ++++++++++++++++++++++-----------------------------
1 file changed, 22 insertions(+), 29 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 7acd00d44483..d97c3dbeb88b 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -1327,13 +1327,15 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
return true;
}
-static VkResult vkd3d_create_texture_view(struct d3d12_device *device,
+static HRESULT vkd3d_create_texture_view(struct d3d12_device *device,
struct d3d12_resource *resource, const struct vkd3d_texture_view_desc *desc,
- VkImageView *vk_view)
+ struct vkd3d_view **view)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
const struct vkd3d_format *format = desc->format;
struct VkImageViewCreateInfo view_desc;
+ struct vkd3d_view *object;
+ VkImageView vk_view;
VkResult vr;
assert(d3d12_resource_is_texture(resource));
@@ -1350,9 +1352,21 @@ static VkResult vkd3d_create_texture_view(struct d3d12_device *device,
view_desc.subresourceRange.levelCount = desc->miplevel_count;
view_desc.subresourceRange.baseArrayLayer = desc->layer_idx;
view_desc.subresourceRange.layerCount = desc->layer_count;
- if ((vr = VK_CALL(vkCreateImageView(device->vk_device, &view_desc, NULL, vk_view))) < 0)
+ if ((vr = VK_CALL(vkCreateImageView(device->vk_device, &view_desc, NULL, &vk_view))) < 0)
+ {
WARN("Failed to create Vulkan image view, vr %d.\n", vr);
- return vr;
+ return hresult_from_vk_result(vr);
+ }
+
+ if (!(object = vkd3d_view_create()))
+ {
+ VK_CALL(vkDestroyImageView(device->vk_device, vk_view, NULL));
+ return E_OUTOFMEMORY;
+ }
+
+ object->u.vk_image_view = vk_view;
+ *view = object;
+ return S_OK;
}
void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
@@ -1519,14 +1533,8 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
}
}
- if (!(view = vkd3d_view_create()))
- return;
-
- if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
- {
- vkd3d_free(view);
+ if (FAILED(vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view)))
return;
- }
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
@@ -1648,14 +1656,8 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
}
}
- if (!(view = vkd3d_view_create()))
- return;
-
- if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
- {
- vkd3d_free(view);
+ if (FAILED(vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view)))
return;
- }
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
@@ -1904,15 +1906,9 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
vkd3d_desc.layer_count = resource->desc.DepthOrArraySize;
}
- if (!(view = vkd3d_view_create()))
+ if (FAILED(vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view)))
return;
- if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
- {
- vkd3d_free(view);
- return;
- }
-
rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV;
rtv_desc->format = vkd3d_desc.format->vk_format;
rtv_desc->width = d3d12_resource_desc_get_width(&resource->desc, vkd3d_desc.miplevel_idx);
@@ -1982,10 +1978,7 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
}
}
- if (!(view = vkd3d_view_create()))
- return;
-
- if (vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view->u.vk_image_view) < 0)
+ if (FAILED(vkd3d_create_texture_view(device, resource, &vkd3d_desc, &view)))
return;
dsv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_DSV;
--
2.16.4
2
1
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 7261e89e82df..1c6b65fa758a 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -3311,10 +3311,12 @@ static void test_clear_render_target_view(void)
ID3D12DescriptorHeap *rtv_heap;
D3D12_CLEAR_VALUE clear_value;
struct test_context_desc desc;
+ struct resource_readback rb;
struct test_context context;
ID3D12CommandQueue *queue;
ID3D12Resource *resource;
ID3D12Device *device;
+ D3D12_BOX box;
HRESULT hr;
memset(&desc, 0, sizeof(desc));
@@ -3388,6 +3390,48 @@ static void test_clear_render_target_view(void)
D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
check_sub_resource_uint(resource, 0, queue, command_list, 0xbf95bc59, 2);
+ /* 3D texture */
+ ID3D12Resource_Release(resource);
+ resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D;
+ resource_desc.DepthOrArraySize = 32;
+ resource_desc.MipLevels = 1;
+ resource_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ hr = ID3D12Device_CreateCommittedResource(device,
+ &heap_properties, D3D12_HEAP_FLAG_NONE, &resource_desc,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, &clear_value,
+ &IID_ID3D12Resource, (void **)&resource);
+ ok(hr == S_OK, "Failed to create texture, hr %#x.\n", hr);
+
+ ID3D12Device_CreateRenderTargetView(device, resource, NULL, rtv_handle);
+
+ reset_command_list(command_list, context.allocator);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtv_handle, color, 0, NULL);
+ transition_resource_state(command_list, resource,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ check_sub_resource_uint(resource, 0, queue, command_list, 0xbf4c7f19, 2);
+
+ memset(&rtv_desc, 0, sizeof(rtv_desc));
+ rtv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ rtv_desc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D;
+ rtv_desc.Texture3D.FirstWSlice = 2;
+ rtv_desc.Texture3D.WSize = 2;
+ ID3D12Device_CreateRenderTargetView(device, resource, &rtv_desc, rtv_handle);
+
+ reset_command_list(command_list, context.allocator);
+ transition_resource_state(command_list, resource,
+ D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, rtv_handle, green, 0, NULL);
+ transition_resource_state(command_list, resource,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ get_texture_readback_with_command_list(resource, 0, &rb, queue, command_list);
+ set_box(&box, 0, 0, 0, 32, 32, 2);
+ check_readback_data_uint(&rb, &box, 0xbf4c7f19, 1);
+ set_box(&box, 0, 0, 2, 32, 32, 4);
+ check_readback_data_uint(&rb, &box, 0xff00ff00, 1);
+ set_box(&box, 0, 0, 4, 32, 32, 32);
+ check_readback_data_uint(&rb, &box, 0xbf4c7f19, 1);
+ release_resource_readback(&rb);
+
ID3D12Resource_Release(resource);
ID3D12DescriptorHeap_Release(rtv_heap);
destroy_test_context(&context);
--
2.16.4
2
1