Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 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
September 2018
- 70 participants
- 1549 messages
[PATCH 8/8] dxgi/tests: Add test for swapchain formats.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/tests/dxgi.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 99 insertions(+), 1 deletion(-)
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 376c1ecd6fdf..9ab247254922 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -3804,7 +3804,7 @@ static void test_swapchain_backbuffer_index(IUnknown *device, BOOL is_d3d12)
{
swapchain_desc.SwapEffect = tests[i].swap_effect;
expected_hr = is_d3d12 && !tests[i].supported_in_d3d12 ? DXGI_ERROR_INVALID_CALL : S_OK;
- hr = IDXGIFactory_CreateSwapChain(factory, (IUnknown *)device, &swapchain_desc, &swapchain);
+ hr = IDXGIFactory_CreateSwapChain(factory, device, &swapchain_desc, &swapchain);
ok(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr);
if (FAILED(hr))
continue;
@@ -3837,6 +3837,102 @@ done:
ok(refcount == !is_d3d12, "Got unexpected refcount %u.\n", refcount);
}
+static void test_swapchain_formats(IUnknown *device, BOOL is_d3d12)
+{
+ DXGI_SWAP_CHAIN_DESC swapchain_desc;
+ IDXGISwapChain *swapchain;
+ HRESULT hr, expected_hr;
+ IDXGIFactory *factory;
+ unsigned int i;
+ ULONG refcount;
+ BOOL is_flip;
+ RECT rect;
+ BOOL ret;
+
+ static const struct
+ {
+ DXGI_FORMAT format;
+ DXGI_SWAP_EFFECT swap_effect;
+ BOOL supported;
+ }
+ tests[] =
+ {
+ {DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_EFFECT_DISCARD, TRUE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_EFFECT_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_EFFECT_FLIP_DISCARD, TRUE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_DISCARD, TRUE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, FALSE},
+ {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_FLIP_DISCARD, FALSE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_SWAP_EFFECT_DISCARD, TRUE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_SWAP_EFFECT_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_SWAP_EFFECT_FLIP_DISCARD, TRUE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_DISCARD, TRUE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, FALSE},
+ {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, DXGI_SWAP_EFFECT_FLIP_DISCARD, FALSE},
+ {DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_SWAP_EFFECT_DISCARD, TRUE},
+ {DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_SWAP_EFFECT_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_SWAP_EFFECT_FLIP_DISCARD, TRUE},
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_SWAP_EFFECT_DISCARD, TRUE},
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_SWAP_EFFECT_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_SWAP_EFFECT_FLIP_DISCARD, TRUE},
+ {DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, TRUE},
+ {DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM, DXGI_SWAP_EFFECT_FLIP_DISCARD, FALSE},
+ {DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM, DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, FALSE},
+ };
+
+ get_factory(device, is_d3d12, &factory);
+
+ swapchain_desc.BufferDesc.RefreshRate.Numerator = 60;
+ swapchain_desc.BufferDesc.RefreshRate.Denominator = 60;
+ swapchain_desc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
+ swapchain_desc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
+ swapchain_desc.SampleDesc.Count = 1;
+ swapchain_desc.SampleDesc.Quality = 0;
+ swapchain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ swapchain_desc.BufferCount = 4;
+ swapchain_desc.OutputWindow = CreateWindowA("static", "dxgi_test", 0, 0, 0, 400, 200, 0, 0, 0, 0);
+ swapchain_desc.Windowed = TRUE;
+ swapchain_desc.Flags = 0;
+
+ ret = GetClientRect(swapchain_desc.OutputWindow, &rect);
+ ok(ret, "Failed to get client rect.\n");
+ swapchain_desc.BufferDesc.Width = rect.right;
+ swapchain_desc.BufferDesc.Height = rect.bottom;
+
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
+ {
+ is_flip = tests[i].swap_effect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
+ || tests[i].swap_effect == DXGI_SWAP_EFFECT_FLIP_DISCARD;
+
+ if (is_d3d12 && !is_flip)
+ continue;
+
+ swapchain_desc.BufferDesc.Format = tests[i].format;
+ swapchain_desc.SwapEffect = tests[i].swap_effect;
+ hr = IDXGIFactory_CreateSwapChain(factory, device, &swapchain_desc, &swapchain);
+ expected_hr = tests[i].supported ? S_OK : DXGI_ERROR_INVALID_CALL;
+ ok(hr == expected_hr
+ /* Flip presentation model not supported. */
+ || broken(is_flip && hr == DXGI_ERROR_INVALID_CALL),
+ "Test %u: Got hr %#x, expected %#x.\n", i, hr, expected_hr);
+
+ if (SUCCEEDED(hr))
+ {
+ refcount = IDXGISwapChain_Release(swapchain);
+ ok(!refcount, "Swapchain has %u references left.\n", refcount);
+ }
+ }
+
+ DestroyWindow(swapchain_desc.OutputWindow);
+ refcount = IDXGIFactory_Release(factory);
+ ok(refcount == !is_d3d12, "Got unexpected refcount %u.\n", refcount);
+}
+
static void test_maximum_frame_latency(void)
{
IDXGIDevice1 *device1;
@@ -4210,6 +4306,7 @@ START_TEST(dxgi)
test_swapchain_parameters();
run_on_d3d10(test_swapchain_resize);
run_on_d3d10(test_swapchain_backbuffer_index);
+ run_on_d3d10(test_swapchain_formats);
if (!(d3d12_module = LoadLibraryA("d3d12.dll")))
{
@@ -4228,6 +4325,7 @@ START_TEST(dxgi)
run_on_d3d12(test_swapchain_resize);
run_on_d3d12(test_swapchain_backbuffer_index);
+ run_on_d3d12(test_swapchain_formats);
FreeLibrary(d3d12_module);
}
--
2.16.4
Sept. 18, 2018
[PATCH 7/8] dxgi: Add support for DXGI_FORMAT_R16G16B16A16_FLOAT D3D12 swapchains.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/swapchain.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 680fa54541e0..3eefbe50df85 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -989,6 +989,7 @@ static DXGI_FORMAT dxgi_format_from_vk_format(VkFormat vk_format)
case VK_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM;
case VK_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM;
case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return DXGI_FORMAT_R10G10B10A2_UNORM;
+ case VK_FORMAT_R16G16B16A16_SFLOAT: return DXGI_FORMAT_R16G16B16A16_FLOAT;
default:
WARN("Unhandled format %#x.\n", vk_format);
return DXGI_FORMAT_UNKNOWN;
@@ -999,8 +1000,10 @@ static VkFormat get_swapchain_fallback_format(VkFormat vk_format)
{
switch (vk_format)
{
- case VK_FORMAT_R8G8B8A8_UNORM: return VK_FORMAT_B8G8R8A8_UNORM;
- case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return VK_FORMAT_B8G8R8A8_UNORM;
+ case VK_FORMAT_R8G8B8A8_UNORM:
+ case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
+ case VK_FORMAT_R16G16B16A16_SFLOAT:
+ return VK_FORMAT_B8G8R8A8_UNORM;
default:
WARN("Unhandled format %#x.\n", vk_format);
return VK_FORMAT_UNDEFINED;
--
2.16.4
Sept. 18, 2018
[PATCH 6/8] dxgi: Validate formats for flip presentation model.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/swapchain.c | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 5d2cb4aa535a..680fa54541e0 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -55,6 +55,21 @@ static DXGI_SWAP_EFFECT dxgi_swap_effect_from_wined3d(enum wined3d_swap_effect s
}
}
+static BOOL dxgi_validate_flip_swap_effect_format(DXGI_FORMAT format)
+{
+ switch (format)
+ {
+ case DXGI_FORMAT_R16G16B16A16_FLOAT:
+ case DXGI_FORMAT_R10G10B10A2_UNORM:
+ case DXGI_FORMAT_R8G8B8A8_UNORM:
+ case DXGI_FORMAT_B8G8R8A8_UNORM:
+ return TRUE;
+ default:
+ WARN("Invalid swapchain format %#x for flip presentation model.\n", format);
+ return FALSE;
+ }
+}
+
BOOL dxgi_validate_swapchain_desc(const DXGI_SWAP_CHAIN_DESC1 *desc)
{
unsigned int min_buffer_count;
@@ -70,6 +85,9 @@ BOOL dxgi_validate_swapchain_desc(const DXGI_SWAP_CHAIN_DESC1 *desc)
case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL:
min_buffer_count = 2;
+ if (!dxgi_validate_flip_swap_effect_format(desc->Format))
+ return FALSE;
+
if (desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality)
{
WARN("Invalid sample desc %u, %u for swap effect %#x.\n",
@@ -968,9 +986,7 @@ 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;
case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return DXGI_FORMAT_R10G10B10A2_UNORM;
default:
@@ -983,7 +999,6 @@ 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;
case VK_FORMAT_A2B10G10R10_UNORM_PACK32: return VK_FORMAT_B8G8R8A8_UNORM;
default:
--
2.16.4
Sept. 18, 2018
[PATCH 5/8] dxgi: Validate swapchain desc in d3d12_swapchain_ResizeBuffers().
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/swapchain.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 57d6b245c452..5d2cb4aa535a 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1786,7 +1786,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *
UINT buffer_count, UINT width, UINT height, DXGI_FORMAT format, UINT flags)
{
struct d3d12_swapchain *swapchain = d3d12_swapchain_from_IDXGISwapChain3(iface);
- DXGI_SWAP_CHAIN_DESC1 *desc;
+ DXGI_SWAP_CHAIN_DESC1 *desc, new_desc;
unsigned int i;
ULONG refcount;
HRESULT hr;
@@ -1808,9 +1808,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *
}
desc = &swapchain->desc;
+ new_desc = swapchain->desc;
- if (!buffer_count)
- buffer_count = desc->BufferCount;
+ if (buffer_count)
+ new_desc.BufferCount = buffer_count;
if (!width || !height)
{
RECT client_rect;
@@ -1826,20 +1827,21 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *
if (!height)
height = client_rect.bottom;
}
- if (!format)
- format = desc->Format;
+ new_desc.Width = width;
+ new_desc.Height = height;
- if (desc->Width == width && desc->Height == height
- && desc->Format == format && desc->BufferCount == buffer_count)
- return S_OK;
+ if (format)
+ new_desc.Format = format;
- d3d12_swapchain_destroy_buffers(swapchain);
+ if (!dxgi_validate_swapchain_desc(&new_desc))
+ return DXGI_ERROR_INVALID_CALL;
- desc->Width = width;
- desc->Height = height;
- desc->Format = format;
- desc->BufferCount = buffer_count;
+ if (desc->Width == new_desc.Width && desc->Height == new_desc.Height
+ && desc->Format == new_desc.Format && desc->BufferCount == new_desc.BufferCount)
+ return S_OK;
+ d3d12_swapchain_destroy_buffers(swapchain);
+ swapchain->desc = new_desc;
if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
{
ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
--
2.16.4
Sept. 18, 2018
[PATCH 4/8] dxgi: Factor out dxgi_validate_swapchain_desc().
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/dxgi_private.h | 2 ++
dlls/dxgi/factory.c | 30 +-----------------------------
dlls/dxgi/swapchain.c | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 4967bd425f22..f74514f0d326 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -182,6 +182,8 @@ HRESULT d3d12_swapchain_create(IWineDXGIFactory *factory, ID3D12CommandQueue *qu
const DXGI_SWAP_CHAIN_DESC1 *swapchain_desc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *fullscreen_desc,
IDXGISwapChain1 **swapchain) DECLSPEC_HIDDEN;
+BOOL dxgi_validate_swapchain_desc(const DXGI_SWAP_CHAIN_DESC1 *desc) DECLSPEC_HIDDEN;
+
/* IDXGISurface */
struct dxgi_surface
{
diff --git a/dlls/dxgi/factory.c b/dlls/dxgi/factory.c
index cc9075afc223..a4577ae278fa 100644
--- a/dlls/dxgi/factory.c
+++ b/dlls/dxgi/factory.c
@@ -251,7 +251,6 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChainForHwnd(IWineDXGIFa
IDXGIOutput *output, IDXGISwapChain1 **swapchain)
{
ID3D12CommandQueue *command_queue;
- unsigned int min_buffer_count;
IWineDXGIDevice *dxgi_device;
HRESULT hr;
@@ -270,35 +269,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_factory_CreateSwapChainForHwnd(IWineDXGIFa
return DXGI_ERROR_UNSUPPORTED;
}
- switch (desc->SwapEffect)
- {
- case DXGI_SWAP_EFFECT_DISCARD:
- case DXGI_SWAP_EFFECT_SEQUENTIAL:
- min_buffer_count = 1;
- break;
-
- case DXGI_SWAP_EFFECT_FLIP_DISCARD:
- case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL:
- min_buffer_count = 2;
-
- if (desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality)
- {
- WARN("Invalid sample desc %u, %u for swap effect %#x.\n",
- desc->SampleDesc.Count, desc->SampleDesc.Quality, desc->SwapEffect);
- return DXGI_ERROR_INVALID_CALL;
- }
- break;
-
- default:
- WARN("Invalid swap effect %u used.\n", desc->SwapEffect);
- return DXGI_ERROR_INVALID_CALL;
- }
-
- if (desc->BufferCount < min_buffer_count || desc->BufferCount > DXGI_MAX_SWAP_CHAIN_BUFFERS)
- {
- WARN("BufferCount is %u.\n", desc->BufferCount);
+ if (!dxgi_validate_swapchain_desc(desc))
return DXGI_ERROR_INVALID_CALL;
- }
if (output)
FIXME("Ignoring output %p.\n", output);
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index f8e4f8078e74..57d6b245c452 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -55,6 +55,43 @@ static DXGI_SWAP_EFFECT dxgi_swap_effect_from_wined3d(enum wined3d_swap_effect s
}
}
+BOOL dxgi_validate_swapchain_desc(const DXGI_SWAP_CHAIN_DESC1 *desc)
+{
+ unsigned int min_buffer_count;
+
+ switch (desc->SwapEffect)
+ {
+ case DXGI_SWAP_EFFECT_DISCARD:
+ case DXGI_SWAP_EFFECT_SEQUENTIAL:
+ min_buffer_count = 1;
+ break;
+
+ case DXGI_SWAP_EFFECT_FLIP_DISCARD:
+ case DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL:
+ min_buffer_count = 2;
+
+ if (desc->SampleDesc.Count != 1 || desc->SampleDesc.Quality)
+ {
+ WARN("Invalid sample desc %u, %u for swap effect %#x.\n",
+ desc->SampleDesc.Count, desc->SampleDesc.Quality, desc->SwapEffect);
+ return FALSE;
+ }
+ break;
+
+ default:
+ WARN("Invalid swap effect %u used.\n", desc->SwapEffect);
+ return FALSE;
+ }
+
+ if (desc->BufferCount < min_buffer_count || desc->BufferCount > DXGI_MAX_SWAP_CHAIN_BUFFERS)
+ {
+ WARN("BufferCount is %u.\n", desc->BufferCount);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain1(IDXGISwapChain1 *iface)
{
return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain1_iface);
--
2.16.4
Sept. 18, 2018
[PATCH 3/8] d3d11/tests: Add a few more tests for texture formats.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d11/tests/d3d11.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index 94e7a8eeb9cc..3ab2642279f7 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -7219,6 +7219,13 @@ static void test_texture(void)
0xffb1c4de, 0xfff0f1f2, 0xfffafdfe, 0xff5a560f,
0xffd5ff00, 0xffc8f99f, 0xffaa00aa, 0xffdd55bb,
};
+ static const WORD r8g8_data[] =
+ {
+ 0x0000, 0xffff, 0x0000, 0x7fff,
+ 0x0203, 0xff10, 0x0b0c, 0x8000,
+ 0xc4de, 0xfff0, 0xfdfe, 0x5a6f,
+ 0xff00, 0xffc8, 0x00aa, 0xdd5b,
+ };
static const BYTE a8_data[] =
{
0x00, 0x10, 0x20, 0x30,
@@ -7346,10 +7353,14 @@ static void test_texture(void)
{blue_data, 5 * sizeof(*blue_data)},
}
};
+ static const struct texture r32f_float = {4, 4, 1, 1, DXGI_FORMAT_R32_FLOAT,
+ {{r32_float, 4 * sizeof(*r32_float)}}};
static const struct texture r32f_typeless = {4, 4, 1, 1, DXGI_FORMAT_R32_TYPELESS,
{{r32_float, 4 * sizeof(*r32_float)}}};
static const struct texture r32u_typeless = {4, 4, 1, 1, DXGI_FORMAT_R32_TYPELESS,
{{r32_uint, 4 * sizeof(*r32_uint)}}};
+ static const struct texture r8g8_snorm = {4, 4, 1, 1, DXGI_FORMAT_R8G8_SNORM,
+ {{r8g8_data, 4 * sizeof(*r8g8_data)}}};
static const struct texture r9g9b9e5_texture = {4, 4, 1, 1, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
{{r9g9b9e5_data, 4 * sizeof(*r9g9b9e5_data)}}};
static const DWORD red_colors[] =
@@ -7436,6 +7447,13 @@ static void test_texture(void)
0x7e7e7e7e, 0x7e7e7e7e, 0x7e7e7e7e, 0x7e808080,
0x7e7e7e7e, 0x7e7f7f7f, 0x7e7f7f7f, 0x7e7f7f7f,
};
+ static const DWORD snorm_colors[] =
+ {
+ 0xff000000, 0xff000000, 0xff000000, 0xff00ff00,
+ 0xff000406, 0xff000020, 0xff001618, 0xff000000,
+ 0xff000000, 0xff000000, 0xff000000, 0xff00b5df,
+ 0xff000000, 0xff000000, 0xff000000, 0xff0000b7,
+ };
static const DWORD r32f_colors[] =
{
0xff000000, 0xff0000ff, 0xff00007f, 0xff00007f,
@@ -7605,6 +7623,7 @@ static void test_texture(void)
#define BC3_UNORM_SRGB DXGI_FORMAT_BC3_UNORM_SRGB
#define R8G8B8A8_UNORM_SRGB DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
#define R8G8B8A8_UNORM DXGI_FORMAT_R8G8B8A8_UNORM
+#define R8G8_SNORM DXGI_FORMAT_R8G8_SNORM
#define R32_FLOAT DXGI_FORMAT_R32_FLOAT
#define R32_UINT DXGI_FORMAT_R32_UINT
#define FMT_UNKNOWN DXGI_FORMAT_UNKNOWN
@@ -7617,6 +7636,8 @@ static void test_texture(void)
{&ps_sample, &srgb_typeless, {R8G8B8A8_UNORM_SRGB, TEX_2D, 0, 1}, 0.0f, srgb_colors},
{&ps_sample, &srgb_typeless, {R8G8B8A8_UNORM, TEX_2D, 0, 1}, 0.0f, srgb_data},
{&ps_sample, &r32f_typeless, {R32_FLOAT, TEX_2D, 0, 1}, 0.0f, r32f_colors},
+ {&ps_sample, &r32f_float, {R32_FLOAT, TEX_2D, 0, 1}, 0.0f, r32f_colors},
+ {&ps_sample, &r8g8_snorm, {R8G8_SNORM, TEX_2D, 0, 1}, 0.0f, snorm_colors},
{&ps_sample, &array_2d_texture, {FMT_UNKNOWN, TEX_2D, 0, 1}, 0.0f, red_colors},
{&ps_sample_2d_array, &array_2d_texture, {FMT_UNKNOWN, TEX_2D_ARRAY, 0, 1, 0, 1}, 0.0f, red_colors},
{&ps_sample_2d_array, &array_2d_texture, {FMT_UNKNOWN, TEX_2D_ARRAY, 0, 1, 1, 1}, 0.0f, green_data},
@@ -7632,6 +7653,7 @@ static void test_texture(void)
#undef BC3_UNORM_SRGB
#undef R8G8B8A8_UNORM_SRGB
#undef R8G8B8A8_UNORM
+#undef R8G8_SNORM
#undef R32_FLOAT
#undef R32_UINT
#undef FMT_UNKNOWN
--
2.16.4
Sept. 18, 2018
[PATCH 2/8] wined3d: Apply legacy format swizzles only when requested.
by Józef Kucia
We do not want to apply legacy format swizzles for D3D10+.
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR is slightly overloaded. We could
rename WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR, but I could not find a
very good name.
---
dlls/wined3d/utils.c | 77 ++++++++++++++++++++++++++++------------------------
1 file changed, 42 insertions(+), 35 deletions(-)
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index db27270ba8a0..f1988669ac1a 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -3444,69 +3444,76 @@ static struct color_fixup_desc create_color_fixup_desc_from_string(const char *s
static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
{
+ const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
struct wined3d_format *format;
+ BOOL use_legacy_fixups;
unsigned int i;
static const struct
{
enum wined3d_format_id id;
const char *fixup;
+ BOOL legacy;
enum wined3d_gl_extension extension;
}
fixups[] =
{
- {WINED3DFMT_R16_FLOAT, "X11W", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R32_FLOAT, "X11W", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R16G16_UNORM, "XY1W", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R16G16_FLOAT, "XY1W", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R32G32_FLOAT, "XY1W", WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R16_FLOAT, "X11W", TRUE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R32_FLOAT, "X11W", TRUE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R16G16_UNORM, "XY1W", TRUE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R16G16_FLOAT, "XY1W", TRUE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R32G32_FLOAT, "XY1W", TRUE, WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R8G8_SNORM, "xy11", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R8G8_SNORM, "XY11", NV_TEXTURE_SHADER},
- {WINED3DFMT_R8G8_SNORM, "XY11", EXT_TEXTURE_SNORM},
+ {WINED3DFMT_R8G8_SNORM, "xy11", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R8G8_SNORM, "XY11", TRUE, NV_TEXTURE_SHADER},
+ {WINED3DFMT_R8G8_SNORM, "XY11", TRUE, EXT_TEXTURE_SNORM},
- {WINED3DFMT_R16G16_SNORM, "xy11", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R16G16_SNORM, "XY11", NV_TEXTURE_SHADER},
- {WINED3DFMT_R16G16_SNORM, "XY11", EXT_TEXTURE_SNORM},
+ {WINED3DFMT_R16G16_SNORM, "xy11", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R16G16_SNORM, "XY11", TRUE, NV_TEXTURE_SHADER},
+ {WINED3DFMT_R16G16_SNORM, "XY11", TRUE, EXT_TEXTURE_SNORM},
- {WINED3DFMT_R8G8B8A8_SNORM, "xyzw", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R8G8B8A8_SNORM, "XYZW", NV_TEXTURE_SHADER},
- {WINED3DFMT_R8G8B8A8_SNORM, "XYZW", EXT_TEXTURE_SNORM},
+ {WINED3DFMT_R8G8B8A8_SNORM, "xyzw", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R8G8B8A8_SNORM, "XYZW", FALSE, NV_TEXTURE_SHADER},
+ {WINED3DFMT_R8G8B8A8_SNORM, "XYZW", FALSE, EXT_TEXTURE_SNORM},
- {WINED3DFMT_R5G5_SNORM_L6_UNORM, "xzY1", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", NV_TEXTURE_SHADER},
- {WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", EXT_TEXTURE_SNORM},
+ {WINED3DFMT_R5G5_SNORM_L6_UNORM, "xzY1", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", FALSE, NV_TEXTURE_SHADER},
+ {WINED3DFMT_R5G5_SNORM_L6_UNORM, "XYZW", FALSE, EXT_TEXTURE_SNORM},
- {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "xyZW", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "XYZW", NV_TEXTURE_SHADER},
+ {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "xyZW", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_R8G8_SNORM_L8X8_UNORM, "XYZW", FALSE, NV_TEXTURE_SHADER},
- {WINED3DFMT_ATI1N, "XXXX", EXT_TEXTURE_COMPRESSION_RGTC},
- {WINED3DFMT_ATI1N, "XXXX", ARB_TEXTURE_COMPRESSION_RGTC},
+ {WINED3DFMT_ATI1N, "XXXX", FALSE, EXT_TEXTURE_COMPRESSION_RGTC},
+ {WINED3DFMT_ATI1N, "XXXX", FALSE, ARB_TEXTURE_COMPRESSION_RGTC},
- {WINED3DFMT_ATI2N, "XW11", ATI_TEXTURE_COMPRESSION_3DC},
- {WINED3DFMT_ATI2N, "YX11", EXT_TEXTURE_COMPRESSION_RGTC},
- {WINED3DFMT_ATI2N, "YX11", ARB_TEXTURE_COMPRESSION_RGTC},
+ {WINED3DFMT_ATI2N, "XW11", FALSE, ATI_TEXTURE_COMPRESSION_3DC},
+ {WINED3DFMT_ATI2N, "YX11", FALSE, EXT_TEXTURE_COMPRESSION_RGTC},
+ {WINED3DFMT_ATI2N, "YX11", FALSE, ARB_TEXTURE_COMPRESSION_RGTC},
- {WINED3DFMT_A8_UNORM, "000X", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_A8_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
+ {WINED3DFMT_A8_UNORM, "000X", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_A8_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT},
- {WINED3DFMT_L8A8_UNORM, "XXXY", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_L8A8_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
+ {WINED3DFMT_L8A8_UNORM, "XXXY", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_L8A8_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT},
- {WINED3DFMT_L4A4_UNORM, "XXXY", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_L4A4_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
+ {WINED3DFMT_L4A4_UNORM, "XXXY", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_L4A4_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT},
- {WINED3DFMT_L16_UNORM, "XXX1", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_L16_UNORM, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
+ {WINED3DFMT_L16_UNORM, "XXX1", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_L16_UNORM, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT},
- {WINED3DFMT_INTZ, "XXXX", WINED3D_GL_EXT_NONE},
- {WINED3DFMT_INTZ, "XYZW", WINED3D_GL_LEGACY_CONTEXT},
+ {WINED3DFMT_INTZ, "XXXX", FALSE, WINED3D_GL_EXT_NONE},
+ {WINED3DFMT_INTZ, "XYZW", FALSE, WINED3D_GL_LEGACY_CONTEXT},
- {WINED3DFMT_L8_UNORM, "XXX1", ARB_TEXTURE_RG},
+ {WINED3DFMT_L8_UNORM, "XXX1", FALSE, ARB_TEXTURE_RG},
};
+ use_legacy_fixups = d3d_info->wined3d_creation_flags & WINED3D_LEGACY_UNBOUND_RESOURCE_COLOR;
for (i = 0; i < ARRAY_SIZE(fixups); ++i)
{
+ if (fixups[i].legacy && !use_legacy_fixups)
+ continue;
+
if (!gl_info->supported[fixups[i].extension])
continue;
--
2.16.4
Sept. 18, 2018
[PATCH 1/8] wined3d: Implement vCoverage register.
by Józef Kucia
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45848
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/wined3d/glsl_shader.c | 4 ++++
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 5 insertions(+)
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 64c8b77aa385..52348084c388 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -3280,6 +3280,10 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register *
string_buffer_sprintf(register_name, "vpc[%u]", reg->idx[0].offset);
break;
+ case WINED3DSPR_COVERAGE:
+ string_buffer_sprintf(register_name, "gl_SampleMaskIn[0]");
+ break;
+
case WINED3DSPR_SAMPLEMASK:
string_buffer_sprintf(register_name, "sample_mask");
break;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b96d3a53c094..3820cde09892 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4152,6 +4152,7 @@ static inline BOOL shader_is_scalar(const struct wined3d_shader_register *reg)
case WINED3DSPR_OUTPOINTID:
case WINED3DSPR_PREDICATE: /* p0 */
case WINED3DSPR_PRIMID: /* primID */
+ case WINED3DSPR_COVERAGE: /* vCoverage */
case WINED3DSPR_SAMPLEMASK: /* oMask */
return TRUE;
--
2.16.4
Sept. 18, 2018
Re: [PATCH v7 3/7] shell32/autocomplete: Don't auto-append on control characters, except for ^V (paste)
by Gabriel Ivăncescu
On Tue, Sep 18, 2018 at 3:24 PM, Huw Davies <huw(a)codeweavers.com> wrote:
>
> Let's leave the ^V out of this.
Ok. I will resend after they are committed. And after those (resent)
get in, the next patch series will include the WM_PASTE also for
proper behavior here.
Sept. 18, 2018
Re: [PATCH v3 3/3] comdlg32/tests: Fix failures on newer Windows 10.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Sept. 18, 2018