[PATCH 9/9] d3d11/tests: Add a IDXGISurface1 GetDC() test.
Henri Verbeet
hverbeet at codeweavers.com
Sun Apr 17 12:07:57 CDT 2016
From: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d3d11/tests/d3d11.c | 111 +++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 103 insertions(+), 8 deletions(-)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index dff29fb..713c9cf 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -51,6 +51,12 @@ struct vec4
float x, y, z, w;
};
+struct device_desc
+{
+ const D3D_FEATURE_LEVEL *feature_level;
+ UINT flags;
+};
+
struct swapchain_desc
{
BOOL windowed;
@@ -242,18 +248,21 @@ static void check_texture_float_(unsigned int line, ID3D11Texture2D *texture,
"Got unexpected value %.8e at (%u, %u).\n", value, x, y);
}
-static ID3D11Device *create_device(const D3D_FEATURE_LEVEL *feature_level)
+static ID3D11Device *create_device(const struct device_desc *desc)
{
static const D3D_FEATURE_LEVEL default_feature_level[] =
{
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_0,
};
+ const D3D_FEATURE_LEVEL *feature_level;
+ UINT flags = desc ? desc->flags : 0;
unsigned int feature_level_count;
ID3D11Device *device;
- if (feature_level)
+ if (desc && desc->feature_level)
{
+ feature_level = desc->feature_level;
feature_level_count = 1;
}
else
@@ -262,13 +271,13 @@ static ID3D11Device *create_device(const D3D_FEATURE_LEVEL *feature_level)
feature_level_count = sizeof(default_feature_level) / sizeof(default_feature_level[0]);
}
- if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, feature_level, feature_level_count,
+ if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, feature_level, feature_level_count,
D3D11_SDK_VERSION, &device, NULL, NULL)))
return device;
- if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_WARP, NULL, 0, feature_level, feature_level_count,
+ if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_WARP, NULL, flags, feature_level, feature_level_count,
D3D11_SDK_VERSION, &device, NULL, NULL)))
return device;
- if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL, 0, feature_level, feature_level_count,
+ if (SUCCEEDED(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_REFERENCE, NULL, flags, feature_level, feature_level_count,
D3D11_SDK_VERSION, &device, NULL, NULL)))
return device;
@@ -365,12 +374,15 @@ struct d3d11_test_context
static BOOL init_test_context_(unsigned int line, struct d3d11_test_context *context,
const D3D_FEATURE_LEVEL *feature_level)
{
+ struct device_desc device_desc;
D3D11_VIEWPORT vp;
HRESULT hr;
memset(context, 0, sizeof(*context));
- if (!(context->device = create_device(feature_level)))
+ device_desc.feature_level = feature_level;
+ device_desc.flags = 0;
+ if (!(context->device = create_device(&device_desc)))
{
skip_(__FILE__, line)("Failed to create device.\n");
return FALSE;
@@ -733,7 +745,11 @@ static void test_device_interfaces(void)
for (i = 0; i < sizeof(d3d11_feature_levels) / sizeof(*d3d11_feature_levels); ++i)
{
- if (!(device = create_device(&d3d11_feature_levels[i])))
+ struct device_desc device_desc;
+
+ device_desc.feature_level = &d3d11_feature_levels[i];
+ device_desc.flags = 0;
+ if (!(device = create_device(&device_desc)))
{
skip("Failed to create device for feature level %#x.\n", d3d11_feature_levels[i]);
continue;
@@ -2353,8 +2369,11 @@ static void test_create_shader(void)
{
D3D_FEATURE_LEVEL feature_level = d3d11_feature_levels[i];
BOOL todo = feature_level <= D3D_FEATURE_LEVEL_9_3;
+ struct device_desc device_desc;
- if (!(device = create_device(&feature_level)))
+ device_desc.feature_level = &feature_level;
+ device_desc.flags = 0;
+ if (!(device = create_device(&device_desc)))
{
skip("Failed to create device for feature level %#x.\n", feature_level);
continue;
@@ -6475,6 +6494,81 @@ float4 main(const ps_in v) : SV_TARGET
release_test_context(&test_context);
}
+static void test_getdc(void)
+{
+ struct device_desc device_desc;
+ D3D11_TEXTURE2D_DESC desc;
+ ID3D11Texture2D *texture;
+ IDXGISurface1 *surface1;
+ ID3D11Device *device;
+ ULONG refcount;
+ HRESULT hr;
+ HDC dc;
+
+ device_desc.feature_level = NULL;
+ device_desc.flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
+ if (!(device = create_device(&device_desc)))
+ {
+ skip("Failed to create device.\n");
+ return;
+ }
+
+ /* Without D3D11_RESOURCE_MISC_GDI_COMPATIBLE. */
+ desc.Width = 512;
+ desc.Height = 512;
+ desc.MipLevels = 1;
+ desc.ArraySize = 1;
+ desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+ desc.SampleDesc.Count = 1;
+ desc.SampleDesc.Quality = 0;
+ desc.Usage = D3D11_USAGE_DEFAULT;
+ desc.BindFlags = D3D11_BIND_RENDER_TARGET;
+ desc.CPUAccessFlags = 0;
+ desc.MiscFlags = 0;
+ hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &texture);
+ ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+
+ hr = ID3D11Texture2D_QueryInterface(texture, &IID_IDXGISurface1, (void**)&surface1);
+ ok(SUCCEEDED(hr), "Failed to get IDXGISurface1 interface, hr %#x.\n", hr);
+
+ hr = IDXGISurface1_GetDC(surface1, FALSE, &dc);
+ todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+
+ IDXGISurface1_Release(surface1);
+ ID3D11Texture2D_Release(texture);
+
+ desc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
+ hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &texture);
+ ok(SUCCEEDED(hr), "Failed to create texture, hr %#x.\n", hr);
+
+ hr = ID3D11Texture2D_QueryInterface(texture, &IID_IDXGISurface1, (void**)&surface1);
+ ok(SUCCEEDED(hr), "Failed to get IDXGISurface1 interface, hr %#x.\n", hr);
+
+ hr = IDXGISurface1_ReleaseDC(surface1, NULL);
+ todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+
+ hr = IDXGISurface1_GetDC(surface1, FALSE, &dc);
+ todo_wine ok(SUCCEEDED(hr), "Failed to get DC, hr %#x.\n", hr);
+
+ /* One more time. */
+ dc = (HDC)0xdeadbeef;
+ hr = IDXGISurface1_GetDC(surface1, FALSE, &dc);
+ todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+ ok(dc == (HDC)0xdeadbeef, "Got unexpected dc %p.\n", dc);
+
+ hr = IDXGISurface1_ReleaseDC(surface1, NULL);
+ todo_wine ok(SUCCEEDED(hr), "Failed to release DC, hr %#x.\n", hr);
+
+ hr = IDXGISurface1_ReleaseDC(surface1, NULL);
+ todo_wine ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+
+ IDXGISurface1_Release(surface1);
+ ID3D11Texture2D_Release(texture);
+
+ refcount = ID3D11Device_Release(device);
+ ok(!refcount, "Device has %u references left.\n", refcount);
+}
+
START_TEST(d3d11)
{
test_create_device();
@@ -6513,4 +6607,5 @@ START_TEST(d3d11)
test_clear_depth_stencil_view();
test_draw_depth_only();
test_cb_relative_addressing();
+ test_getdc();
}
--
2.1.4
More information about the wine-patches
mailing list