-- v2: d2d1/tests: Mark some more tests that fail on NVidia devices as todo.
From: Alexandre Julliard julliard@winehq.org
--- dlls/d2d1/tests/d2d1.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 665c3200e21..cce3c9e7018 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -1165,6 +1165,26 @@ static IDXGISwapChain *create_d3d10_swapchain(ID3D10Device1 *device, HWND window return swapchain; }
+static void get_device_adapter_desc(IDXGIDevice *device, DXGI_ADAPTER_DESC *adapter_desc) +{ + IDXGIAdapter *adapter; + HRESULT hr; + + hr = IDXGIDevice_GetAdapter(device, &adapter); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = IDXGIAdapter_GetDesc(adapter, adapter_desc); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + IDXGIAdapter_Release(adapter); +} + +static BOOL is_nvidia_device(IDXGIDevice *device) +{ + DXGI_ADAPTER_DESC adapter_desc; + + get_device_adapter_desc(device, &adapter_desc); + return adapter_desc.VendorId == 0x10de; +} + static ID2D1RenderTarget *create_render_target_desc(IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc, BOOL d3d11) { @@ -6592,18 +6612,19 @@ static void test_draw_geometry(BOOL d3d11) ID2D1GeometrySink *sink; ID2D1RenderTarget *rt; ID2D1Factory *factory; + BOOL match, is_nvidia; D2D1_POINT_2F p0, p1; D2D1_ELLIPSE ellipse; D2D1_COLOR_F color; D2D1_RECT_F rect; HRESULT hr; - BOOL match;
if (!init_test_context(&ctx, d3d11)) return;
rt = ctx.rt; factory = ctx.factory; + is_nvidia = is_nvidia_device(ctx.device);
ID2D1RenderTarget_SetDpi(rt, 192.0f, 48.0f); ID2D1RenderTarget_SetAntialiasMode(rt, D2D1_ANTIALIAS_MODE_ALIASED); @@ -7268,6 +7289,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); + todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n"); match = compare_figure(&ctx, 160, 0, 160, 160, 0xff652e89, 0, "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" @@ -7276,6 +7298,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); + todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n"); match = compare_figure(&ctx, 320, 0, 160, 160, 0xff652e89, 0, "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" @@ -7284,6 +7307,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); + todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n"); match = compare_figure(&ctx, 480, 0, 160, 160, 0xff652e89, 0, "yC5aRlpGWjxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" @@ -7292,6 +7316,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); + todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n");
match = compare_figure(&ctx, 0, 160, 160, 160, 0xff652e89, 64,
On 9/8/22 13:58, Alexandre Julliard wrote:
@@ -7268,6 +7289,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A");
- todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n"); match = compare_figure(&ctx, 160, 0, 160, 160, 0xff652e89, 0, "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
@@ -7276,6 +7298,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A");
- todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n"); match = compare_figure(&ctx, 320, 0, 160, 160, 0xff652e89, 0, "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
@@ -7284,6 +7307,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A");
- todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n"); match = compare_figure(&ctx, 480, 0, 160, 160, 0xff652e89, 0, "yC5aRlpGWjxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
@@ -7292,6 +7316,7 @@ static void test_draw_geometry(BOOL d3d11) "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A");
todo_wine_if (!match && is_nvidia) ok(match, "Figure does not match.\n");
match = compare_figure(&ctx, 0, 160, 160, 160, 0xff652e89, 64,
I see the 2nd and 3rd failure on radeonsi (and radv), and all four failures on llvmpipe (and lavapipe). This is with Mesa 22.2.0-rc3. Nikolay, Henri, do neither of you see test failures, and with which drivers if so?
I did it a bit differently, let me now which one you prefer.
On Thu Sep 8 19:12:58 2022 +0000, **** wrote:
Zebediah Figura replied on the mailing list:
On 9/8/22 13:58, Alexandre Julliard wrote: > @@ -7268,6 +7289,7 @@ static void test_draw_geometry(BOOL d3d11) > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" > "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); > + todo_wine_if (!match && is_nvidia) > ok(match, "Figure does not match.\n"); > match = compare_figure(&ctx, 160, 0, 160, 160, 0xff652e89, 0, > "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > @@ -7276,6 +7298,7 @@ static void test_draw_geometry(BOOL d3d11) > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" > "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); > + todo_wine_if (!match && is_nvidia) > ok(match, "Figure does not match.\n"); > match = compare_figure(&ctx, 320, 0, 160, 160, 0xff652e89, 0, > "vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > @@ -7284,6 +7307,7 @@ static void test_draw_geometry(BOOL d3d11) > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" > "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); > + todo_wine_if (!match && is_nvidia) > ok(match, "Figure does not match.\n"); > match = compare_figure(&ctx, 480, 0, 160, 160, 0xff652e89, 0, > "yC5aRlpGWjxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > @@ -7292,6 +7316,7 @@ static void test_draw_geometry(BOOL d3d11) > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8" > "FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU" > "PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8ZDxkPGQ8ZDxk3i8A"); > + todo_wine_if (!match && is_nvidia) > ok(match, "Figure does not match.\n"); > > match = compare_figure(&ctx, 0, 160, 160, 160, 0xff652e89, 64, I see the 2nd and 3rd failure on radeonsi (and radv), and all four failures on llvmpipe (and lavapipe). This is with Mesa 22.2.0-rc3. Nikolay, Henri, do neither of you see test failures, and with which drivers if so?
I only run it on Intel 8086:0416, and that shows no failures. It's also an old one, I don't know if newer mesa updates change anything there as much as they do for current gpus. We had failures like that before I think, the solution was to tweak geometries or transforms to make it more reliable.
I see the 2nd and 3rd failure on radeonsi (and radv), and all four failures on llvmpipe (and lavapipe). This is with Mesa 22.2.0-rc3. Nikolay, Henri, do neither of you see test failures, and with which drivers if so?
These pass for me on both Intel SKL / Mesa 20.3.5, and AMD VEGA10 / Mesa 20.1.9.
It's perhaps also worth pointing out that the second to last parameter to compare_figure() is a tolerance; that's zero for all the four tests in question, IIRC because these are supposed to draw relatively straightforward figures with straight lines that are expected to match exactly, but it may be interesting to check how much that would need to be raised to pass. Perhaps even more insightful would be to insert a IDXGISwapChain_Present() and Sleep() and get a screenshot, to compare with e.g. a run on WARP.
On 9/9/22 02:58, Henri Verbeet (@hverbeet) wrote:
I see the 2nd and 3rd failure on radeonsi (and radv), and all four failures on llvmpipe (and lavapipe). This is with Mesa 22.2.0-rc3. Nikolay, Henri, do neither of you see test failures, and with which drivers if so?
These pass for me on both Intel SKL / Mesa 20.3.5, and AMD VEGA10 / Mesa 20.1.9.
It's perhaps also worth pointing out that the second to last parameter to compare_figure() is a tolerance; that's zero for all the four tests in question, IIRC because these are supposed to draw relatively straightforward figures with straight lines that are expected to match exactly, but it may be interesting to check how much that would need to be raised to pass. Perhaps even more insightful would be to insert a IDXGISwapChain_Present() and Sleep() and get a screenshot, to compare with e.g. a run on WARP.
I looked at this in renderdoc. For some reason, despite the relevant triangles having identical Y values even after the VS, they're not rasterized identically, even by llvmpipe. But the difference is never greater than a pixel. WARP, by contrast, renders everything as a straight line.
Also, if I do a find-and-replace of ".0f" to ".5f" of all the constants in that section, I get identical results between radeonsi / llvmpipe / WARP. So maybe that's a better option.
--Zeb
In the Gitlab CI environment it would need a tolerance of 140 to succeed. Would that be considered acceptable?
In the Gitlab CI environment it would need a tolerance of 140 to succeed. Would that be considered acceptable?
In principle, yes. Testing locally with llvmpipe, I can confirm Zeb's findings though, and adjusting the geometry seems preferable. The attached [patch](/uploads/43f84ecbb02880dc831abcc99f6cb14d/patch.diff) makes it work for me on both llvmpipe and VEGA10.