[PATCH 12/12] d2d1/tests: Run most tests on d3d11 as well.

Henri Verbeet hverbeet at codeweavers.com
Fri Jan 15 12:00:04 CST 2021


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
v3:
    - Get rid of the "ctx" argument to release_d3d11_resource_readback().

 dlls/d2d1/tests/Makefile.in |   2 +-
 dlls/d2d1/tests/d2d1.c      | 352 +++++++++++++++++++++++++-----------
 2 files changed, 247 insertions(+), 107 deletions(-)

diff --git a/dlls/d2d1/tests/Makefile.in b/dlls/d2d1/tests/Makefile.in
index 91ede7888aa..5eeb815e07f 100644
--- a/dlls/d2d1/tests/Makefile.in
+++ b/dlls/d2d1/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = d2d1.dll
-IMPORTS   = d2d1 d3d10_1 dwrite dxguid uuid user32 advapi32 ole32 gdi32
+IMPORTS   = d2d1 d3d10_1 d3d11 dwrite dxguid uuid user32 advapi32 ole32 gdi32
 
 C_SRCS = \
 	d2d1.c
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index d38cd5649a6..3e7df715dda 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -21,6 +21,7 @@
 #include <math.h>
 #include <float.h>
 #include "d2d1_1.h"
+#include "d3d11.h"
 #include "wincrypt.h"
 #include "wine/test.h"
 #include "initguid.h"
@@ -38,12 +39,14 @@ static BOOL use_mt = TRUE;
 
 static struct test_entry
 {
-    void (*test)(void);
+    void (*test)(BOOL d3d11);
+    BOOL d3d11;
 } *mt_tests;
 size_t mt_tests_size, mt_test_count;
 
 struct d2d1_test_context
 {
+    BOOL d3d11;
     IDXGIDevice *device;
     HWND window;
     IDXGISwapChain *swapchain;
@@ -53,7 +56,12 @@ struct d2d1_test_context
 
 struct resource_readback
 {
-    ID3D10Resource *resource;
+    BOOL d3d11;
+    union
+    {
+        ID3D10Resource *d3d10_resource;
+        ID3D11Resource *d3d11_resource;
+    } u;
     unsigned int pitch, width, height;
     void *data;
 };
@@ -108,14 +116,26 @@ struct expected_geometry_figure
     const struct geometry_segment *segments;
 };
 
-static void queue_test(void (*test)(void))
+static void queue_d3d1x_test(void (*test)(BOOL d3d11), BOOL d3d11)
 {
     if (mt_test_count >= mt_tests_size)
     {
         mt_tests_size = max(16, mt_tests_size * 2);
         mt_tests = heap_realloc(mt_tests, mt_tests_size * sizeof(*mt_tests));
     }
-    mt_tests[mt_test_count++].test = test;
+    mt_tests[mt_test_count].test = test;
+    mt_tests[mt_test_count++].d3d11 = d3d11;
+}
+
+static void queue_d3d10_test(void (*test)(BOOL d3d11))
+{
+    queue_d3d1x_test(test, FALSE);
+}
+
+static void queue_test(void (*test)(BOOL d3d11))
+{
+    queue_d3d1x_test(test, FALSE);
+    queue_d3d1x_test(test, TRUE);
 }
 
 static DWORD WINAPI thread_func(void *ctx)
@@ -126,7 +146,7 @@ static DWORD WINAPI thread_func(void *ctx)
     {
         j = *i;
         if (InterlockedCompareExchange(i, j + 1, j) == j)
-            mt_tests[j].test();
+            mt_tests[j].test(mt_tests[j].d3d11);
     }
 
     return 0;
@@ -143,7 +163,7 @@ static void run_queued_tests(void)
     {
         for (i = 0; i < mt_test_count; ++i)
         {
-            mt_tests[i].test();
+            mt_tests[i].test(mt_tests[i].d3d11);
         }
 
         return;
@@ -311,9 +331,8 @@ static void cubic_to(ID2D1GeometrySink *sink, float x1, float y1, float x2, floa
     ID2D1GeometrySink_AddBezier(sink, &b);
 }
 
-static void get_surface_readback(struct d2d1_test_context *ctx, struct resource_readback *rb)
+static void get_d3d10_surface_readback(IDXGISurface *surface, struct resource_readback *rb)
 {
-    IDXGISurface *surface = ctx->surface;
     D3D10_TEXTURE2D_DESC texture_desc;
     D3D10_MAPPED_TEXTURE2D map_desc;
     DXGI_SURFACE_DESC surface_desc;
@@ -338,27 +357,103 @@ static void get_surface_readback(struct d2d1_test_context *ctx, struct resource_
     texture_desc.BindFlags = 0;
     texture_desc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
     texture_desc.MiscFlags = 0;
-    hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, (ID3D10Texture2D **)&rb->resource);
+    hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, (ID3D10Texture2D **)&rb->u.d3d10_resource);
     ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
 
     rb->width = texture_desc.Width;
     rb->height = texture_desc.Height;
 
-    ID3D10Device_CopyResource(device, rb->resource, src_resource);
+    ID3D10Device_CopyResource(device, rb->u.d3d10_resource, src_resource);
     ID3D10Resource_Release(src_resource);
     ID3D10Device_Release(device);
 
-    hr = ID3D10Texture2D_Map((ID3D10Texture2D *)rb->resource, 0, D3D10_MAP_READ, 0, &map_desc);
+    hr = ID3D10Texture2D_Map((ID3D10Texture2D *)rb->u.d3d10_resource, 0, D3D10_MAP_READ, 0, &map_desc);
+    ok(SUCCEEDED(hr), "Failed to map texture, hr %#x.\n", hr);
+
+    rb->pitch = map_desc.RowPitch;
+    rb->data = map_desc.pData;
+}
+
+static void get_d3d11_surface_readback(IDXGISurface *surface, struct resource_readback *rb)
+{
+    D3D11_TEXTURE2D_DESC texture_desc;
+    D3D11_MAPPED_SUBRESOURCE map_desc;
+    DXGI_SURFACE_DESC surface_desc;
+    ID3D11Resource *src_resource;
+    ID3D11DeviceContext *context;
+    ID3D11Device *device;
+    HRESULT hr;
+
+    hr = IDXGISurface_GetDevice(surface, &IID_ID3D11Device, (void **)&device);
+    ok(SUCCEEDED(hr), "Failed to get device, hr %#x.\n", hr);
+    hr = IDXGISurface_QueryInterface(surface, &IID_ID3D11Resource, (void **)&src_resource);
+    ok(SUCCEEDED(hr), "Failed to query resource interface, hr %#x.\n", hr);
+
+    hr = IDXGISurface_GetDesc(surface, &surface_desc);
+    ok(SUCCEEDED(hr), "Failed to get surface desc, hr %#x.\n", hr);
+    texture_desc.Width = surface_desc.Width;
+    texture_desc.Height = surface_desc.Height;
+    texture_desc.MipLevels = 1;
+    texture_desc.ArraySize = 1;
+    texture_desc.Format = surface_desc.Format;
+    texture_desc.SampleDesc = surface_desc.SampleDesc;
+    texture_desc.Usage = D3D11_USAGE_STAGING;
+    texture_desc.BindFlags = 0;
+    texture_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
+    texture_desc.MiscFlags = 0;
+    hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, (ID3D11Texture2D **)&rb->u.d3d11_resource);
+    ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+
+    rb->width = texture_desc.Width;
+    rb->height = texture_desc.Height;
+
+    ID3D11Device_GetImmediateContext(device, &context);
+    ID3D11DeviceContext_CopyResource(context, rb->u.d3d11_resource, src_resource);
+    ID3D11Resource_Release(src_resource);
+    ID3D11Device_Release(device);
+
+    hr = ID3D11DeviceContext_Map(context, (ID3D11Resource *)rb->u.d3d11_resource, 0, D3D11_MAP_READ, 0, &map_desc);
     ok(SUCCEEDED(hr), "Failed to map texture, hr %#x.\n", hr);
+    ID3D11DeviceContext_Release(context);
 
     rb->pitch = map_desc.RowPitch;
     rb->data = map_desc.pData;
 }
 
+static void get_surface_readback(struct d2d1_test_context *ctx, struct resource_readback *rb)
+{
+    if ((rb->d3d11 = ctx->d3d11))
+        get_d3d11_surface_readback(ctx->surface, rb);
+    else
+        get_d3d10_surface_readback(ctx->surface, rb);
+}
+
+static void release_d3d10_resource_readback(struct resource_readback *rb)
+{
+    ID3D10Texture2D_Unmap((ID3D10Texture2D *)rb->u.d3d10_resource, 0);
+    ID3D10Resource_Release(rb->u.d3d10_resource);
+}
+
+static void release_d3d11_resource_readback(struct resource_readback *rb)
+{
+    ID3D11DeviceContext *context;
+    ID3D11Device *device;
+
+    ID3D11Resource_GetDevice(rb->u.d3d11_resource, &device);
+    ID3D11Device_GetImmediateContext(device, &context);
+    ID3D11Device_Release(device);
+
+    ID3D11DeviceContext_Unmap(context, rb->u.d3d11_resource, 0);
+    ID3D11Resource_Release(rb->u.d3d11_resource);
+    ID3D11DeviceContext_Release(context);
+}
+
 static void release_resource_readback(struct resource_readback *rb)
 {
-    ID3D10Texture2D_Unmap((ID3D10Texture2D *)rb->resource, 0);
-    ID3D10Resource_Release(rb->resource);
+    if (rb->d3d11)
+        release_d3d11_resource_readback(rb);
+    else
+        release_d3d10_resource_readback(rb);
 }
 
 static DWORD get_readback_colour(struct resource_readback *rb, unsigned int x, unsigned int y)
@@ -711,18 +806,47 @@ static ID3D10Device1 *create_d3d10_device(void)
     return NULL;
 }
 
-static IDXGIDevice *create_device(void)
+static ID3D11Device *create_d3d11_device(void)
+{
+    DWORD level = D3D_FEATURE_LEVEL_11_0;
+    ID3D11Device *device;
+
+    if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL,
+            D3D10_CREATE_DEVICE_BGRA_SUPPORT, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL)))
+        return device;
+    if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_WARP, NULL,
+            D3D10_CREATE_DEVICE_BGRA_SUPPORT, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL)))
+        return device;
+    if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL,
+            D3D10_CREATE_DEVICE_BGRA_SUPPORT, &level, 1, D3D11_SDK_VERSION, &device, NULL, NULL)))
+        return device;
+
+    return NULL;
+}
+
+static IDXGIDevice *create_device(BOOL d3d11)
 {
     ID3D10Device1 *d3d10_device;
+    ID3D11Device *d3d11_device;
     IDXGIDevice *device;
     HRESULT hr;
 
-    if (!(d3d10_device = create_d3d10_device()))
-        return NULL;
+    if (d3d11)
+    {
+        if (!(d3d11_device = create_d3d11_device()))
+            return NULL;
+        hr = ID3D11Device_QueryInterface(d3d11_device, &IID_IDXGIDevice, (void **)&device);
+        ID3D11Device_Release(d3d11_device);
+    }
+    else
+    {
+        if (!(d3d10_device = create_d3d10_device()))
+            return NULL;
+        hr = ID3D10Device1_QueryInterface(d3d10_device, &IID_IDXGIDevice, (void **)&device);
+        ID3D10Device1_Release(d3d10_device);
+    }
 
-    hr = ID3D10Device1_QueryInterface(d3d10_device, &IID_IDXGIDevice, (void **)&device);
     ok(SUCCEEDED(hr), "Failed to get DXGI device, hr %#x.\n", hr);
-    ID3D10Device1_Release(d3d10_device);
 
     return device;
 }
@@ -787,7 +911,8 @@ static IDXGISwapChain *create_d3d10_swapchain(ID3D10Device1 *device, HWND window
     return swapchain;
 }
 
-static ID2D1RenderTarget *create_render_target_desc(IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc)
+static ID2D1RenderTarget *create_render_target_desc(IDXGISurface *surface,
+        const D2D1_RENDER_TARGET_PROPERTIES *desc, BOOL d3d11)
 {
     ID2D1RenderTarget *render_target;
     ID2D1Factory *factory;
@@ -796,13 +921,16 @@ static ID2D1RenderTarget *create_render_target_desc(IDXGISurface *surface, const
     hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory);
     ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr);
     hr = ID2D1Factory_CreateDxgiSurfaceRenderTarget(factory, surface, desc, &render_target);
-    ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+    todo_wine_if(d3d11) ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
     ID2D1Factory_Release(factory);
 
+    if (FAILED(hr))
+        return NULL;
+
     return render_target;
 }
 
-static ID2D1RenderTarget *create_render_target(IDXGISurface *surface)
+static ID2D1RenderTarget *create_render_target(IDXGISurface *surface, BOOL d3d11)
 {
     D2D1_RENDER_TARGET_PROPERTIES desc;
 
@@ -814,7 +942,7 @@ static ID2D1RenderTarget *create_render_target(IDXGISurface *surface)
     desc.usage = D2D1_RENDER_TARGET_USAGE_NONE;
     desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
 
-    return create_render_target_desc(surface, &desc);
+    return create_render_target_desc(surface, &desc, d3d11);
 }
 
 #define release_test_context(ctx) release_test_context_(__LINE__, ctx)
@@ -834,14 +962,15 @@ static void release_test_context_(unsigned int line, struct d2d1_test_context *c
     IDXGIDevice_Release(ctx->device);
 }
 
-#define init_test_context(ctx) init_test_context_(__LINE__, ctx)
-static BOOL init_test_context_(unsigned int line, struct d2d1_test_context *ctx)
+#define init_test_context(ctx, d3d11) init_test_context_(__LINE__, ctx, d3d11)
+static BOOL init_test_context_(unsigned int line, struct d2d1_test_context *ctx, BOOL d3d11)
 {
     HRESULT hr;
 
     memset(ctx, 0, sizeof(*ctx));
 
-    if (!(ctx->device = create_device()))
+    ctx->d3d11 = d3d11;
+    if (!(ctx->device = create_device(d3d11)))
     {
         skip_(__FILE__, line)("Failed to create device, skipping tests.\n");
         return FALSE;
@@ -854,7 +983,18 @@ static BOOL init_test_context_(unsigned int line, struct d2d1_test_context *ctx)
     hr = IDXGISwapChain_GetBuffer(ctx->swapchain, 0, &IID_IDXGISurface, (void **)&ctx->surface);
     ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get buffer, hr %#x.\n", hr);
 
-    ctx->rt = create_render_target(ctx->surface);
+    ctx->rt = create_render_target(ctx->surface, d3d11);
+    if (!ctx->rt && d3d11)
+    {
+        todo_wine win_skip_(__FILE__, line)("Skipping d3d11 tests.\n");
+
+        IDXGISurface_Release(ctx->surface);
+        IDXGISwapChain_Release(ctx->swapchain);
+        DestroyWindow(ctx->window);
+        IDXGIDevice_Release(ctx->device);
+
+        return FALSE;
+    }
     ok_(__FILE__, line)(!!ctx->rt, "Failed to create render target.\n");
 
     return TRUE;
@@ -1166,7 +1306,7 @@ static void geometry_sink_check_(unsigned int line, const struct geometry_sink *
     }
 }
 
-static void test_clip(void)
+static void test_clip(BOOL d3d11)
 {
     struct d2d1_test_context ctx;
     D2D1_MATRIX_3X2_F matrix;
@@ -1186,7 +1326,7 @@ static void test_clip(void)
         0.0f, 0.0f,
     }}};
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -1358,7 +1498,7 @@ static void test_clip(void)
     release_test_context(&ctx);
 }
 
-static void test_state_block(void)
+static void test_state_block(BOOL d3d11)
 {
     IDWriteRenderingParams *text_rendering_params1, *text_rendering_params2;
     D2D1_DRAWING_STATE_DESCRIPTION drawing_state;
@@ -1389,7 +1529,7 @@ static void test_state_block(void)
         11.0f, 12.0f,
     }}};
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -1618,7 +1758,7 @@ static void test_state_block(void)
     release_test_context(&ctx);
 }
 
-static void test_color_brush(void)
+static void test_color_brush(BOOL d3d11)
 {
     D2D1_MATRIX_3X2_F matrix, tmp_matrix;
     D2D1_BRUSH_PROPERTIES brush_desc;
@@ -1631,7 +1771,7 @@ static void test_color_brush(void)
     HRESULT hr;
     BOOL match;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -1703,7 +1843,7 @@ static void test_color_brush(void)
     release_test_context(&ctx);
 }
 
-static void test_bitmap_brush(void)
+static void test_bitmap_brush(BOOL d3d11)
 {
     D2D1_BITMAP_INTERPOLATION_MODE interpolation_mode;
     ID2D1TransformedGeometry *transformed_geometry;
@@ -1756,7 +1896,7 @@ static void test_bitmap_brush(void)
         0xffffffff, 0xff000000, 0xff000000, 0xff000000,
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -2096,7 +2236,7 @@ static void test_bitmap_brush(void)
     release_test_context(&ctx);
 }
 
-static void test_linear_brush(void)
+static void test_linear_brush(BOOL d3d11)
 {
     D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES gradient_properties;
     ID2D1GradientStopCollection *gradient, *tmp_gradient;
@@ -2153,7 +2293,7 @@ static void test_linear_brush(void)
         {520, 390, 0xff90ae40},
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -2287,7 +2427,7 @@ static void test_linear_brush(void)
     release_test_context(&ctx);
 }
 
-static void test_radial_brush(void)
+static void test_radial_brush(BOOL d3d11)
 {
     D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES gradient_properties;
     ID2D1GradientStopCollection *gradient, *tmp_gradient;
@@ -2344,7 +2484,7 @@ static void test_radial_brush(void)
         {520, 390, 0xff4059e6},
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -2601,7 +2741,7 @@ static void fill_geometry_sink_bezier(ID2D1GeometrySink *sink, unsigned int holl
     ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
 }
 
-static void test_path_geometry(void)
+static void test_path_geometry(BOOL d3d11)
 {
     ID2D1TransformedGeometry *transformed_geometry;
     D2D1_MATRIX_3X2_F matrix, tmp_matrix;
@@ -2934,7 +3074,7 @@ static void test_path_geometry(void)
         {D2D1_FIGURE_BEGIN_HOLLOW, D2D1_FIGURE_END_OPEN,   { 40.0f,  20.0f},  2, &expected_segments[172]},
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -3660,7 +3800,7 @@ static void test_path_geometry(void)
     release_test_context(&ctx);
 }
 
-static void test_rectangle_geometry(void)
+static void test_rectangle_geometry(BOOL d3d11)
 {
     ID2D1TransformedGeometry *transformed_geometry;
     ID2D1RectangleGeometry *geometry;
@@ -3941,7 +4081,7 @@ static void test_rectangle_geometry(void)
     ID2D1Factory_Release(factory);
 }
 
-static void test_rounded_rectangle_geometry(void)
+static void test_rounded_rectangle_geometry(BOOL d3d11)
 {
     ID2D1RoundedRectangleGeometry *geometry;
     D2D1_ROUNDED_RECT rect, rect2;
@@ -3987,7 +4127,7 @@ static void test_rounded_rectangle_geometry(void)
     ID2D1Factory_Release(factory);
 }
 
-static void test_bitmap_formats(void)
+static void test_bitmap_formats(BOOL d3d11)
 {
     D2D1_BITMAP_PROPERTIES bitmap_desc;
     struct d2d1_test_context ctx;
@@ -4020,7 +4160,7 @@ static void test_bitmap_formats(void)
         {DXGI_FORMAT_B8G8R8A8_UNORM_SRGB,   0x8a},
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -4050,7 +4190,7 @@ static void test_bitmap_formats(void)
     release_test_context(&ctx);
 }
 
-static void test_alpha_mode(void)
+static void test_alpha_mode(BOOL d3d11)
 {
     D2D1_RENDER_TARGET_PROPERTIES rt_desc;
     D2D1_BITMAP_PROPERTIES bitmap_desc;
@@ -4074,7 +4214,7 @@ static void test_alpha_mode(void)
         0x7f7f7f7f, 0x7f000000, 0x7f000000, 0x7f000000,
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -4169,7 +4309,7 @@ static void test_alpha_mode(void)
     rt_desc.dpiY = 0.0f;
     rt_desc.usage = D2D1_RENDER_TARGET_USAGE_NONE;
     rt_desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
-    rt = create_render_target_desc(ctx.surface, &rt_desc);
+    rt = create_render_target_desc(ctx.surface, &rt_desc, d3d11);
     ok(!!rt, "Failed to create render target.\n");
 
     ID2D1RenderTarget_SetAntialiasMode(rt, D2D1_ANTIALIAS_MODE_ALIASED);
@@ -4264,7 +4404,7 @@ static void test_alpha_mode(void)
     release_test_context(&ctx);
 }
 
-static void test_shared_bitmap(void)
+static void test_shared_bitmap(BOOL d3d11)
 {
     IWICBitmap *wic_bitmap1, *wic_bitmap2;
     ID2D1GdiInteropRenderTarget *interop;
@@ -4285,7 +4425,7 @@ static void test_shared_bitmap(void)
     HWND window2;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     window2 = create_window();
@@ -4350,7 +4490,7 @@ static void test_shared_bitmap(void)
     /* DXGI surface render targets with different devices but the same factory. */
     IDXGISurface_Release(surface2);
     IDXGISwapChain_Release(swapchain2);
-    device2 = create_device();
+    device2 = create_device(d3d11);
     ok(!!device2, "Failed to create device.\n");
     swapchain2 = create_swapchain(device2, window2, TRUE);
     hr = IDXGISwapChain_GetBuffer(swapchain2, 0, &IID_IDXGISurface, (void **)&surface2);
@@ -4511,7 +4651,7 @@ static void test_shared_bitmap(void)
     CoUninitialize();
 }
 
-static void test_bitmap_updates(void)
+static void test_bitmap_updates(BOOL d3d11)
 {
     D2D1_BITMAP_PROPERTIES bitmap_desc;
     struct d2d1_test_context ctx;
@@ -4532,7 +4672,7 @@ static void test_bitmap_updates(void)
         0xffffffff, 0xff000000, 0xff000000, 0xff000000,
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -4599,7 +4739,7 @@ static void test_bitmap_updates(void)
     release_test_context(&ctx);
 }
 
-static void test_opacity_brush(void)
+static void test_opacity_brush(BOOL d3d11)
 {
     ID2D1BitmapBrush *bitmap_brush, *opacity_brush;
     D2D1_BITMAP_PROPERTIES bitmap_desc;
@@ -4625,7 +4765,7 @@ static void test_opacity_brush(void)
         0xffffffff, 0x40000000, 0x40000000, 0xff000000,
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -4765,7 +4905,7 @@ static void test_opacity_brush(void)
     release_test_context(&ctx);
 }
 
-static void test_create_target(void)
+static void test_create_target(BOOL d3d11)
 {
     struct d2d1_test_context ctx;
     ID2D1Factory *factory;
@@ -4788,7 +4928,7 @@ static void test_create_target(void)
     };
     unsigned int i;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory);
@@ -4843,7 +4983,7 @@ static void test_create_target(void)
     release_test_context(&ctx);
 }
 
-static void test_draw_text_layout(void)
+static void test_draw_text_layout(BOOL d3d11)
 {
     static const struct
     {
@@ -4892,7 +5032,7 @@ static void test_draw_text_layout(void)
     D2D1_RECT_F rect;
     unsigned int i;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
 
@@ -5021,7 +5161,7 @@ static void create_target_dibsection(HDC hdc, UINT32 width, UINT32 height)
     DeleteObject(SelectObject(hdc, hbm));
 }
 
-static void test_dc_target(void)
+static void test_dc_target(BOOL d3d11)
 {
     static const D2D1_PIXEL_FORMAT invalid_formats[] =
     {
@@ -5051,7 +5191,7 @@ static void test_dc_target(void)
     HRESULT hr;
     RECT rect;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
     release_test_context(&ctx);
 
@@ -5249,7 +5389,7 @@ todo_wine
     ID2D1Factory_Release(factory);
 }
 
-static void test_hwnd_target(void)
+static void test_hwnd_target(BOOL d3d11)
 {
     D2D1_HWND_RENDER_TARGET_PROPERTIES hwnd_rt_desc;
     ID2D1GdiInteropRenderTarget *interop;
@@ -5261,7 +5401,7 @@ static void test_hwnd_target(void)
     D2D1_SIZE_U size;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
     release_test_context(&ctx);
 
@@ -5409,7 +5549,7 @@ static void test_compatible_target_size_(unsigned int line, ID2D1RenderTarget *r
     ID2D1BitmapRenderTarget_Release(bitmap_rt);
 }
 
-static void test_bitmap_target(void)
+static void test_bitmap_target(BOOL d3d11)
 {
     D2D1_HWND_RENDER_TARGET_PROPERTIES hwnd_rt_desc;
     ID2D1GdiInteropRenderTarget *interop;
@@ -5428,7 +5568,7 @@ static void test_bitmap_target(void)
     ULONG refcount;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
     release_test_context(&ctx);
 
@@ -5595,7 +5735,7 @@ static void test_bitmap_target(void)
     ID2D1Factory_Release(factory);
 }
 
-static void test_desktop_dpi(void)
+static void test_desktop_dpi(BOOL d3d11)
 {
     ID2D1Factory *factory;
     float dpi_x, dpi_y;
@@ -5611,7 +5751,7 @@ static void test_desktop_dpi(void)
     ID2D1Factory_Release(factory);
 }
 
-static void test_stroke_style(void)
+static void test_stroke_style(BOOL d3d11)
 {
     static const struct
     {
@@ -5755,7 +5895,7 @@ static void test_stroke_style(void)
     ID2D1Factory_Release(factory);
 }
 
-static void test_gradient(void)
+static void test_gradient(BOOL d3d11)
 {
     ID2D1GradientStopCollection *gradient;
     D2D1_GRADIENT_STOP stops[3], stops2[3];
@@ -5766,7 +5906,7 @@ static void test_gradient(void)
     UINT32 count;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -5798,7 +5938,7 @@ static void test_gradient(void)
     release_test_context(&ctx);
 }
 
-static void test_draw_geometry(void)
+static void test_draw_geometry(BOOL d3d11)
 {
     ID2D1TransformedGeometry *transformed_geometry[4];
     ID2D1RectangleGeometry *rect_geometry[2];
@@ -5818,7 +5958,7 @@ static void test_draw_geometry(void)
     HRESULT hr;
     BOOL match;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -6710,7 +6850,7 @@ static void test_draw_geometry(void)
     release_test_context(&ctx);
 }
 
-static void test_fill_geometry(void)
+static void test_fill_geometry(BOOL d3d11)
 {
     ID2D1TransformedGeometry *transformed_geometry[4];
     ID2D1RectangleGeometry *rect_geometry[2];
@@ -6729,7 +6869,7 @@ static void test_fill_geometry(void)
     HRESULT hr;
     BOOL match;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -7508,7 +7648,7 @@ static void test_fill_geometry(void)
     release_test_context(&ctx);
 }
 
-static void test_gdi_interop(void)
+static void test_gdi_interop(BOOL d3d11)
 {
     ID2D1GdiInteropRenderTarget *interop;
     D2D1_RENDER_TARGET_PROPERTIES desc;
@@ -7524,7 +7664,7 @@ static void test_gdi_interop(void)
     RECT rect;
     HDC dc;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory);
@@ -7639,7 +7779,7 @@ todo_wine
     release_test_context(&ctx);
 }
 
-static void test_layer(void)
+static void test_layer(BOOL d3d11)
 {
     ID2D1Factory *factory, *layer_factory;
     struct d2d1_test_context ctx;
@@ -7648,7 +7788,7 @@ static void test_layer(void)
     D2D1_SIZE_F size;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -7679,7 +7819,7 @@ static void test_layer(void)
     release_test_context(&ctx);
 }
 
-static void test_bezier_intersect(void)
+static void test_bezier_intersect(BOOL d3d11)
 {
     D2D1_POINT_2F point = {0.0f, 0.0f};
     struct d2d1_test_context ctx;
@@ -7692,7 +7832,7 @@ static void test_bezier_intersect(void)
     HRESULT hr;
     BOOL match;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -7813,7 +7953,7 @@ static void test_bezier_intersect(void)
     release_test_context(&ctx);
 }
 
-static void test_create_device(void)
+static void test_create_device(BOOL d3d11)
 {
     D2D1_CREATION_PROPERTIES properties = {0};
     struct d2d1_test_context ctx;
@@ -7823,7 +7963,7 @@ static void test_create_device(void)
     ULONG refcount;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     if (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory1, NULL, (void **)&factory)))
@@ -8048,7 +8188,7 @@ static IDXGISurface *create_surface(IDXGIDevice *dxgi_device, DXGI_FORMAT format
     return surface;
 }
 
-static void test_bitmap_surface(void)
+static void test_bitmap_surface(BOOL d3d11)
 {
     static const struct bitmap_format_test
     {
@@ -8095,7 +8235,7 @@ static void test_bitmap_surface(void)
     IWICBitmap *wic_bitmap;
     IWICImagingFactory *wic_factory;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     if (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory1, NULL, (void **)&factory)))
@@ -8283,7 +8423,7 @@ static void test_bitmap_surface(void)
     release_test_context(&ctx);
 }
 
-static void test_device_context(void)
+static void test_device_context(BOOL d3d11)
 {
     D2D1_HWND_RENDER_TARGET_PROPERTIES hwnd_rt_desc;
     D2D1_RENDER_TARGET_PROPERTIES rt_desc;
@@ -8305,7 +8445,7 @@ static void test_device_context(void)
     IWICBitmap *wic_bitmap;
     IWICImagingFactory *wic_factory;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     if (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory1, NULL, (void **)&factory)))
@@ -8470,7 +8610,7 @@ todo_wine
     release_test_context(&ctx);
 }
 
-static void test_invert_matrix(void)
+static void test_invert_matrix(BOOL d3d11)
 {
     static const struct
     {
@@ -8553,7 +8693,7 @@ static void test_invert_matrix(void)
     }
 }
 
-static void test_skew_matrix(void)
+static void test_skew_matrix(BOOL d3d11)
 {
     static const struct
     {
@@ -8591,7 +8731,7 @@ static void test_skew_matrix(void)
     }
 }
 
-static ID2D1DeviceContext *create_device_context(ID2D1Factory1 *factory, IDXGIDevice *dxgi_device)
+static ID2D1DeviceContext *create_device_context(ID2D1Factory1 *factory, IDXGIDevice *dxgi_device, BOOL d3d11)
 {
     ID2D1DeviceContext *device_context;
     ID2D1Device *device;
@@ -8607,7 +8747,7 @@ static ID2D1DeviceContext *create_device_context(ID2D1Factory1 *factory, IDXGIDe
     return device_context;
 }
 
-static void test_command_list(void)
+static void test_command_list(BOOL d3d11)
 {
     static const DWORD bitmap_data[] =
     {
@@ -8641,7 +8781,7 @@ static void test_command_list(void)
     ULONG refcount;
     HRESULT hr;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     if (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory1, NULL, (void **)&factory)))
@@ -8651,7 +8791,7 @@ static void test_command_list(void)
         return;
     }
 
-    device_context = create_device_context(factory, ctx.device);
+    device_context = create_device_context(factory, ctx.device, d3d11);
     ok(device_context != NULL, "Failed to create device context.\n");
 
     hr = ID2D1DeviceContext_CreateCommandList(device_context, &command_list);
@@ -8837,7 +8977,7 @@ todo_wine
     ID2D1CommandList_Release(command_list);
 
     /* List created with different context. */
-    device_context2 = create_device_context(factory, ctx.device);
+    device_context2 = create_device_context(factory, ctx.device, d3d11);
     ok(device_context2 != NULL, "Failed to create device context.\n");
 
     hr = ID2D1DeviceContext_CreateCommandList(device_context, &command_list);
@@ -8856,7 +8996,7 @@ todo_wine
     release_test_context(&ctx);
 }
 
-static void test_max_bitmap_size(void)
+static void test_max_bitmap_size(BOOL d3d11)
 {
     D2D1_RENDER_TARGET_PROPERTIES desc;
     D2D1_BITMAP_PROPERTIES bitmap_desc;
@@ -8974,7 +9114,7 @@ static void test_max_bitmap_size(void)
     ID2D1Factory_Release(factory);
 }
 
-static void test_dpi(void)
+static void test_dpi(BOOL d3d11)
 {
     D2D1_BITMAP_PROPERTIES1 bitmap_desc;
     ID2D1DeviceContext *device_context;
@@ -9005,7 +9145,7 @@ static void test_dpi(void)
     static const float dc_dpi_x = 120.0f, dc_dpi_y = 144.0f;
     unsigned int i;
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     if (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory1, NULL, (void **)&factory)))
@@ -9016,7 +9156,7 @@ static void test_dpi(void)
     }
 
 
-    device_context = create_device_context(factory, ctx.device);
+    device_context = create_device_context(factory, ctx.device, d3d11);
     ok(!!device_context, "Failed to create device context.\n");
 
     ID2D1DeviceContext_GetDpi(device_context, &dpi_x, &dpi_y);
@@ -9186,7 +9326,7 @@ static void test_dpi(void)
     release_test_context(&ctx);
 }
 
-static void test_wic_bitmap_format(void)
+static void test_wic_bitmap_format(BOOL d3d11)
 {
     IWICImagingFactory *wic_factory;
     struct d2d1_test_context ctx;
@@ -9209,7 +9349,7 @@ static void test_wic_bitmap_format(void)
         {&GUID_WICPixelFormat32bppBGR,   {DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE}},
     };
 
-    if (!init_test_context(&ctx))
+    if (!init_test_context(&ctx, d3d11))
         return;
 
     rt = ctx.rt;
@@ -9243,7 +9383,7 @@ static void test_wic_bitmap_format(void)
     release_test_context(&ctx);
 }
 
-static void test_math(void)
+static void test_math(BOOL d3d11)
 {
     float s, c, t, l;
     unsigned int i;
@@ -9352,8 +9492,8 @@ START_TEST(d2d1)
     queue_test(test_linear_brush);
     queue_test(test_radial_brush);
     queue_test(test_path_geometry);
-    queue_test(test_rectangle_geometry);
-    queue_test(test_rounded_rectangle_geometry);
+    queue_d3d10_test(test_rectangle_geometry);
+    queue_d3d10_test(test_rounded_rectangle_geometry);
     queue_test(test_bitmap_formats);
     queue_test(test_alpha_mode);
     queue_test(test_shared_bitmap);
@@ -9364,8 +9504,8 @@ START_TEST(d2d1)
     queue_test(test_dc_target);
     queue_test(test_hwnd_target);
     queue_test(test_bitmap_target);
-    queue_test(test_desktop_dpi);
-    queue_test(test_stroke_style);
+    queue_d3d10_test(test_desktop_dpi);
+    queue_d3d10_test(test_stroke_style);
     queue_test(test_gradient);
     queue_test(test_draw_geometry);
     queue_test(test_fill_geometry);
@@ -9375,13 +9515,13 @@ START_TEST(d2d1)
     queue_test(test_create_device);
     queue_test(test_bitmap_surface);
     queue_test(test_device_context);
-    queue_test(test_invert_matrix);
-    queue_test(test_skew_matrix);
+    queue_d3d10_test(test_invert_matrix);
+    queue_d3d10_test(test_skew_matrix);
     queue_test(test_command_list);
-    queue_test(test_max_bitmap_size);
+    queue_d3d10_test(test_max_bitmap_size);
     queue_test(test_dpi);
     queue_test(test_wic_bitmap_format);
-    queue_test(test_math);
+    queue_d3d10_test(test_math);
 
     run_queued_tests();
 }
-- 
2.20.1




More information about the wine-devel mailing list