From: Zhiyi Zhang zzhang@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/tests/d2d1.c | 248 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index aedae45ca98..ecbabe83b77 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -13356,6 +13356,253 @@ static void test_bitmap_create(BOOL d3d11) release_test_context(&ctx); }
+static void test_hwnd_target_is_supported(BOOL d3d11) +{ + static const unsigned int target_types[] = + { + D2D1_RENDER_TARGET_TYPE_DEFAULT, + D2D1_RENDER_TARGET_TYPE_SOFTWARE, + D2D1_RENDER_TARGET_TYPE_HARDWARE, + }; + static const unsigned int usages[] = + { + D2D1_RENDER_TARGET_USAGE_NONE, + D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING, + D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, + D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING | D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, + }; + static const D2D1_PIXEL_FORMAT pixel_formats[] = + { + { DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_UNKNOWN }, + { DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED }, + { DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_IGNORE }, + + { DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_UNKNOWN }, + { DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED }, + { DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_IGNORE }, + + { DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_UNKNOWN }, + { DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED }, + { DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE }, + }; + static const D2D1_PIXEL_FORMAT unsupported_pixel_formats[] = + { + { DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_STRAIGHT }, + { DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT }, + { DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT }, + { DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_UNKNOWN }, + }; + D2D1_RENDER_TARGET_PROPERTIES desc, template_desc, test_desc; + D2D1_HWND_RENDER_TARGET_PROPERTIES hwnd_rt_desc; + D2D1_BITMAP_PROPERTIES1 bitmap_desc; + ID2D1DeviceContext *device_context; + D2D1_PIXEL_FORMAT pixel_format; + struct d2d1_test_context ctx; + ID2D1HwndRenderTarget *rt; + BOOL expected, supported; + ID2D1Bitmap1 *bitmap; + unsigned int i, j; + D2D1_SIZE_U size; + HWND window; + HRESULT hr; + + if (!init_test_context(&ctx, d3d11)) + return; + + window = create_window(); + ok(!!window, "Failed to create test window.\n"); + + template_desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; + template_desc.pixelFormat.format = DXGI_FORMAT_UNKNOWN; + template_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE; + template_desc.dpiX = 96.0f; + template_desc.dpiY = 96.0f; + template_desc.usage = D2D1_RENDER_TARGET_USAGE_NONE; + template_desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; + + hwnd_rt_desc.hwnd = window; + hwnd_rt_desc.pixelSize.width = 64; + hwnd_rt_desc.pixelSize.height = 64; + hwnd_rt_desc.presentOptions = D2D1_PRESENT_OPTIONS_NONE; + + /* Make sure the template render target description is valid */ + hr = ID2D1Factory_CreateHwndRenderTarget(ctx.factory, &template_desc, &hwnd_rt_desc, &rt); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + supported = ID2D1HwndRenderTarget_IsSupported(rt, &template_desc); + todo_wine + ok(supported, "Expected supported.\n"); + ID2D1HwndRenderTarget_Release(rt); + + /* Test that SetTarget() with a bitmap of a different usage doesn't change the render target usage. */ + hr = ID2D1Factory_CreateHwndRenderTarget(ctx.factory, &template_desc, &hwnd_rt_desc, &rt); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = ID2D1HwndRenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&device_context); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + test_desc = template_desc; + test_desc.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + ok(!supported, "Expected unsupported.\n"); + + memset(&bitmap_desc, 0, sizeof(bitmap_desc)); + bitmap_desc.pixelFormat = ID2D1DeviceContext_GetPixelFormat(device_context); + bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE; + size.width = 4; + size.height = 4; + hr = ID2D1DeviceContext_CreateBitmap(device_context, size, NULL, 0, &bitmap_desc, &bitmap); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap); + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + ok(!supported, "Expected unsupported.\n"); + ID2D1Bitmap1_Release(bitmap); + + /* Test that SetTarget() with a bitmap of a different format changes the render target format */ + test_desc = template_desc; + test_desc.pixelFormat.format = DXGI_FORMAT_R8G8B8A8_UNORM; + test_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + ok(!supported, "Expected unsupported.\n"); + + memset(&bitmap_desc, 0, sizeof(bitmap_desc)); + bitmap_desc.pixelFormat.format = DXGI_FORMAT_R8G8B8A8_UNORM; + bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; + bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET; + size.width = 4; + size.height = 4; + hr = ID2D1DeviceContext_CreateBitmap(device_context, size, NULL, 0, &bitmap_desc, &bitmap); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap); + pixel_format = ID2D1DeviceContext_GetPixelFormat(device_context); + ok(pixel_format.format == DXGI_FORMAT_R8G8B8A8_UNORM, "Got unexpected format %#x.\n", pixel_format.format); + ok(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED, "Got unexpected alpha %u.\n", pixel_format.alphaMode); + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + todo_wine + ok(supported, "Expected supported.\n"); + ID2D1Bitmap1_Release(bitmap); + + ID2D1DeviceContext_Release(device_context); + ID2D1HwndRenderTarget_Release(rt); + + /* Target type. */ + for (i = 0; i < ARRAY_SIZE(target_types); ++i) + { + /* Default target type resolves to either HW or SW, there is no way to tell. */ + desc = template_desc; + desc.type = target_types[i]; + hr = ID2D1Factory_CreateHwndRenderTarget(ctx.factory, &desc, &hwnd_rt_desc, &rt); + if (desc.type == D2D1_RENDER_TARGET_TYPE_DEFAULT) + { + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + test_desc = template_desc; + test_desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + todo_wine + ok(supported, "Unexpected return value %d.\n", supported); + } + else + { + if (FAILED(hr)) + continue; + + for (j = 0; j < ARRAY_SIZE(target_types); ++j) + { + winetest_push_context("type test %u/%u", i, j); + + test_desc = template_desc; + test_desc.type = target_types[j]; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + expected = target_types[j] == D2D1_RENDER_TARGET_TYPE_DEFAULT + || target_types[i] == target_types[j]; + todo_wine_if(expected) + ok(supported == expected, "Unexpected return value %d.\n", supported); + + winetest_pop_context(); + } + } + + ID2D1HwndRenderTarget_Release(rt); + } + + /* Pixel formats. */ + for (i = 0; i < ARRAY_SIZE(pixel_formats); ++i) + { + desc = template_desc; + desc.pixelFormat = pixel_formats[i]; + hr = ID2D1Factory_CreateHwndRenderTarget(ctx.factory, &desc, &hwnd_rt_desc, &rt); + todo_wine_if(i == 3 || i == 4 || i == 5) + ok(hr == S_OK, "%u: unexpected hr %#lx.\n", i, hr); + if (FAILED(hr)) + continue; + + /* Resolve to default format. */ + if (desc.pixelFormat.format == DXGI_FORMAT_UNKNOWN) + desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM; + if (desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_UNKNOWN) + desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE; + + for (j = 0; j < ARRAY_SIZE(pixel_formats); ++j) + { + BOOL format_supported, alpha_mode_supported; + + winetest_push_context("format test %u/%u.", i, j); + + test_desc = template_desc; + test_desc.pixelFormat = pixel_formats[j]; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + + format_supported = pixel_formats[j].format == DXGI_FORMAT_UNKNOWN + || pixel_formats[j].format == desc.pixelFormat.format; + alpha_mode_supported = pixel_formats[j].alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || pixel_formats[j].alphaMode == desc.pixelFormat.alphaMode; + expected = format_supported && alpha_mode_supported; + todo_wine_if(expected) + ok(supported == expected, "Unexpected return value.\n"); + + winetest_pop_context(); + } + + for (j = 0; j < ARRAY_SIZE(unsupported_pixel_formats); ++j) + { + test_desc = template_desc; + test_desc.pixelFormat = unsupported_pixel_formats[j]; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); + ok(!supported, "Unexpected return value.\n"); + } + + ID2D1HwndRenderTarget_Release(rt); + } + + /* Target usage. */ + for (i = 0; i < ARRAY_SIZE(usages); ++i) + { + desc = template_desc; + desc.usage = usages[i]; + hr = ID2D1Factory_CreateHwndRenderTarget(ctx.factory, &desc, &hwnd_rt_desc, &rt); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + for (j = 0; j < ARRAY_SIZE(usages); ++j) + { + winetest_push_context("usage %#x testing usage %#x", usages[i], usages[j]); + + desc = template_desc; + desc.usage = usages[j]; + supported = ID2D1HwndRenderTarget_IsSupported(rt, &desc); + expected = (usages[i] & usages[j]) == usages[j]; + todo_wine_if(expected) + ok(supported == expected, "Unexpected result %d.\n", supported); + + winetest_pop_context(); + } + + ID2D1HwndRenderTarget_Release(rt); + } + + DestroyWindow(window); + + release_test_context(&ctx); +} + START_TEST(d2d1) { HMODULE d2d1_dll = GetModuleHandleA("d2d1.dll"); @@ -13440,6 +13687,7 @@ START_TEST(d2d1) queue_test(test_image_bounds); queue_test(test_bitmap_map); queue_test(test_bitmap_create); + queue_test(test_hwnd_target_is_supported);
run_queued_tests(); }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/d2d1_private.h | 2 ++ dlls/d2d1/hwnd_render_target.c | 29 ++++++++++++++++++++++++++++- dlls/d2d1/tests/d2d1.c | 6 ------ 3 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index 5dab3fbb2a8..c3714a92511 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -264,6 +264,8 @@ struct d2d_hwnd_render_target IDXGISwapChain *swapchain; UINT sync_interval; HWND hwnd; + + D2D1_RENDER_TARGET_PROPERTIES desc; };
HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target, ID2D1Factory1 *factory, diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c index 4d3fe43a1b3..325eb941782 100644 --- a/dlls/d2d1/hwnd_render_target.c +++ b/dlls/d2d1/hwnd_render_target.c @@ -652,10 +652,32 @@ static BOOL STDMETHODCALLTYPE d2d_hwnd_render_target_IsSupported(ID2D1HwndRender const D2D1_RENDER_TARGET_PROPERTIES *desc) { struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface); + const D2D1_RENDER_TARGET_PROPERTIES *target_desc = &render_target->desc; + D2D1_PIXEL_FORMAT pixel_format;
TRACE("iface %p, desc %p.\n", iface, desc);
- return ID2D1RenderTarget_IsSupported(render_target->dxgi_target, desc); + if (desc->type != D2D1_RENDER_TARGET_TYPE_DEFAULT + && target_desc->type != desc->type) + { + return FALSE; + } + + pixel_format = ID2D1RenderTarget_GetPixelFormat(render_target->dxgi_target); + + if (desc->pixelFormat.format != DXGI_FORMAT_UNKNOWN + && pixel_format.format != desc->pixelFormat.format) + { + return FALSE; + } + + if (desc->pixelFormat.alphaMode != D2D1_ALPHA_MODE_UNKNOWN + && pixel_format.alphaMode != desc->pixelFormat.alphaMode) + { + return FALSE; + } + + return (target_desc->usage & desc->usage) == desc->usage; }
static D2D1_WINDOW_STATE STDMETHODCALLTYPE d2d_hwnd_render_target_CheckWindowState(ID2D1HwndRenderTarget *iface) @@ -840,6 +862,11 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target if (dxgi_rt_desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_UNKNOWN) dxgi_rt_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_IGNORE;
+ render_target->desc = dxgi_rt_desc; + /* FIXME: should be resolved to either HW or SW type. */ + if (render_target->desc.type == D2D1_RENDER_TARGET_TYPE_DEFAULT) + render_target->desc.type = D2D1_RENDER_TARGET_TYPE_HARDWARE; + swapchain_desc.BufferDesc.Width = hwnd_rt_desc->pixelSize.width; swapchain_desc.BufferDesc.Height = hwnd_rt_desc->pixelSize.height; swapchain_desc.BufferDesc.RefreshRate.Numerator = 60; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index ecbabe83b77..df1b99776e4 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -13429,7 +13429,6 @@ static void test_hwnd_target_is_supported(BOOL d3d11) hr = ID2D1Factory_CreateHwndRenderTarget(ctx.factory, &template_desc, &hwnd_rt_desc, &rt); ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); supported = ID2D1HwndRenderTarget_IsSupported(rt, &template_desc); - todo_wine ok(supported, "Expected supported.\n"); ID2D1HwndRenderTarget_Release(rt);
@@ -13476,7 +13475,6 @@ static void test_hwnd_target_is_supported(BOOL d3d11) ok(pixel_format.format == DXGI_FORMAT_R8G8B8A8_UNORM, "Got unexpected format %#x.\n", pixel_format.format); ok(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED, "Got unexpected alpha %u.\n", pixel_format.alphaMode); supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); - todo_wine ok(supported, "Expected supported.\n"); ID2D1Bitmap1_Release(bitmap);
@@ -13497,7 +13495,6 @@ static void test_hwnd_target_is_supported(BOOL d3d11) test_desc = template_desc; test_desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); - todo_wine ok(supported, "Unexpected return value %d.\n", supported); } else @@ -13514,7 +13511,6 @@ static void test_hwnd_target_is_supported(BOOL d3d11) supported = ID2D1HwndRenderTarget_IsSupported(rt, &test_desc); expected = target_types[j] == D2D1_RENDER_TARGET_TYPE_DEFAULT || target_types[i] == target_types[j]; - todo_wine_if(expected) ok(supported == expected, "Unexpected return value %d.\n", supported);
winetest_pop_context(); @@ -13556,7 +13552,6 @@ static void test_hwnd_target_is_supported(BOOL d3d11) alpha_mode_supported = pixel_formats[j].alphaMode == D2D1_ALPHA_MODE_UNKNOWN || pixel_formats[j].alphaMode == desc.pixelFormat.alphaMode; expected = format_supported && alpha_mode_supported; - todo_wine_if(expected) ok(supported == expected, "Unexpected return value.\n");
winetest_pop_context(); @@ -13589,7 +13584,6 @@ static void test_hwnd_target_is_supported(BOOL d3d11) desc.usage = usages[j]; supported = ID2D1HwndRenderTarget_IsSupported(rt, &desc); expected = (usages[i] & usages[j]) == usages[j]; - todo_wine_if(expected) ok(supported == expected, "Unexpected result %d.\n", supported);
winetest_pop_context();
This merge request was approved by Nikolay Sivov.