diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c index 6b230f717fe..25cbb609b26 100644 --- a/dlls/d2d1/device.c +++ b/dlls/d2d1/device.c @@ -2097,10 +2097,10 @@ static BOOL d2d_bitmap_check_options_with_surface(unsigned int options, unsigned if (options && (options & D2D1_BITMAP_OPTIONS_TARGET) != (surface_options & D2D1_BITMAP_OPTIONS_TARGET)) return FALSE; + if (!(options & D2D1_BITMAP_OPTIONS_CANNOT_DRAW) && (surface_options & D2D1_BITMAP_OPTIONS_CANNOT_DRAW)) + return FALSE; if (options & D2D1_BITMAP_OPTIONS_TARGET) { - if (!(options & D2D1_BITMAP_OPTIONS_CANNOT_DRAW) && (surface_options & D2D1_BITMAP_OPTIONS_CANNOT_DRAW)) - return FALSE; if (options & D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE && !(surface_options & D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE)) return FALSE; return TRUE; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 3d8f82237a6..6e2b3bb622a 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -13249,6 +13249,24 @@ static void test_bitmap_map(BOOL d3d11) { { D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ }, }; + static const struct + { + unsigned int bind_flags; + unsigned int options; + HRESULT hr; + } options_tests[] = + { + { D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, + D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW }, + { D3D11_BIND_RENDER_TARGET, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW }, + { D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, D2D1_BITMAP_OPTIONS_NONE }, + { 0, D2D1_BITMAP_OPTIONS_CANNOT_DRAW }, + + { 0, D2D1_BITMAP_OPTIONS_TARGET, E_INVALIDARG }, + { 0, D2D1_BITMAP_OPTIONS_NONE, E_INVALIDARG }, + { D3D11_BIND_RENDER_TARGET, D2D1_BITMAP_OPTIONS_TARGET, E_INVALIDARG }, + { D3D11_BIND_RENDER_TARGET, D2D1_BITMAP_OPTIONS_NONE, E_INVALIDARG }, + }; D2D1_BITMAP_PROPERTIES1 bitmap_desc; D3D11_TEXTURE2D_DESC texture_desc; ID2D1Bitmap *bitmap2, *bitmap3; @@ -13436,9 +13454,8 @@ static void test_bitmap_map(BOOL d3d11) ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_NONE; hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(ctx.context, surface, &bitmap_desc, &bitmap); - todo_wine ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); - if (SUCCEEDED(hr)) ID2D1Bitmap1_Release(bitmap); + bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW; hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(ctx.context, surface, &bitmap_desc, &bitmap); ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); @@ -13454,37 +13471,42 @@ static void test_bitmap_map(BOOL d3d11) ID3D11Texture2D_Release(texture); IDXGISurface_Release(surface); - /* Surface D2D1_BITMAP_OPTIONS_TARGET */ - texture_desc.Width = 4; - texture_desc.Height = 4; - texture_desc.MipLevels = 1; - texture_desc.ArraySize = 1; - texture_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; - texture_desc.SampleDesc.Count = 1; - texture_desc.SampleDesc.Quality = 0; - texture_desc.Usage = D3D11_USAGE_DEFAULT; - texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - texture_desc.CPUAccessFlags = 0; - texture_desc.MiscFlags = 0; + for (i = 0; i < ARRAY_SIZE(options_tests); ++i) + { + winetest_push_context("Test %u", i); - hr = ID3D11Device_CreateTexture2D(d3d_device, &texture_desc, NULL, &texture); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - hr = ID3D11Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + texture_desc.Width = 4; + texture_desc.Height = 4; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Quality = 0; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = options_tests[i].bind_flags; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; - bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET; - hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(ctx.context, surface, &bitmap_desc, &bitmap); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - ID2D1Bitmap1_Release(bitmap); + hr = ID3D11Device_CreateTexture2D(d3d_device, &texture_desc, NULL, &texture); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + hr = ID3D11Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - bitmap_desc.bitmapOptions = 0; - hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(ctx.context, surface, &bitmap_desc, &bitmap); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - check_bitmap_options((ID2D1Bitmap *)bitmap, 0); - ID2D1Bitmap1_Release(bitmap); + bitmap = NULL; + bitmap_desc.bitmapOptions = options_tests[i].options; + hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(ctx.context, surface, &bitmap_desc, &bitmap); + ok(hr == options_tests[i].hr, "Got unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + { + check_bitmap_options((ID2D1Bitmap *)bitmap, options_tests[i].options); + ID2D1Bitmap1_Release(bitmap); + } - ID3D11Texture2D_Release(texture); - IDXGISurface_Release(surface); + ID3D11Texture2D_Release(texture); + IDXGISurface_Release(surface); + + winetest_pop_context(); + } ID3D11Device_Release(d3d_device);