These invalid formats are rejected when creating WIC render targets. Otherwise, Wine may create a WIC render target with an unsupported format and in turn, will make testing IsSupported() method difficult.
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/wic_render_target.c | 94 ++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/wic_render_target.c b/dlls/d2d1/wic_render_target.c index f6e7b14ed3f..618766ab52b 100644 --- a/dlls/d2d1/wic_render_target.c +++ b/dlls/d2d1/wic_render_target.c @@ -149,15 +149,101 @@ static const struct d2d_device_context_ops d2d_wic_render_target_ops = d2d_wic_render_target_present, };
+static HRESULT check_invalid_formats(const WICPixelFormatGUID *bitmap_format, + const D2D1_PIXEL_FORMAT *pixel_format) +{ + unsigned int i; + + static const struct + { + const WICPixelFormatGUID *wic_format; + D2D1_PIXEL_FORMAT pixel_format; + } + supported_formats[] = + { + {&GUID_WICPixelFormat8bppAlpha, {DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat8bppAlpha, {DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT}}, + {&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppBGR, {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat32bppPBGRA, {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat32bppRGB, {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppRGB, {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat32bppPRGBA, {DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat32bppPRGBA, {DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat64bppRGB, {DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat64bppPRGBA, {DXGI_FORMAT_R16G16B16A16_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat128bppPRGBAFloat, {DXGI_FORMAT_R32G32B32A32_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat128bppRGBFloat, {DXGI_FORMAT_R32G32B32A32_FLOAT, D2D1_ALPHA_MODE_IGNORE}}, + {&GUID_WICPixelFormat64bppPRGBAHalf, {DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_PREMULTIPLIED}}, + {&GUID_WICPixelFormat64bppRGBHalf, {DXGI_FORMAT_R16G16B16A16_FLOAT, D2D1_ALPHA_MODE_IGNORE}}, + }; + + for (i = 0; i < ARRAY_SIZE(supported_formats); ++i) + { + if (IsEqualGUID(bitmap_format, supported_formats[i].wic_format) + && (pixel_format->format == DXGI_FORMAT_UNKNOWN + || pixel_format->format == supported_formats[i].pixel_format.format) + && (pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || pixel_format->alphaMode == supported_formats[i].pixel_format.alphaMode)) + return TRUE; + } + + if (IsEqualGUID(bitmap_format, &GUID_WICPixelFormat8bppAlpha) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat32bppBGR) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat32bppPBGRA) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat32bppRGB) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat32bppPRGBA) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat64bppRGB) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat64bppPRGBA) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat128bppPRGBAFloat) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat128bppRGBFloat) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat64bppPRGBAHalf) + || IsEqualGUID(bitmap_format, &GUID_WICPixelFormat64bppRGBHalf) + || (IsEqualGUID(bitmap_format, &GUID_WICPixelFormat32bppRGBA1010102) + && !((pixel_format->format == DXGI_FORMAT_UNKNOWN + || pixel_format->format == DXGI_FORMAT_R10G10B10A2_UNORM) + && (pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || pixel_format->alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED))) + || (IsEqualGUID(bitmap_format, &GUID_WICPixelFormat8bppY) + && !((pixel_format->format == DXGI_FORMAT_UNKNOWN + || pixel_format->format == DXGI_FORMAT_R8_UNORM) + && (pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || pixel_format->alphaMode == D2D1_ALPHA_MODE_IGNORE))) + || (IsEqualGUID(bitmap_format, &GUID_WICPixelFormat16bppCbCr) + && !((pixel_format->format == DXGI_FORMAT_UNKNOWN + || pixel_format->format == DXGI_FORMAT_R8G8_UNORM) + && (pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || pixel_format->alphaMode == D2D1_ALPHA_MODE_IGNORE)))) + return E_INVALIDARG; + + return D2DERR_UNSUPPORTED_PIXEL_FORMAT; +} + HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ID2D1Factory1 *factory, ID3D10Device1 *d3d_device, IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc) { D3D10_TEXTURE2D_DESC texture_desc; + WICPixelFormatGUID bitmap_format; ID3D10Texture2D *texture; IDXGIDevice *dxgi_device; ID2D1Device *device; HRESULT hr;
+ if (FAILED(hr = IWICBitmap_GetPixelFormat(bitmap, &bitmap_format))) + { + WARN("Failed to get bitmap format, hr %#lx.\n", hr); + return hr; + } + + if (FAILED(hr = check_invalid_formats(&bitmap_format, &desc->pixelFormat))) + { + WARN("Invalid WIC bitmap format %s pixel format %#x alpha %u.\n", + debugstr_guid(&bitmap_format), desc->pixelFormat.format, + desc->pixelFormat.alphaMode); + return hr; + } + render_target->IUnknown_iface.lpVtbl = &d2d_wic_render_target_vtbl;
if (FAILED(hr = IWICBitmap_GetSize(bitmap, &render_target->width, &render_target->height))) @@ -174,14 +260,6 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, texture_desc.Format = desc->pixelFormat.format; if (texture_desc.Format == DXGI_FORMAT_UNKNOWN) { - WICPixelFormatGUID bitmap_format; - - if (FAILED(hr = IWICBitmap_GetPixelFormat(bitmap, &bitmap_format))) - { - WARN("Failed to get bitmap format, hr %#lx.\n", hr); - return hr; - } - if (IsEqualGUID(&bitmap_format, &GUID_WICPixelFormat32bppPBGRA) || IsEqualGUID(&bitmap_format, &GUID_WICPixelFormat32bppBGR)) {
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/tests/d2d1.c | 222 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index a065c8ddfb5..d50499207c5 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -6461,6 +6461,227 @@ static void test_bitmap_target(BOOL d3d11) ID2D1Factory_Release(factory); }
+static void test_wic_bitmap_target(BOOL d3d11) +{ + D2D1_RENDER_TARGET_PROPERTIES desc; + IWICImagingFactory *wic_factory; + struct d2d1_test_context ctx; + IWICBitmap *wic_bitmap; + ID2D1Factory *factory; + ID2D1RenderTarget *rt; + unsigned int i, j, k; + HRESULT hr; + + static const WICPixelFormatGUID *wic_formats[] = + { + &GUID_WICPixelFormatDontCare, + &GUID_WICPixelFormat1bppIndexed, + &GUID_WICPixelFormat2bppIndexed, + &GUID_WICPixelFormat4bppIndexed, + &GUID_WICPixelFormat8bppIndexed, + &GUID_WICPixelFormatBlackWhite, + &GUID_WICPixelFormat2bppGray, + &GUID_WICPixelFormat4bppGray, + &GUID_WICPixelFormat8bppGray, + &GUID_WICPixelFormat16bppGray, + &GUID_WICPixelFormat8bppAlpha, + &GUID_WICPixelFormat16bppBGR555, + &GUID_WICPixelFormat16bppBGR565, + &GUID_WICPixelFormat16bppBGRA5551, + &GUID_WICPixelFormat24bppBGR, + &GUID_WICPixelFormat24bppRGB, + &GUID_WICPixelFormat32bppBGR, + &GUID_WICPixelFormat32bppBGRA, + &GUID_WICPixelFormat32bppPBGRA, + &GUID_WICPixelFormat32bppRGB, + &GUID_WICPixelFormat32bppRGBA, + &GUID_WICPixelFormat32bppPRGBA, + &GUID_WICPixelFormat32bppGrayFloat, + &GUID_WICPixelFormat48bppRGB, + &GUID_WICPixelFormat48bppBGR, + &GUID_WICPixelFormat64bppRGB, + &GUID_WICPixelFormat64bppRGBA, + &GUID_WICPixelFormat64bppBGRA, + &GUID_WICPixelFormat64bppPRGBA, + &GUID_WICPixelFormat64bppPBGRA, + &GUID_WICPixelFormat16bppGrayFixedPoint, + &GUID_WICPixelFormat32bppBGR101010, + &GUID_WICPixelFormat48bppRGBFixedPoint, + &GUID_WICPixelFormat48bppBGRFixedPoint, + &GUID_WICPixelFormat96bppRGBFixedPoint, + &GUID_WICPixelFormat96bppRGBFloat, + &GUID_WICPixelFormat128bppRGBAFloat, + &GUID_WICPixelFormat128bppPRGBAFloat, + &GUID_WICPixelFormat128bppRGBFloat, + &GUID_WICPixelFormat32bppCMYK, + &GUID_WICPixelFormat64bppRGBAFixedPoint, + &GUID_WICPixelFormat64bppBGRAFixedPoint, + &GUID_WICPixelFormat64bppRGBFixedPoint, + &GUID_WICPixelFormat128bppRGBAFixedPoint, + &GUID_WICPixelFormat128bppRGBFixedPoint, + &GUID_WICPixelFormat64bppRGBAHalf, + &GUID_WICPixelFormat64bppPRGBAHalf, + &GUID_WICPixelFormat64bppRGBHalf, + &GUID_WICPixelFormat48bppRGBHalf, + &GUID_WICPixelFormat32bppRGBE, + &GUID_WICPixelFormat16bppGrayHalf, + &GUID_WICPixelFormat32bppGrayFixedPoint, + &GUID_WICPixelFormat32bppRGBA1010102, + &GUID_WICPixelFormat32bppRGBA1010102XR, + &GUID_WICPixelFormat32bppR10G10B10A2, + &GUID_WICPixelFormat32bppR10G10B10A2HDR10, + &GUID_WICPixelFormat64bppCMYK, + &GUID_WICPixelFormat24bpp3Channels, + &GUID_WICPixelFormat32bpp4Channels, + &GUID_WICPixelFormat40bpp5Channels, + &GUID_WICPixelFormat48bpp6Channels, + &GUID_WICPixelFormat56bpp7Channels, + &GUID_WICPixelFormat64bpp8Channels, + &GUID_WICPixelFormat48bpp3Channels, + &GUID_WICPixelFormat64bpp4Channels, + &GUID_WICPixelFormat80bpp5Channels, + &GUID_WICPixelFormat96bpp6Channels, + &GUID_WICPixelFormat112bpp7Channels, + &GUID_WICPixelFormat128bpp8Channels, + &GUID_WICPixelFormat40bppCMYKAlpha, + &GUID_WICPixelFormat80bppCMYKAlpha, + &GUID_WICPixelFormat32bpp3ChannelsAlpha, + &GUID_WICPixelFormat40bpp4ChannelsAlpha, + &GUID_WICPixelFormat48bpp5ChannelsAlpha, + &GUID_WICPixelFormat56bpp6ChannelsAlpha, + &GUID_WICPixelFormat64bpp7ChannelsAlpha, + &GUID_WICPixelFormat72bpp8ChannelsAlpha, + &GUID_WICPixelFormat64bpp3ChannelsAlpha, + &GUID_WICPixelFormat80bpp4ChannelsAlpha, + &GUID_WICPixelFormat96bpp5ChannelsAlpha, + &GUID_WICPixelFormat112bpp6ChannelsAlpha, + &GUID_WICPixelFormat128bpp7ChannelsAlpha, + &GUID_WICPixelFormat144bpp8ChannelsAlpha, + &GUID_WICPixelFormat8bppY, + &GUID_WICPixelFormat8bppCb, + &GUID_WICPixelFormat8bppCr, + &GUID_WICPixelFormat16bppCbCr, + &GUID_WICPixelFormat16bppYQuantizedDctCoefficients, + &GUID_WICPixelFormat16bppCbQuantizedDctCoefficients, + &GUID_WICPixelFormat16bppCrQuantizedDctCoefficients, + }; + + if (!init_test_context(&ctx, d3d11)) + return; + release_test_context(&ctx); + + hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, + (void **)&factory); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICImagingFactory, (void **)&wic_factory); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT; + desc.dpiX = 96.0f; + desc.dpiY = 96.0f; + desc.usage = D2D1_RENDER_TARGET_USAGE_NONE; + desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT; + + for (i = 0; i < ARRAY_SIZE(wic_formats); ++i) + { + winetest_push_context("bitmap %u", i); + + hr = IWICImagingFactory_CreateBitmap(wic_factory, 16, 16, wic_formats[i], + WICBitmapCacheOnDemand, &wic_bitmap); + if (FAILED(hr)) + { + winetest_pop_context(); + continue; + } + + for (j = DXGI_FORMAT_UNKNOWN; j <= DXGI_FORMAT_V408; ++j) + { + if (j > DXGI_FORMAT_B4G4R4A4_UNORM && j < DXGI_FORMAT_P208) + continue; + + for (k = D2D1_ALPHA_MODE_UNKNOWN; k <= D2D1_ALPHA_MODE_IGNORE; ++k) + { + winetest_push_context("format %#x alpha %u", j, k); + + desc.pixelFormat.format = j; + desc.pixelFormat.alphaMode = k; + hr = ID2D1Factory_CreateWicBitmapRenderTarget(factory, wic_bitmap, &desc, &rt); + if (((wic_formats[i] == &GUID_WICPixelFormat8bppAlpha) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_A8_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED || k == D2D1_ALPHA_MODE_STRAIGHT)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppBGR) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_B8G8R8A8_UNORM || j == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppPBGRA) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_B8G8R8A8_UNORM || j == DXGI_FORMAT_B8G8R8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppRGB) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8B8A8_UNORM || j == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat32bppPRGBA) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8B8A8_UNORM || j == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppRGB) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppPRGBA) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat128bppPRGBAFloat) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R32G32B32A32_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat128bppRGBFloat) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R32G32B32A32_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppPRGBAHalf) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || ((wic_formats[i] == &GUID_WICPixelFormat64bppRGBHalf) + && (j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R16G16B16A16_FLOAT) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE))) + todo_wine_if(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT) + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + else if (wic_formats[i] == &GUID_WICPixelFormat8bppAlpha + || wic_formats[i] == &GUID_WICPixelFormat32bppBGR + || wic_formats[i] == &GUID_WICPixelFormat32bppPBGRA + || wic_formats[i] == &GUID_WICPixelFormat32bppRGB + || wic_formats[i] == &GUID_WICPixelFormat32bppPRGBA + || wic_formats[i] == &GUID_WICPixelFormat64bppRGB + || wic_formats[i] == &GUID_WICPixelFormat64bppPRGBA + || wic_formats[i] == &GUID_WICPixelFormat128bppPRGBAFloat + || wic_formats[i] == &GUID_WICPixelFormat128bppRGBFloat + || wic_formats[i] == &GUID_WICPixelFormat64bppPRGBAHalf + || wic_formats[i] == &GUID_WICPixelFormat64bppRGBHalf + || ((wic_formats[i] == &GUID_WICPixelFormat32bppRGBA1010102) + && !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R10G10B10A2_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_PREMULTIPLIED))) + || ((wic_formats[i] == &GUID_WICPixelFormat8bppY) + && !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE))) + || ((wic_formats[i] == &GUID_WICPixelFormat16bppCbCr) + && !((j == DXGI_FORMAT_UNKNOWN || j == DXGI_FORMAT_R8G8_UNORM) + && (k == D2D1_ALPHA_MODE_UNKNOWN || k == D2D1_ALPHA_MODE_IGNORE)))) + ok(hr == E_INVALIDARG || broken(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT + && wic_formats[i] == &GUID_WICPixelFormat32bppRGBA1010102), "Got unexpected hr %#lx.\n", hr); + else + ok(hr == D2DERR_UNSUPPORTED_PIXEL_FORMAT, "Got unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + ID2D1RenderTarget_Release(rt); + + winetest_pop_context(); + } + } + + IWICBitmap_Release(wic_bitmap); + winetest_pop_context(); + } + + IWICImagingFactory_Release(wic_factory); + ID2D1Factory_Release(factory); +} + static void test_desktop_dpi(BOOL d3d11) { ID2D1Factory *factory; @@ -13326,6 +13547,7 @@ START_TEST(d2d1) queue_test(test_dc_target); queue_test(test_hwnd_target); queue_test(test_bitmap_target); + queue_test(test_wic_bitmap_target); queue_d3d10_test(test_desktop_dpi); queue_d3d10_test(test_stroke_style); queue_test(test_gradient);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=126037
Your paranoid android.
=== debian11b (32 bit WoW report) ===
d2d1: Unhandled exception: page fault on write access to 0x00000000 in 32-bit code (0x6ab30f94).
What I would expect this to do is to use convert WIC format guid to dxgi format, and then use CheckFormatSupport(). For example does this list of supported formats change if device is created without D3D10_CREATE_DEVICE_BGRA_SUPPORT?
On Fri Nov 18 03:59:32 2022 +0000, Nikolay Sivov wrote:
What I would expect this to do is to use convert WIC format guid to dxgi format, and then use CheckFormatSupport(). For example does this list of supported formats change if device is created without D3D10_CREATE_DEVICE_BGRA_SUPPORT?
CheckFormatSupport() does check DXGI_FORMAT. But what about alpha mode? See what's in the first commit. Take GUID_WICPixelFormat8bppAlpha for example. GUID_WICPixelFormat8bppAlpha can be converted to DXGI_FORMAT_A8_UNORM. However, (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED), (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT) and (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_UNKNOWN) are supported. (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_IGNORE) is unsupported. So a (wic_guid, dxgi_format, alpha mode) map is still needed, which makes CheckFormatSupport() seem redundant.
On Fri Nov 18 03:59:32 2022 +0000, Zhiyi Zhang wrote:
CheckFormatSupport() does check DXGI_FORMAT. But what about alpha mode? See what's in the first commit. Take GUID_WICPixelFormat8bppAlpha for example. GUID_WICPixelFormat8bppAlpha can be converted to DXGI_FORMAT_A8_UNORM. However, (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED), (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_STRAIGHT) and (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_UNKNOWN) are supported. (DXGI_FORMAT_A8_UNORM, D2D1_ALPHA_MODE_IGNORE) is unsupported. So a (wic_guid, dxgi_format, alpha mode) map is still needed, which makes CheckFormatSupport() seem redundant.
Are premultiplied and straight supported for all formats, and "ignore" is unsupported for all? I see we check for "ignore" case here and there, but I don't think it's a part of d3d format, that might be supported or not. "Unknown" is not a mode at all, it needs to be set to some default. Some WIC formats are explicitly premultiplied, how does this work?
Are premultiplied and straight supported for all formats, and "ignore" is unsupported for all?
No. D2D1_ALPHA_MODE_STRAIGHT is supported only for GUID_WICPixelFormat8bppAlpha. And then D2D1_ALPHA_MODE_PREMULTIPLIED is supported for all supported WIC bitmap formats with an alpha channel. D2D1_ALPHA_MODE_IGNORE is supported for all supported WIC bitmap formats without an alpha channel.
If DXGI_FORMAT_UNKNOWN is used. The DXGI format is derived from the WIC bitmap format. For example, the DXGI format could be DXGI_FORMAT_B8G8R8A8_UNORM or DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for GUID_WICPixelFormat32bppBGR.
On Fri Nov 18 07:27:22 2022 +0000, Zhiyi Zhang wrote:
Are premultiplied and straight supported for all formats, and "ignore"
is unsupported for all? No. D2D1_ALPHA_MODE_STRAIGHT is supported only for GUID_WICPixelFormat8bppAlpha. And then D2D1_ALPHA_MODE_PREMULTIPLIED is supported for all supported WIC bitmap formats with an alpha channel. D2D1_ALPHA_MODE_IGNORE is supported for all supported WIC bitmap formats without an alpha channel. If DXGI_FORMAT_UNKNOWN is used. The DXGI format is derived from the WIC bitmap format. For example, the DXGI format could be DXGI_FORMAT_B8G8R8A8_UNORM or DXGI_FORMAT_B8G8R8A8_UNORM_SRGB for GUID_WICPixelFormat32bppBGR.
I see. Can we maybe do it in several steps then:
- if format is not specified, get it from WIC bitmap, convert to DXGI format value; - resolve alpha mode; - check against some list of {format,aplhamode} pairs, similar to d2d_bitmap_create_from_wic_bitmap(). Maybe even reusing the list. This step is only to check if format/alphamode is acceptable; - check that d3d device supports resulting dxgi format;
These could be in a bit different order. For first step I think it's good to use a list that DirectXTK code is using, with a clear error for unrecognized WIC formats.
What happens when format is specified? Presumably it has to closely match the one from bitmap? Or maybe it does SW conversion on every transfer, using WIC facilities.
What happens when format is specified? Presumably it has to closely match the one from bitmap?
E_INVALIDARG or D2DERR_UNSUPPORTED_PIXEL_FORMAT is returned when creating WIC bitmap render target. This is shown in the tests in the second patch.