Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
September 2018
- 70 participants
- 1549 messages
[PATCH vkd3d 6/8] include: Synchronize d3d12.idl with Wine.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
include/vkd3d_d3d12.idl | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/include/vkd3d_d3d12.idl b/include/vkd3d_d3d12.idl
index 4b967d489b77..d647b48cbbe4 100644
--- a/include/vkd3d_d3d12.idl
+++ b/include/vkd3d_d3d12.idl
@@ -2213,7 +2213,12 @@ interface ID3D12RootSignatureDeserializer : IUnknown
const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *root_signature_desc,
ID3DBlob **blob, ID3DBlob **error_blob);
+typedef HRESULT (__stdcall *PFN_D3D12_CREATE_DEVICE)(IUnknown *adapter,
+ D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device);
+
[local] HRESULT __stdcall D3D12CreateDevice(IUnknown *adapter,
D3D_FEATURE_LEVEL minimum_feature_level, REFIID iid, void **device);
+typedef HRESULT (__stdcall *PFN_D3D12_GET_DEBUG_INTERFACE)(REFIID iid, void **debug);
+
[local] HRESULT __stdcall D3D12GetDebugInterface(REFIID iid, void **debug);
--
2.16.4
Sept. 28, 2018
[PATCH vkd3d 5/8] tests: Add test for blend factor.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 68 insertions(+), 1 deletion(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 0528ceb4ba6a..c40ce12719b6 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -19970,7 +19970,6 @@ static void test_resource_allocation_info(void)
}
}
-
refcount = ID3D12Device_Release(device);
ok(!refcount, "ID3D12Device has %u references left.\n", (unsigned int)refcount);
}
@@ -20134,6 +20133,73 @@ static void test_command_list_initial_pipeline_state(void)
destroy_test_context(&context);
}
+static void test_blend_factor(void)
+{
+ static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc;
+ ID3D12GraphicsCommandList *command_list;
+ struct test_context_desc desc;
+ struct test_context context;
+ ID3D12CommandQueue *queue;
+ unsigned int i;
+ HRESULT hr;
+
+ static const struct
+ {
+ float blend_factor[4];
+ unsigned int expected_color;
+ }
+ tests[] =
+ {
+ {{0.0f, 0.0f, 0.0f, 0.0f}, 0xffffffff},
+ {{0.0f, 1.0f, 0.0f, 1.0f}, 0xffffffff},
+ {{0.5f, 0.5f, 0.5f, 0.5f}, 0xff80ff80},
+ {{1.0f, 1.0f, 1.0f, 1.0f}, 0xff00ff00},
+ };
+
+ memset(&desc, 0, sizeof(desc));
+ desc.no_pipeline = true;
+ if (!init_test_context(&context, &desc))
+ return;
+ command_list = context.list;
+ queue = context.queue;
+
+ init_pipeline_state_desc(&pso_desc, context.root_signature,
+ context.render_target_desc.Format, NULL, NULL, NULL);
+ pso_desc.BlendState.RenderTarget[0].BlendEnable = TRUE;
+ pso_desc.BlendState.RenderTarget[0].SrcBlend = D3D12_BLEND_BLEND_FACTOR;
+ pso_desc.BlendState.RenderTarget[0].DestBlend = D3D12_BLEND_INV_BLEND_FACTOR;
+ pso_desc.BlendState.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD;
+ pso_desc.BlendState.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_BLEND_FACTOR;
+ pso_desc.BlendState.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_INV_BLEND_FACTOR;
+ pso_desc.BlendState.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD;
+ hr = ID3D12Device_CreateGraphicsPipelineState(context.device, &pso_desc,
+ &IID_ID3D12PipelineState, (void **)&context.pipeline_state);
+ ok(hr == S_OK, "Failed to create pipeline, hr %#x.\n", hr);
+
+ for (i = 0; i < ARRAY_SIZE(tests); ++i)
+ {
+ ID3D12GraphicsCommandList_ClearRenderTargetView(command_list, context.rtv, white, 0, NULL);
+ ID3D12GraphicsCommandList_OMSetRenderTargets(command_list, 1, &context.rtv, FALSE, NULL);
+ ID3D12GraphicsCommandList_SetGraphicsRootSignature(command_list, context.root_signature);
+ ID3D12GraphicsCommandList_SetPipelineState(command_list, context.pipeline_state);
+ ID3D12GraphicsCommandList_IASetPrimitiveTopology(command_list, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
+ ID3D12GraphicsCommandList_RSSetViewports(command_list, 1, &context.viewport);
+ ID3D12GraphicsCommandList_RSSetScissorRects(command_list, 1, &context.scissor_rect);
+ ID3D12GraphicsCommandList_OMSetBlendFactor(command_list, tests[i].blend_factor);
+ ID3D12GraphicsCommandList_DrawInstanced(command_list, 3, 1, 0, 0);
+ transition_resource_state(command_list, context.render_target,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ check_sub_resource_uint(context.render_target, 0, queue, command_list, tests[i].expected_color, 1);
+
+ reset_command_list(command_list, context.allocator);
+ transition_resource_state(command_list, context.render_target,
+ D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
+ }
+
+ destroy_test_context(&context);
+}
+
START_TEST(d3d12)
{
bool enable_debug_layer = false;
@@ -20255,4 +20321,5 @@ START_TEST(d3d12)
run_test(test_resource_allocation_info);
run_test(test_suballocate_small_textures);
run_test(test_command_list_initial_pipeline_state);
+ run_test(test_blend_factor);
}
--
2.16.4
Sept. 28, 2018
[PATCH vkd3d 4/8] vkd3d: Implement d3d12_command_list_OMSetBlendFactor().
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/command.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index b4d8ecd75179..5a2baef8a7da 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1849,6 +1849,7 @@ static VkPipeline d3d12_command_list_get_or_create_pipeline(struct d3d12_command
{
VK_DYNAMIC_STATE_VIEWPORT,
VK_DYNAMIC_STATE_SCISSOR,
+ VK_DYNAMIC_STATE_BLEND_CONSTANTS,
VK_DYNAMIC_STATE_STENCIL_REFERENCE,
};
static const struct VkPipelineDynamicStateCreateInfo dynamic_desc =
@@ -2972,7 +2973,13 @@ static void STDMETHODCALLTYPE d3d12_command_list_RSSetScissorRects(ID3D12Graphic
static void STDMETHODCALLTYPE d3d12_command_list_OMSetBlendFactor(ID3D12GraphicsCommandList *iface,
const FLOAT blend_factor[4])
{
- FIXME("iface %p, blend_factor %p stub!\n", iface, blend_factor);
+ struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList(iface);
+ const struct vkd3d_vk_device_procs *vk_procs;
+
+ TRACE("iface %p, blend_factor %p.\n", iface, blend_factor);
+
+ vk_procs = &list->device->vk_procs;
+ VK_CALL(vkCmdSetBlendConstants(list->vk_command_buffer, blend_factor));
}
static void STDMETHODCALLTYPE d3d12_command_list_OMSetStencilRef(ID3D12GraphicsCommandList *iface,
--
2.16.4
Sept. 28, 2018
[PATCH vkd3d 3/8] tests: Add test for clearing 2D array DSVs.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
tests/d3d12.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 47 insertions(+), 12 deletions(-)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 83010674d5cf..0528ceb4ba6a 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -1058,9 +1058,9 @@ struct depth_stencil_resource
D3D12_CPU_DESCRIPTOR_HANDLE dsv_handle;
};
-#define init_depth_stencil(a, b, c, d, e, f, g) init_depth_stencil_(__LINE__, a, b, c, d, e, f, g)
+#define init_depth_stencil(a, b, c, d, e, f, g, h) init_depth_stencil_(__LINE__, a, b, c, d, e, f, g, h)
static void init_depth_stencil_(unsigned int line, struct depth_stencil_resource *ds,
- ID3D12Device *device, unsigned int width, unsigned int height,
+ ID3D12Device *device, unsigned int width, unsigned int height, unsigned int array_size,
DXGI_FORMAT format, DXGI_FORMAT view_format, const D3D12_CLEAR_VALUE *clear_value)
{
D3D12_DEPTH_STENCIL_VIEW_DESC dsv_desc, *view_desc;
@@ -1078,7 +1078,7 @@ static void init_depth_stencil_(unsigned int line, struct depth_stencil_resource
resource_desc.Alignment = 0;
resource_desc.Width = width;
resource_desc.Height = height;
- resource_desc.DepthOrArraySize = 1;
+ resource_desc.DepthOrArraySize = array_size;
resource_desc.MipLevels = 1;
resource_desc.Format = format;
resource_desc.SampleDesc.Count = 1;
@@ -3289,7 +3289,9 @@ static void test_multithread_fence_wait(void)
static void test_clear_depth_stencil_view(void)
{
+ static const float expected_values[] = {0.5f, 0.1f, 0.1f, 0.6, 1.0f, 0.5f};
ID3D12GraphicsCommandList *command_list;
+ D3D12_DEPTH_STENCIL_VIEW_DESC dsv_desc;
struct depth_stencil_resource ds;
unsigned int dsv_increment_size;
D3D12_CLEAR_VALUE clear_value;
@@ -3297,6 +3299,7 @@ static void test_clear_depth_stencil_view(void)
struct test_context context;
ID3D12CommandQueue *queue;
ID3D12Device *device;
+ unsigned int i;
memset(&desc, 0, sizeof(desc));
desc.no_render_target = true;
@@ -3314,13 +3317,45 @@ static void test_clear_depth_stencil_view(void)
clear_value.Format = DXGI_FORMAT_D32_FLOAT;
clear_value.DepthStencil.Depth = 0.5f;
clear_value.DepthStencil.Stencil = 0x3;
- init_depth_stencil(&ds, device, 32, 32, DXGI_FORMAT_D32_FLOAT, 0, &clear_value);
+ init_depth_stencil(&ds, device, 32, 32, 1, DXGI_FORMAT_D32_FLOAT, 0, &clear_value);
ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 0.75f, 0x7, 0, NULL);
transition_resource_state(command_list, ds.texture,
D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_COPY_SOURCE);
- check_sub_resource_uint(ds.texture, 0, queue, command_list, 0x3f400000, 0);
+ check_sub_resource_float(ds.texture, 0, queue, command_list, 0.75f, 1);
+
+ destroy_depth_stencil(&ds);
+ reset_command_list(command_list, context.allocator);
+ init_depth_stencil(&ds, device, 32, 32, 6, DXGI_FORMAT_D32_FLOAT, 0, &clear_value);
+
+ ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
+ D3D12_CLEAR_FLAG_DEPTH, expected_values[0], 0, 0, NULL);
+ memset(&dsv_desc, 0, sizeof(dsv_desc));
+ dsv_desc.Format = DXGI_FORMAT_D32_FLOAT;
+ dsv_desc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2DARRAY;
+ dsv_desc.Texture2DArray.FirstArraySlice = 1;
+ dsv_desc.Texture2DArray.ArraySize = 2;
+ ID3D12Device_CreateDepthStencilView(device, ds.texture, &dsv_desc, ds.dsv_handle);
+ ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
+ D3D12_CLEAR_FLAG_DEPTH, expected_values[1], 0, 0, NULL);
+ dsv_desc.Texture2DArray.FirstArraySlice = 3;
+ dsv_desc.Texture2DArray.ArraySize = 1;
+ ID3D12Device_CreateDepthStencilView(device, ds.texture, &dsv_desc, ds.dsv_handle);
+ ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
+ D3D12_CLEAR_FLAG_DEPTH, expected_values[3], 0, 0, NULL);
+ dsv_desc.Texture2DArray.FirstArraySlice = 4;
+ ID3D12Device_CreateDepthStencilView(device, ds.texture, &dsv_desc, ds.dsv_handle);
+ ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
+ D3D12_CLEAR_FLAG_DEPTH, expected_values[4], 0, 0, NULL);
+
+ transition_resource_state(command_list, ds.texture,
+ D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_COPY_SOURCE);
+ for (i = 0; i < ARRAY_SIZE(expected_values); ++i)
+ {
+ check_sub_resource_float(ds.texture, i, queue, command_list, expected_values[i], 1);
+ reset_command_list(command_list, context.allocator);
+ }
destroy_depth_stencil(&ds);
destroy_test_context(&context);
@@ -4546,7 +4581,7 @@ static void test_draw_depth_only(void)
command_list = context.list;
queue = context.queue;
- init_depth_stencil(&ds, context.device, 640, 480, DXGI_FORMAT_D32_FLOAT, 0, NULL);
+ init_depth_stencil(&ds, context.device, 640, 480, 1, DXGI_FORMAT_D32_FLOAT, 0, NULL);
set_viewport(&context.viewport, 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f);
set_rect(&context.scissor_rect, 0, 0, 640, 480);
@@ -12156,7 +12191,7 @@ static void test_copy_descriptors(void)
transition_resource_state(command_list, t[5],
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
- init_depth_stencil(&ds, device, 32, 32, DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_D32_FLOAT, NULL);
+ init_depth_stencil(&ds, device, 32, 32, 1, DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_D32_FLOAT, NULL);
t[6] = ds.texture;
ID3D12Resource_AddRef(t[6]);
ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
@@ -13509,7 +13544,7 @@ static void test_depth_stencil_sampling(void)
reset_command_list(command_list, context.allocator);
init_depth_stencil(&ds, device, context.render_target_desc.Width,
- context.render_target_desc.Height, tests[i].typeless_format,
+ context.render_target_desc.Height, 1, tests[i].typeless_format,
tests[i].dsv_format, NULL);
texture = ds.texture;
dsv_handle = ds.dsv_handle;
@@ -13722,7 +13757,7 @@ static void test_depth_load(void)
heap = create_gpu_descriptor_heap(device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 2);
init_depth_stencil(&ds, device, context.render_target_desc.Width,
- context.render_target_desc.Height, DXGI_FORMAT_R32_TYPELESS,
+ context.render_target_desc.Height, 1, DXGI_FORMAT_R32_TYPELESS,
DXGI_FORMAT_D32_FLOAT, NULL);
memset(&srv_desc, 0, sizeof(srv_desc));
srv_desc.Format = DXGI_FORMAT_R32_FLOAT;
@@ -13854,7 +13889,7 @@ static void test_depth_read_only_view(void)
clear_value.DepthStencil.Depth = 0.5f;
clear_value.DepthStencil.Stencil = 0;
init_depth_stencil(&ds, device, context.render_target_desc.Width,
- context.render_target_desc.Height, DXGI_FORMAT_R32_TYPELESS,
+ context.render_target_desc.Height, 1, DXGI_FORMAT_R32_TYPELESS,
DXGI_FORMAT_D32_FLOAT, &clear_value);
memset(&dsv_desc, 0, sizeof(dsv_desc));
dsv_desc.Format = DXGI_FORMAT_D32_FLOAT;
@@ -16705,7 +16740,7 @@ static void test_query_occlusion(void)
command_list = context.list;
queue = context.queue;
- init_depth_stencil(&ds, context.device, 640, 480, DXGI_FORMAT_D32_FLOAT, 0, NULL);
+ init_depth_stencil(&ds, context.device, 640, 480, 1, DXGI_FORMAT_D32_FLOAT, 0, NULL);
set_viewport(&context.viewport, 0.0f, 0.0f, 640.0f, 480.0f, 0.0f, 1.0f);
set_rect(&context.scissor_rect, 0, 0, 640, 480);
@@ -17632,7 +17667,7 @@ static void test_copy_texture_region(void)
for (i = 0; i < ARRAY_SIZE(depth_values); ++i)
{
init_depth_stencil(&ds, device, context.render_target_desc.Width,
- context.render_target_desc.Height, DXGI_FORMAT_D32_FLOAT,
+ context.render_target_desc.Height, 1, DXGI_FORMAT_D32_FLOAT,
DXGI_FORMAT_D32_FLOAT, NULL);
ID3D12GraphicsCommandList_ClearDepthStencilView(command_list, ds.dsv_handle,
D3D12_CLEAR_FLAG_DEPTH, depth_values[i], 0, 0, NULL);
--
2.16.4
Sept. 28, 2018
[PATCH vkd3d 2/8] vkd3d: Fix 2D array depth stencil views.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/command.c | 5 +++--
libs/vkd3d/resource.c | 1 +
libs/vkd3d/vkd3d_private.h | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 5fd093617e3b..b4d8ecd75179 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -3681,7 +3681,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_OMSetRenderTargets(ID3D12Graphi
list->views[0] = view->u.vk_image_view;
list->fb_width = max(list->fb_width, dsv_desc->width);
list->fb_height = max(list->fb_height, dsv_desc->height);
- list->fb_layer_count = max(list->fb_layer_count, 1);
+ list->fb_layer_count = max(list->fb_layer_count, dsv_desc->layer_count);
}
d3d12_command_list_invalidate_current_framebuffer(list);
@@ -3841,7 +3841,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearDepthStencilView(ID3D12Gra
ds_reference.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
d3d12_command_list_clear(list, &attachment_desc, NULL, &ds_reference,
- dsv_desc->view, dsv_desc->width, dsv_desc->height, 1, &clear_value, rect_count, rects);
+ dsv_desc->view, dsv_desc->width, dsv_desc->height, dsv_desc->layer_count,
+ &clear_value, rect_count, rects);
}
static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12GraphicsCommandList *iface,
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 98c703a9313d..d6330941127a 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2131,6 +2131,7 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
dsv_desc->format = vkd3d_desc.format->vk_format;
dsv_desc->width = d3d12_resource_desc_get_width(&resource->desc, vkd3d_desc.miplevel_idx);
dsv_desc->height = d3d12_resource_desc_get_height(&resource->desc, vkd3d_desc.miplevel_idx);
+ dsv_desc->layer_count = vkd3d_desc.layer_count;
dsv_desc->view = view;
dsv_desc->resource = resource;
}
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index bffae35fb830..d744af5a5bac 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -358,6 +358,7 @@ struct d3d12_dsv_desc
VkFormat format;
uint64_t width;
unsigned int height;
+ unsigned int layer_count;
struct vkd3d_view *view;
struct d3d12_resource *resource;
};
--
2.16.4
Sept. 28, 2018
[PATCH vkd3d 1/8] vkd3d-shader: Use TRACE() for skipped DXBC chunks.
by Józef Kucia
From: Józef Kucia <jkucia(a)codeweavers.com>
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d-shader/dxbc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 3be3ca917ac3..5daf07a65f00 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -2040,7 +2040,7 @@ static int shdr_handler(const char *data, DWORD data_size, DWORD tag, void *cont
break;
default:
- FIXME("Unhandled chunk %#x.\n", tag);
+ TRACE("Skipping chunk %#x.\n", tag);
break;
}
--
2.16.4
Sept. 28, 2018
[PATCH] wbemprox: Implement StdRegProv.CreateKey.
by Hans Leidekker
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/wbemprox/builtin.c | 7 ++++-
dlls/wbemprox/reg.c | 61 ++++++++++++++++++++++++++++++++++++++++
dlls/wbemprox/tests/query.c | 42 +++++++++++++++++++++++++++
dlls/wbemprox/wbemprox_private.h | 2 ++
4 files changed, 111 insertions(+), 1 deletion(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index a695e7c516..3832540d4d 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -712,6 +712,7 @@ static const struct column col_sounddevice[] =
};
static const struct column col_stdregprov[] =
{
+ { method_createkeyW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
{ method_enumkeyW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
{ method_enumvaluesW, CIM_FLAG_ARRAY|COL_FLAG_METHOD },
{ method_getstringvalueW, CIM_FLAG_ARRAY|COL_FLAG_METHOD }
@@ -1135,6 +1136,7 @@ struct record_sounddevice
};
struct record_stdregprov
{
+ class_method *createkey;
class_method *enumkey;
class_method *enumvalues;
class_method *getstringvalue;
@@ -1199,6 +1201,9 @@ static const struct record_param data_param[] =
{ class_serviceW, method_resumeserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
{ class_serviceW, method_startserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
{ class_serviceW, method_stopserviceW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
+ { class_stdregprovW, method_createkeyW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
+ { class_stdregprovW, method_createkeyW, 1, param_subkeynameW, CIM_STRING },
+ { class_stdregprovW, method_createkeyW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
{ class_stdregprovW, method_enumkeyW, 1, param_defkeyW, CIM_SINT32, 0, 0x80000002 },
{ class_stdregprovW, method_enumkeyW, 1, param_subkeynameW, CIM_STRING },
{ class_stdregprovW, method_enumkeyW, -1, param_returnvalueW, CIM_UINT32, VT_I4 },
@@ -1237,7 +1242,7 @@ static const struct record_sounddevice data_sounddevice[] =
};
static const struct record_stdregprov data_stdregprov[] =
{
- { reg_enum_key, reg_enum_values, reg_get_stringvalue }
+ { reg_create_key, reg_enum_key, reg_enum_values, reg_get_stringvalue }
};
static UINT16 systemenclosure_chassistypes[] =
{
diff --git a/dlls/wbemprox/reg.c b/dlls/wbemprox/reg.c
index 79440dac8d..ed30d15100 100644
--- a/dlls/wbemprox/reg.c
+++ b/dlls/wbemprox/reg.c
@@ -76,6 +76,67 @@ static HRESULT to_i4_array( DWORD *values, DWORD count, VARIANT *var )
return S_OK;
}
+static HRESULT create_key( HKEY root, const WCHAR *subkey, VARIANT *retval )
+{
+ LONG res;
+ HKEY hkey;
+
+ TRACE("%p, %s\n", root, debugstr_w(subkey));
+
+ res = RegCreateKeyExW( root, subkey, 0, NULL, 0, 0, NULL, &hkey, NULL );
+ set_variant( VT_UI4, res, NULL, retval );
+ if (!res)
+ {
+ RegCloseKey( hkey );
+ return S_OK;
+ }
+ return HRESULT_FROM_WIN32( res );
+}
+
+HRESULT reg_create_key( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out )
+{
+ VARIANT defkey, subkey, retval;
+ IWbemClassObject *sig, *out_params = NULL;
+ HRESULT hr;
+
+ TRACE("%p, %p\n", in, out);
+
+ hr = IWbemClassObject_Get( in, param_defkeyW, 0, &defkey, NULL, NULL );
+ if (hr != S_OK) return hr;
+ hr = IWbemClassObject_Get( in, param_subkeynameW, 0, &subkey, NULL, NULL );
+ if (hr != S_OK) return hr;
+
+ hr = create_signature( class_stdregprovW, method_createkeyW, PARAM_OUT, &sig );
+ if (hr != S_OK)
+ {
+ VariantClear( &subkey );
+ return hr;
+ }
+ if (out)
+ {
+ hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params );
+ if (hr != S_OK)
+ {
+ VariantClear( &subkey );
+ IWbemClassObject_Release( sig );
+ return hr;
+ }
+ }
+ hr = create_key( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), &retval );
+ if (hr == S_OK && out_params)
+ hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 );
+
+ VariantClear( &subkey );
+ IWbemClassObject_Release( sig );
+ if (hr == S_OK && out)
+ {
+ *out = out_params;
+ IWbemClassObject_AddRef( out_params );
+ }
+ if (out_params) IWbemClassObject_Release( out_params );
+ return hr;
+}
+
static HRESULT enum_key( HKEY root, const WCHAR *subkey, VARIANT *names, VARIANT *retval )
{
HKEY hkey;
diff --git a/dlls/wbemprox/tests/query.c b/dlls/wbemprox/tests/query.c
index 39b6ba9c95..26e2dfa30d 100644
--- a/dlls/wbemprox/tests/query.c
+++ b/dlls/wbemprox/tests/query.c
@@ -704,6 +704,7 @@ static void test_Win32_SystemEnclosure( IWbemServices *services )
static void test_StdRegProv( IWbemServices *services )
{
+ static const WCHAR createkeyW[] = {'C','r','e','a','t','e','K','e','y',0};
static const WCHAR enumkeyW[] = {'E','n','u','m','K','e','y',0};
static const WCHAR enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
static const WCHAR getstringvalueW[] = {'G','e','t','S','t','r','i','n','g','V','a','l','u','e',0};
@@ -719,11 +720,14 @@ static void test_StdRegProv( IWbemServices *services )
static const WCHAR windowsW[] =
{'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
'W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',0};
+ static const WCHAR regtestW[] =
+ {'S','o','f','t','w','a','r','e','\\','S','t','d','R','e','g','P','r','o','v','T','e','s','t',0};
BSTR class = SysAllocString( stdregprovW ), method;
IWbemClassObject *reg, *sig_in, *in, *out;
VARIANT defkey, subkey, retval, names, types, value, valuename;
CIMTYPE type;
HRESULT hr;
+ LONG res;
hr = IWbemServices_GetObject( services, class, 0, NULL, ®, NULL );
if (hr != S_OK)
@@ -731,6 +735,44 @@ static void test_StdRegProv( IWbemServices *services )
win_skip( "StdRegProv not available\n" );
return;
}
+ hr = IWbemClassObject_GetMethod( reg, createkeyW, 0, &sig_in, NULL );
+ ok( hr == S_OK, "failed to get CreateKey method %08x\n", hr );
+
+ hr = IWbemClassObject_SpawnInstance( sig_in, 0, &in );
+ ok( hr == S_OK, "failed to spawn instance %08x\n", hr );
+
+ V_VT( &defkey ) = VT_I4;
+ V_I4( &defkey ) = 0x80000001;
+ hr = IWbemClassObject_Put( in, defkeyW, 0, &defkey, 0 );
+ ok( hr == S_OK, "failed to set root %08x\n", hr );
+
+ V_VT( &subkey ) = VT_BSTR;
+ V_BSTR( &subkey ) = SysAllocString( regtestW );
+ hr = IWbemClassObject_Put( in, subkeynameW, 0, &subkey, 0 );
+ ok( hr == S_OK, "failed to set subkey %08x\n", hr );
+
+ out = NULL;
+ method = SysAllocString( createkeyW );
+ hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, in, &out, NULL );
+ ok( hr == S_OK, "failed to execute method %08x\n", hr );
+ SysFreeString( method );
+
+ type = 0xdeadbeef;
+ VariantInit( &retval );
+ hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, &type, NULL );
+ ok( hr == S_OK, "failed to get return value %08x\n", hr );
+ ok( V_VT( &retval ) == VT_I4, "unexpected variant type 0x%x\n", V_VT( &retval ) );
+ ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) );
+ ok( type == CIM_UINT32, "unexpected type 0x%x\n", type );
+
+ res = RegDeleteKeyW( HKEY_CURRENT_USER, regtestW );
+ ok( !res, "got %d\n", res );
+
+ VariantClear( &subkey );
+ IWbemClassObject_Release( in );
+ IWbemClassObject_Release( out );
+ IWbemClassObject_Release( sig_in );
+
hr = IWbemClassObject_GetMethod( reg, enumkeyW, 0, &sig_in, NULL );
ok( hr == S_OK, "failed to get EnumKey method %08x\n", hr );
diff --git a/dlls/wbemprox/wbemprox_private.h b/dlls/wbemprox/wbemprox_private.h
index 54b1ba3d8e..83776c8df7 100644
--- a/dlls/wbemprox/wbemprox_private.h
+++ b/dlls/wbemprox/wbemprox_private.h
@@ -218,6 +218,7 @@ HRESULT EnumWbemClassObject_create(struct query *, LPVOID *) DECLSPEC_HIDDEN;
HRESULT WbemQualifierSet_create(const WCHAR *, const WCHAR *, LPVOID *) DECLSPEC_HIDDEN;
HRESULT process_get_owner(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
+HRESULT reg_create_key(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
HRESULT reg_enum_key(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
HRESULT reg_enum_values(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
HRESULT reg_get_stringvalue(IWbemClassObject *, IWbemClassObject *, IWbemClassObject **) DECLSPEC_HIDDEN;
@@ -243,6 +244,7 @@ static const WCHAR class_systemsecurityW[] = {'_','_','S','y','s','t','e','m','S
static const WCHAR prop_nameW[] = {'N','a','m','e',0};
+static const WCHAR method_createkeyW[] = {'C','r','e','a','t','e','K','e','y',0};
static const WCHAR method_enumkeyW[] = {'E','n','u','m','K','e','y',0};
static const WCHAR method_enumvaluesW[] = {'E','n','u','m','V','a','l','u','e','s',0};
static const WCHAR method_getownerW[] = {'G','e','t','O','w','n','e','r',0};
--
2.11.0
Sept. 28, 2018
[v2 PATCH 5/5] d2d1: Implement SetTarget() for bitmap targets.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/d2d1/bitmap.c | 23 ++-
dlls/d2d1/bitmap_render_target.c | 74 +++------
dlls/d2d1/d2d1_private.h | 6 +-
dlls/d2d1/dc_render_target.c | 96 +++++------
dlls/d2d1/device.c | 269 +++++++++++++++++--------------
dlls/d2d1/hwnd_render_target.c | 19 ++-
dlls/d2d1/tests/d2d1.c | 64 +++++---
7 files changed, 290 insertions(+), 261 deletions(-)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index fde348fa1c..dd15714153 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -70,6 +70,8 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_Release(ID2D1Bitmap1 *iface)
if (!refcount)
{
ID3D10ShaderResourceView_Release(bitmap->view);
+ if (bitmap->rtv)
+ ID3D10RenderTargetView_Release(bitmap->rtv);
if (bitmap->surface)
IDXGISurface_Release(bitmap->surface);
ID2D1Factory_Release(bitmap->factory);
@@ -274,6 +276,10 @@ static BOOL format_supported(const D2D1_PIXEL_FORMAT *format)
static void d2d_bitmap_init(struct d2d_bitmap *bitmap, struct d2d_device_context *context,
ID3D10ShaderResourceView *view, D2D1_SIZE_U size, const D2D1_BITMAP_PROPERTIES1 *desc)
{
+ ID3D10Resource *resource;
+ ID3D10Device *d3d_device;
+ HRESULT hr;
+
bitmap->ID2D1Bitmap1_iface.lpVtbl = &d2d_bitmap_vtbl;
bitmap->refcount = 1;
ID2D1Factory_AddRef(bitmap->factory = context->factory);
@@ -283,15 +289,22 @@ static void d2d_bitmap_init(struct d2d_bitmap *bitmap, struct d2d_device_context
bitmap->dpi_x = desc->dpiX;
bitmap->dpi_y = desc->dpiY;
bitmap->options = desc->bitmapOptions;
- if (d2d_device_context_is_dxgi_target(context))
- {
- ID3D10Resource *resource;
- ID3D10ShaderResourceView_GetResource(bitmap->view, &resource);
+ ID3D10ShaderResourceView_GetResource(bitmap->view, &resource);
+
+ if (d2d_device_context_is_dxgi_target(context))
ID3D10Resource_QueryInterface(resource, &IID_IDXGISurface, (void **)&bitmap->surface);
- ID3D10Resource_Release(resource);
+
+ if (bitmap->options & D2D1_BITMAP_OPTIONS_TARGET)
+ {
+ ID3D10Resource_GetDevice(resource, &d3d_device);
+ if (FAILED(hr = ID3D10Device_CreateRenderTargetView(d3d_device, resource, NULL, &bitmap->rtv)))
+ WARN("Failed to create rtv, hr %#x.\n", hr);
+ ID3D10Device_Release(d3d_device);
}
+ ID3D10Resource_Release(resource);
+
if (bitmap->dpi_x == 0.0f && bitmap->dpi_y == 0.0f)
{
bitmap->dpi_x = 96.0f;
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index df5b013a0b..836fa567e7 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -69,7 +69,8 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_render_target_Release(ID2D1BitmapRende
if (!refcount)
{
IUnknown_Release(render_target->dxgi_inner);
- ID2D1Bitmap_Release(render_target->bitmap);
+ if (render_target->bitmap)
+ ID2D1Bitmap_Release(render_target->bitmap);
heap_free(render_target);
}
@@ -733,10 +734,9 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options)
{
D2D1_RENDER_TARGET_PROPERTIES dxgi_rt_desc;
- D2D1_BITMAP_PROPERTIES bitmap_desc;
- D3D10_TEXTURE2D_DESC texture_desc;
- IDXGISurface *dxgi_surface;
- ID3D10Texture2D *texture;
+ D2D1_BITMAP_PROPERTIES1 bitmap_desc;
+ ID2D1DeviceContext *context;
+ D2D1_SIZE_U bitmap_size;
HRESULT hr;
if (options)
@@ -750,24 +750,24 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
if (pixel_size)
{
- texture_desc.Width = pixel_size->width;
- texture_desc.Height = pixel_size->height;
+ bitmap_size.width = pixel_size->width;
+ bitmap_size.height = pixel_size->height;
}
else if (size)
{
- texture_desc.Width = ceilf((size->width * parent_target->desc.dpiX) / 96.0f);
- texture_desc.Height = ceilf((size->height * parent_target->desc.dpiY) / 96.0f);
+ bitmap_size.width = ceilf((size->width * parent_target->desc.dpiX) / 96.0f);
+ bitmap_size.height = ceilf((size->height * parent_target->desc.dpiY) / 96.0f);
}
else
{
- texture_desc.Width = parent_target->pixel_size.width;
- texture_desc.Height = parent_target->pixel_size.height;
+ bitmap_size.width = parent_target->pixel_size.width;
+ bitmap_size.height = parent_target->pixel_size.height;
}
- if (size)
+ if (size && size->width != 0.0f && size->height != 0.0f)
{
- dxgi_rt_desc.dpiX = (texture_desc.Width * 96.0f) / size->width;
- dxgi_rt_desc.dpiY = (texture_desc.Height * 96.0f) / size->height;
+ dxgi_rt_desc.dpiX = (bitmap_size.width * 96.0f) / size->width;
+ dxgi_rt_desc.dpiY = (bitmap_size.height * 96.0f) / size->height;
}
else
{
@@ -776,46 +776,21 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
}
if (!pixel_format || pixel_format->format == DXGI_FORMAT_UNKNOWN)
- texture_desc.Format = parent_target->desc.pixelFormat.format;
+ dxgi_rt_desc.pixelFormat.format = parent_target->desc.pixelFormat.format;
else
- texture_desc.Format = pixel_format->format;
- dxgi_rt_desc.pixelFormat.format = texture_desc.Format;
+ dxgi_rt_desc.pixelFormat.format = pixel_format->format;
if (!pixel_format || pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN)
dxgi_rt_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
else
dxgi_rt_desc.pixelFormat.alphaMode = pixel_format->alphaMode;
- texture_desc.MipLevels = 1;
- texture_desc.ArraySize = 1;
- texture_desc.SampleDesc.Count = 1;
- texture_desc.SampleDesc.Quality = 0;
- texture_desc.Usage = D3D10_USAGE_DEFAULT;
- texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
- texture_desc.CPUAccessFlags = 0;
- texture_desc.MiscFlags = 0;
-
- if (FAILED(hr = ID3D10Device_CreateTexture2D(parent_target->d3d_device, &texture_desc, NULL, &texture)))
- {
- WARN("Failed to create texture, hr %#x.\n", hr);
- return hr;
- }
-
- hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&dxgi_surface);
- ID3D10Texture2D_Release(texture);
- if (FAILED(hr))
- {
- WARN("Failed to get DXGI surface interface, hr %#x.\n", hr);
- return hr;
- }
-
- if (FAILED(hr = d2d_d3d_create_render_target(parent_target->device, dxgi_surface,
+ if (FAILED(hr = d2d_d3d_create_render_target(parent_target->device, NULL,
(IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface,
parent_target->ops ? &d2d_bitmap_render_target_ops : NULL,
&dxgi_rt_desc, (void **)&render_target->dxgi_inner)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
- IDXGISurface_Release(dxgi_surface);
return hr;
}
@@ -824,20 +799,23 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
{
WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
IUnknown_Release(render_target->dxgi_inner);
- IDXGISurface_Release(dxgi_surface);
return hr;
}
bitmap_desc.pixelFormat = dxgi_rt_desc.pixelFormat;
bitmap_desc.dpiX = dxgi_rt_desc.dpiX;
bitmap_desc.dpiY = dxgi_rt_desc.dpiY;
-
- hr = ID2D1RenderTarget_CreateSharedBitmap(render_target->dxgi_target, &IID_IDXGISurface, dxgi_surface,
- &bitmap_desc, &render_target->bitmap);
- IDXGISurface_Release(dxgi_surface);
+ bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET;
+ bitmap_desc.colorContext = NULL;
+
+ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context);
+ hr = ID2D1DeviceContext_CreateBitmap(context, bitmap_size, NULL, 0, &bitmap_desc,
+ (ID2D1Bitmap1 **)&render_target->bitmap);
+ ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)render_target->bitmap);
+ ID2D1DeviceContext_Release(context);
if (FAILED(hr))
{
- WARN("Failed to create shared bitmap, hr %#x.\n", hr);
+ WARN("Failed to create target bitmap, hr %#x.\n", hr);
ID2D1RenderTarget_Release(render_target->dxgi_target);
IUnknown_Release(render_target->dxgi_inner);
return hr;
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 726d143d86..0a5bc36c9a 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -136,7 +136,7 @@ struct d2d_device_context
ID2D1Factory *factory;
ID2D1Device *device;
ID3D10Device *d3d_device;
- ID3D10RenderTargetView *view;
+ struct d2d_bitmap *target;
ID3D10StateBlock *stateblock;
struct d2d_shape_resources shape_resources[D2D_SHAPE_TYPE_COUNT];
ID3D10PixelShader *ps;
@@ -159,7 +159,6 @@ struct d2d_device_context
HRESULT d2d_d3d_create_render_target(ID2D1Device *device, IDXGISurface *surface, IUnknown *outer_unknown,
const struct d2d_device_context_ops *ops, const D2D1_RENDER_TARGET_PROPERTIES *desc,
void **render_target) DECLSPEC_HIDDEN;
-HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *render_target, IDXGISurface1 *surface) DECLSPEC_HIDDEN;
static inline BOOL d2d_device_context_is_dxgi_target(const struct d2d_device_context *context)
{
@@ -191,6 +190,8 @@ struct d2d_dc_render_target
LONG refcount;
IDXGISurface1 *dxgi_surface;
+ D2D1_PIXEL_FORMAT pixel_format;
+ ID3D10Device1 *d3d_device;
ID2D1RenderTarget *dxgi_target;
IUnknown *dxgi_inner;
@@ -345,6 +346,7 @@ struct d2d_bitmap
ID2D1Factory *factory;
ID3D10ShaderResourceView *view;
+ ID3D10RenderTargetView *rtv;
IDXGISurface *surface;
D2D1_SIZE_U pixel_size;
D2D1_PIXEL_FORMAT format;
diff --git a/dlls/d2d1/dc_render_target.c b/dlls/d2d1/dc_render_target.c
index 9a0f458faf..b4306fb2fe 100644
--- a/dlls/d2d1/dc_render_target.c
+++ b/dlls/d2d1/dc_render_target.c
@@ -99,7 +99,9 @@ static ULONG STDMETHODCALLTYPE d2d_dc_render_target_Release(ID2D1DCRenderTarget
if (!refcount)
{
IUnknown_Release(render_target->dxgi_inner);
- IDXGISurface1_Release(render_target->dxgi_surface);
+ if (render_target->dxgi_surface)
+ IDXGISurface1_Release(render_target->dxgi_surface);
+ ID3D10Device1_Release(render_target->d3d_device);
heap_free(render_target);
}
@@ -686,8 +688,9 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
D3D10_TEXTURE2D_DESC texture_desc;
IDXGISurface1 *dxgi_surface;
+ ID2D1DeviceContext *context;
ID3D10Texture2D *texture;
- ID3D10Device *device;
+ ID2D1Bitmap1 *bitmap;
HRESULT hr;
TRACE("iface %p, hdc %p, rect %s.\n", iface, hdc, wine_dbgstr_rect(rect));
@@ -695,27 +698,19 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget
if (!hdc)
return E_INVALIDARG;
- /* Recreate surface using specified size and original texture description. */
- if (FAILED(hr = IDXGISurface1_QueryInterface(render_target->dxgi_surface, &IID_ID3D10Texture2D, (void **)&texture)))
- {
- WARN("Failed to get texture interface, hr %#x.\n", hr);
- return hr;
- }
-
- ID3D10Texture2D_GetDesc(texture, &texture_desc);
- ID3D10Texture2D_Release(texture);
texture_desc.Width = rect->right - rect->left;
texture_desc.Height = rect->bottom - rect->top;
+ texture_desc.MipLevels = 1;
+ texture_desc.ArraySize = 1;
+ texture_desc.Format = render_target->pixel_format.format;
+ texture_desc.SampleDesc.Count = 1;
+ texture_desc.SampleDesc.Quality = 0;
+ texture_desc.Usage = D3D10_USAGE_DEFAULT;
+ texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
+ texture_desc.CPUAccessFlags = 0;
+ texture_desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE;
- if (FAILED(hr = IDXGISurface1_GetDevice(render_target->dxgi_surface, &IID_ID3D10Device, (void **)&device)))
- {
- WARN("Failed to get device from dxgi surface, hr %#x.\n", hr);
- return hr;
- }
-
- hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture);
- ID3D10Device_Release(device);
- if (FAILED(hr))
+ if (FAILED(hr = ID3D10Device1_CreateTexture2D(render_target->d3d_device, &texture_desc, NULL, &texture)))
{
WARN("Failed to create texture, hr %#x.\n", hr);
return hr;
@@ -730,14 +725,24 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget
}
/* Switch dxgi target to new surface. */
- if (FAILED(hr = d2d_d3d_render_target_create_rtv(render_target->dxgi_target, dxgi_surface)))
+ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context);
+ hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(context, (IDXGISurface *)dxgi_surface, NULL, &bitmap);
+ if (SUCCEEDED(hr))
{
- WARN("Failed to set new surface, hr %#x.\n", hr);
+ ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap);
+ ID2D1Bitmap1_Release(bitmap);
+ }
+ ID2D1DeviceContext_Release(context);
+
+ if (FAILED(hr))
+ {
+ WARN("Failed to create new target bitmap, hr %#x.\n", hr);
IDXGISurface1_Release(dxgi_surface);
return hr;
}
- IDXGISurface1_Release(render_target->dxgi_surface);
+ if (render_target->dxgi_surface)
+ IDXGISurface1_Release(render_target->dxgi_surface);
render_target->dxgi_surface = dxgi_surface;
render_target->hdc = hdc;
@@ -816,8 +821,6 @@ static const struct d2d_device_context_ops d2d_dc_render_target_ops =
HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID2D1Factory1 *factory,
ID3D10Device1 *d3d_device, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
- D3D10_TEXTURE2D_DESC texture_desc;
- ID3D10Texture2D *texture;
IDXGIDevice *dxgi_device;
ID2D1Device *device;
HRESULT hr;
@@ -828,14 +831,8 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
SetRectEmpty(&render_target->dst_rect);
render_target->hdc = NULL;
- /* Dummy 1x1 texture, recreated on BindDC(). */
- texture_desc.Width = 1;
- texture_desc.Height = 1;
- texture_desc.MipLevels = 1;
- texture_desc.ArraySize = 1;
-
- texture_desc.Format = desc->pixelFormat.format;
- switch (texture_desc.Format)
+ render_target->pixel_format = desc->pixelFormat;
+ switch (desc->pixelFormat.format)
{
case DXGI_FORMAT_B8G8R8A8_UNORM:
if (desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED
@@ -843,31 +840,10 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
break;
default:
- FIXME("Unhandled format %#x, alpha mode %u.\n", texture_desc.Format, desc->pixelFormat.alphaMode);
+ FIXME("Unhandled format %#x, alpha mode %u.\n", desc->pixelFormat.format, desc->pixelFormat.alphaMode);
return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
}
- texture_desc.SampleDesc.Count = 1;
- texture_desc.SampleDesc.Quality = 0;
- texture_desc.Usage = D3D10_USAGE_DEFAULT;
- texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
- texture_desc.CPUAccessFlags = 0;
- texture_desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE;
-
- if (FAILED(hr = ID3D10Device1_CreateTexture2D(d3d_device, &texture_desc, NULL, &texture)))
- {
- WARN("Failed to create texture, hr %#x.\n", hr);
- return hr;
- }
-
- hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface1, (void **)&render_target->dxgi_surface);
- ID3D10Texture2D_Release(texture);
- if (FAILED(hr))
- {
- WARN("Failed to get DXGI surface interface, hr %#x.\n", hr);
- return hr;
- }
-
if (FAILED(hr = ID3D10Device1_QueryInterface(d3d_device, &IID_IDXGIDevice, (void **)&dxgi_device)))
{
WARN("Failed to get DXGI device interface, hr %#x.\n", hr);
@@ -882,14 +858,12 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
return hr;
}
- hr = d2d_d3d_create_render_target(device, (IDXGISurface *)render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1DCRenderTarget_iface, &d2d_dc_render_target_ops,
- desc, (void **)&render_target->dxgi_inner);
+ hr = d2d_d3d_create_render_target(device, NULL, (IUnknown *)&render_target->ID2D1DCRenderTarget_iface,
+ &d2d_dc_render_target_ops, desc, (void **)&render_target->dxgi_inner);
ID2D1Device_Release(device);
if (FAILED(hr))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
- IDXGISurface1_Release(render_target->dxgi_surface);
return hr;
}
@@ -898,9 +872,11 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
{
WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
IUnknown_Release(render_target->dxgi_inner);
- IDXGISurface1_Release(render_target->dxgi_surface);
return hr;
}
+ render_target->d3d_device = d3d_device;
+ ID3D10Device1_AddRef(render_target->d3d_device);
+
return S_OK;
}
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index 9bf8ef65ac..04d58ae8d1 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -43,6 +43,8 @@ static inline struct d2d_device *impl_from_ID2D1Device(ID2D1Device *iface)
return CONTAINING_RECORD(iface, struct d2d_device, ID2D1Device_iface);
}
+static struct d2d_device *unsafe_impl_from_ID2D1Device(ID2D1Device *iface);
+
static ID2D1Brush *d2d_draw_get_text_brush(struct d2d_draw_text_layout_ctx *context, IUnknown *effect)
{
ID2D1Brush *brush = NULL;
@@ -175,7 +177,7 @@ static void d2d_device_context_draw(struct d2d_device_context *render_target, en
}
ID3D10Device_RSSetScissorRects(device, 1, &scissor_rect);
ID3D10Device_RSSetState(device, render_target->rs);
- ID3D10Device_OMSetRenderTargets(device, 1, &render_target->view, NULL);
+ ID3D10Device_OMSetRenderTargets(device, 1, &render_target->target->rtv, NULL);
if (brush)
{
ID3D10Device_OMSetBlendState(device, render_target->bs, blend_factor, D3D10_DEFAULT_SAMPLE_MASK);
@@ -261,7 +263,8 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface)
IDWriteRenderingParams_Release(context->default_text_rendering_params);
if (context->text_rendering_params)
IDWriteRenderingParams_Release(context->text_rendering_params);
- ID3D10BlendState_Release(context->bs);
+ if (context->bs)
+ ID3D10BlendState_Release(context->bs);
ID3D10RasterizerState_Release(context->rs);
ID3D10Buffer_Release(context->vb);
ID3D10Buffer_Release(context->ib);
@@ -272,7 +275,8 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface)
ID3D10InputLayout_Release(context->shape_resources[i].il);
}
context->stateblock->lpVtbl->Release(context->stateblock);
- ID3D10RenderTargetView_Release(context->view);
+ if (context->target)
+ ID2D1Bitmap1_Release(&context->target->ID2D1Bitmap1_iface);
ID3D10Device_Release(context->d3d_device);
ID2D1Factory_Release(context->factory);
ID2D1Device_Release(context->device);
@@ -1979,14 +1983,95 @@ static void STDMETHODCALLTYPE d2d_device_context_GetDevice(ID2D1DeviceContext *i
ID2D1Device_AddRef(*device);
}
+static void d2d_device_context_reset_target(struct d2d_device_context *context)
+{
+ if (!context->target)
+ return;
+
+ ID2D1Bitmap1_Release(&context->target->ID2D1Bitmap1_iface);
+ context->target = NULL;
+
+ context->desc.dpiX = 96.0f;
+ context->desc.dpiY = 96.0f;
+
+ memset(&context->desc.pixelFormat, 0, sizeof(context->desc.pixelFormat));
+ memset(&context->pixel_size, 0, sizeof(context->pixel_size));
+
+ ID3D10BlendState_Release(context->bs);
+ context->bs = NULL;
+}
+
static void STDMETHODCALLTYPE d2d_device_context_SetTarget(ID2D1DeviceContext *iface, ID2D1Image *target)
{
- FIXME("iface %p, target %p stub!\n", iface, target);
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+ struct d2d_bitmap *bitmap_impl;
+ D3D10_BLEND_DESC blend_desc;
+ ID2D1Bitmap *bitmap;
+ HRESULT hr;
+
+ TRACE("iface %p, target %p.\n", iface, target);
+
+ if (!target)
+ {
+ d2d_device_context_reset_target(context);
+ return;
+ }
+
+ if (FAILED(ID2D1Image_QueryInterface(target, &IID_ID2D1Bitmap, (void **)&bitmap)))
+ {
+ FIXME("Only bitmap targets are supported.\n");
+ return;
+ }
+
+ bitmap_impl = unsafe_impl_from_ID2D1Bitmap(bitmap);
+
+ if (!(bitmap_impl->options & D2D1_BITMAP_OPTIONS_TARGET))
+ {
+ context->error.code = D2DERR_INVALID_TARGET;
+ context->error.tag1 = context->drawing_state.tag1;
+ context->error.tag2 = context->drawing_state.tag2;
+ return;
+ }
+
+ d2d_device_context_reset_target(context);
+
+ /* Set sizes and pixel format. */
+ context->desc.dpiX = bitmap_impl->dpi_x;
+ context->desc.dpiY = bitmap_impl->dpi_y;
+ context->pixel_size = bitmap_impl->pixel_size;
+ context->desc.pixelFormat = bitmap_impl->format;
+ context->target = bitmap_impl;
+
+ memset(&blend_desc, 0, sizeof(blend_desc));
+ blend_desc.BlendEnable[0] = TRUE;
+ blend_desc.SrcBlend = D3D10_BLEND_ONE;
+ blend_desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
+ blend_desc.BlendOp = D3D10_BLEND_OP_ADD;
+ if (context->desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE)
+ {
+ blend_desc.SrcBlendAlpha = D3D10_BLEND_ZERO;
+ blend_desc.DestBlendAlpha = D3D10_BLEND_ONE;
+ }
+ else
+ {
+ blend_desc.SrcBlendAlpha = D3D10_BLEND_ONE;
+ blend_desc.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;
+ }
+ blend_desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;
+ blend_desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
+ if (FAILED(hr = ID3D10Device_CreateBlendState(context->d3d_device, &blend_desc, &context->bs)))
+ WARN("Failed to create blend state, hr %#x.\n", hr);
}
static void STDMETHODCALLTYPE d2d_device_context_GetTarget(ID2D1DeviceContext *iface, ID2D1Image **target)
{
- FIXME("iface %p, target %p stub!\n", iface, target);
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
+ TRACE("iface %p, target %p.\n", iface, target);
+
+ *target = context->target ? (ID2D1Image *)&context->target->ID2D1Bitmap1_iface : NULL;
+ if (*target)
+ ID2D1Image_AddRef(*target);
}
static void STDMETHODCALLTYPE d2d_device_context_SetRenderingControls(ID2D1DeviceContext *iface,
@@ -2538,7 +2623,7 @@ static HRESULT d2d_device_context_get_surface(struct d2d_device_context *render_
ID3D10Resource *resource;
HRESULT hr;
- ID3D10RenderTargetView_GetResource(render_target->view, &resource);
+ ID3D10RenderTargetView_GetResource(render_target->target->rtv, &resource);
hr = ID3D10Resource_QueryInterface(resource, &IID_IDXGISurface1, (void **)surface);
ID3D10Resource_Release(resource);
if (FAILED(hr))
@@ -2600,17 +2685,14 @@ static const struct ID2D1GdiInteropRenderTargetVtbl d2d_gdi_interop_render_targe
};
static HRESULT d2d_device_context_init(struct d2d_device_context *render_target, ID2D1Device *device,
- IDXGISurface *surface, IUnknown *outer_unknown, const struct d2d_device_context_ops *ops,
- const D2D1_RENDER_TARGET_PROPERTIES *desc)
+ IUnknown *outer_unknown, const struct d2d_device_context_ops *ops)
{
D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_STATE_BLOCK_MASK state_mask;
- DXGI_SURFACE_DESC surface_desc;
+ struct d2d_device *device_impl;
IDWriteFactory *dwrite_factory;
D3D10_RASTERIZER_DESC rs_desc;
D3D10_BUFFER_DESC buffer_desc;
- D3D10_BLEND_DESC blend_desc;
- ID3D10Resource *resource;
unsigned int i;
HRESULT hr;
@@ -3460,25 +3542,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
{ 1.0f, -1.0f},
};
static const UINT16 indices[] = {0, 1, 2, 2, 1, 3};
- float dpi_x, dpi_y;
-
- dpi_x = desc->dpiX;
- dpi_y = desc->dpiY;
-
- if (dpi_x == 0.0f && dpi_y == 0.0f)
- {
- dpi_x = 96.0f;
- dpi_y = 96.0f;
- }
- else if (dpi_x <= 0.0f || dpi_y <= 0.0f)
- return E_INVALIDARG;
-
- if (desc->type != D2D1_RENDER_TARGET_TYPE_DEFAULT && desc->type != D2D1_RENDER_TARGET_TYPE_HARDWARE)
- WARN("Ignoring render target type %#x.\n", desc->type);
- if (desc->usage != D2D1_RENDER_TARGET_USAGE_NONE)
- FIXME("Ignoring render target usage %#x.\n", desc->usage);
- if (desc->minLevel != D2D1_FEATURE_LEVEL_DEFAULT)
- WARN("Ignoring feature level %#x.\n", desc->minLevel);
render_target->ID2D1DeviceContext_iface.lpVtbl = &d2d_device_context_vtbl;
render_target->ID2D1GdiInteropRenderTarget_iface.lpVtbl = &d2d_gdi_interop_render_target_vtbl;
@@ -3492,27 +3555,14 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
render_target->outer_unknown = outer_unknown ? outer_unknown : &render_target->IUnknown_iface;
render_target->ops = ops;
- if (FAILED(hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&render_target->d3d_device)))
+ device_impl = unsafe_impl_from_ID2D1Device(device);
+ if (FAILED(hr = IDXGIDevice_QueryInterface(device_impl->dxgi_device, &IID_ID3D10Device, (void **)&render_target->d3d_device)))
{
WARN("Failed to get device interface, hr %#x.\n", hr);
ID2D1Factory_Release(render_target->factory);
return hr;
}
- if (FAILED(hr = IDXGISurface_QueryInterface(surface, &IID_ID3D10Resource, (void **)&resource)))
- {
- WARN("Failed to get ID3D10Resource interface, hr %#x.\n", hr);
- goto err;
- }
-
- hr = ID3D10Device_CreateRenderTargetView(render_target->d3d_device, resource, NULL, &render_target->view);
- ID3D10Resource_Release(resource);
- if (FAILED(hr))
- {
- WARN("Failed to create rendertarget view, hr %#x.\n", hr);
- goto err;
- }
-
if (FAILED(hr = D3D10StateBlockMaskEnableAll(&state_mask)))
{
WARN("Failed to create stateblock mask, hr %#x.\n", hr);
@@ -3597,29 +3647,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto err;
}
- memset(&blend_desc, 0, sizeof(blend_desc));
- blend_desc.BlendEnable[0] = TRUE;
- blend_desc.SrcBlend = D3D10_BLEND_ONE;
- blend_desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
- blend_desc.BlendOp = D3D10_BLEND_OP_ADD;
- if (desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE)
- {
- blend_desc.SrcBlendAlpha = D3D10_BLEND_ZERO;
- blend_desc.DestBlendAlpha = D3D10_BLEND_ONE;
- }
- else
- {
- blend_desc.SrcBlendAlpha = D3D10_BLEND_ONE;
- blend_desc.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;
- }
- blend_desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;
- blend_desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
- if (FAILED(hr = ID3D10Device_CreateBlendState(render_target->d3d_device, &blend_desc, &render_target->bs)))
- {
- WARN("Failed to create blend state, hr %#x.\n", hr);
- goto err;
- }
-
if (FAILED(hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
&IID_IDWriteFactory, (IUnknown **)&dwrite_factory)))
{
@@ -3635,15 +3662,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto err;
}
- if (FAILED(hr = IDXGISurface_GetDesc(surface, &surface_desc)))
- {
- WARN("Failed to get surface desc, hr %#x.\n", hr);
- goto err;
- }
-
- render_target->desc.pixelFormat = desc->pixelFormat;
- render_target->pixel_size.width = surface_desc.Width;
- render_target->pixel_size.height = surface_desc.Height;
render_target->drawing_state.transform = identity;
if (!d2d_clip_stack_init(&render_target->clip_stack))
@@ -3653,16 +3671,14 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto err;
}
- render_target->desc.dpiX = dpi_x;
- render_target->desc.dpiY = dpi_y;
+ render_target->desc.dpiX = 96.0f;
+ render_target->desc.dpiY = 96.0f;
return S_OK;
err:
if (render_target->default_text_rendering_params)
IDWriteRenderingParams_Release(render_target->default_text_rendering_params);
- if (render_target->bs)
- ID3D10BlendState_Release(render_target->bs);
if (render_target->rs)
ID3D10RasterizerState_Release(render_target->rs);
if (render_target->vb)
@@ -3680,8 +3696,6 @@ err:
}
if (render_target->stateblock)
render_target->stateblock->lpVtbl->Release(render_target->stateblock);
- if (render_target->view)
- ID3D10RenderTargetView_Release(render_target->view);
if (render_target->d3d_device)
ID3D10Device_Release(render_target->d3d_device);
ID2D1Device_Release(render_target->device);
@@ -3692,65 +3706,62 @@ err:
HRESULT d2d_d3d_create_render_target(ID2D1Device *device, IDXGISurface *surface, IUnknown *outer_unknown,
const struct d2d_device_context_ops *ops, const D2D1_RENDER_TARGET_PROPERTIES *desc, void **render_target)
{
+ D2D1_BITMAP_PROPERTIES1 bitmap_desc;
struct d2d_device_context *object;
+ ID2D1Bitmap1 *bitmap;
HRESULT hr;
+ if (desc->type != D2D1_RENDER_TARGET_TYPE_DEFAULT && desc->type != D2D1_RENDER_TARGET_TYPE_HARDWARE)
+ WARN("Ignoring render target type %#x.\n", desc->type);
+ if (desc->usage != D2D1_RENDER_TARGET_USAGE_NONE)
+ FIXME("Ignoring render target usage %#x.\n", desc->usage);
+ if (desc->minLevel != D2D1_FEATURE_LEVEL_DEFAULT)
+ WARN("Ignoring feature level %#x.\n", desc->minLevel);
+
+ bitmap_desc.dpiX = desc->dpiX;
+ bitmap_desc.dpiY = desc->dpiY;
+
+ if (bitmap_desc.dpiX == 0.0f && bitmap_desc.dpiY == 0.0f)
+ {
+ bitmap_desc.dpiX = 96.0f;
+ bitmap_desc.dpiY = 96.0f;
+ }
+ else if (bitmap_desc.dpiX <= 0.0f || bitmap_desc.dpiY <= 0.0f)
+ return E_INVALIDARG;
+
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = d2d_device_context_init(object, device, surface, outer_unknown, ops, desc)))
+ if (FAILED(hr = d2d_device_context_init(object, device, outer_unknown, ops)))
{
WARN("Failed to initialize render target, hr %#x.\n", hr);
heap_free(object);
return hr;
}
- TRACE("Created render target %p.\n", object);
- *render_target = outer_unknown ? &object->IUnknown_iface : (IUnknown *)&object->ID2D1DeviceContext_iface;
-
- return S_OK;
-}
-
-HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *iface, IDXGISurface1 *surface)
-{
- struct d2d_device_context *render_target = impl_from_ID2D1RenderTarget(iface);
- DXGI_SURFACE_DESC surface_desc;
- ID3D10RenderTargetView *view;
- ID3D10Resource *resource;
- HRESULT hr;
-
- if (!surface)
+ if (surface)
{
- ID3D10RenderTargetView_Release(render_target->view);
- render_target->view = NULL;
- return S_OK;
- }
-
- if (FAILED(hr = IDXGISurface1_GetDesc(surface, &surface_desc)))
- {
- WARN("Failed to get surface desc, hr %#x.\n", hr);
- return hr;
- }
+ bitmap_desc.pixelFormat = desc->pixelFormat;
+ bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
+ bitmap_desc.colorContext = NULL;
- if (FAILED(hr = IDXGISurface1_QueryInterface(surface, &IID_ID3D10Resource, (void **)&resource)))
- {
- WARN("Failed to get ID3D10Resource interface, hr %#x.\n", hr);
- return hr;
- }
+ if (FAILED(hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(&object->ID2D1DeviceContext_iface, surface,
+ &bitmap_desc, &bitmap)))
+ {
+ WARN("Failed to create target bitmap, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(&object->ID2D1DeviceContext_iface);
+ heap_free(object);
+ return hr;
+ }
- hr = ID3D10Device_CreateRenderTargetView(render_target->d3d_device, resource, NULL, &view);
- ID3D10Resource_Release(resource);
- if (FAILED(hr))
- {
- WARN("Failed to create rendertarget view, hr %#x.\n", hr);
- return hr;
+ ID2D1DeviceContext_SetTarget(&object->ID2D1DeviceContext_iface, (ID2D1Image *)bitmap);
+ ID2D1Bitmap1_Release(bitmap);
}
+ else
+ object->desc.pixelFormat = desc->pixelFormat;
- render_target->pixel_size.width = surface_desc.Width;
- render_target->pixel_size.height = surface_desc.Height;
- if (render_target->view)
- ID3D10RenderTargetView_Release(render_target->view);
- render_target->view = view;
+ TRACE("Created render target %p.\n", object);
+ *render_target = outer_unknown ? &object->IUnknown_iface : (IUnknown *)&object->ID2D1DeviceContext_iface;
return S_OK;
}
@@ -3861,6 +3872,14 @@ static const struct ID2D1DeviceVtbl d2d_device_vtbl =
d2d_device_ClearResources,
};
+static struct d2d_device *unsafe_impl_from_ID2D1Device(ID2D1Device *iface)
+{
+ if (!iface)
+ return NULL;
+ assert(iface->lpVtbl == &d2d_device_vtbl);
+ return CONTAINING_RECORD(iface, struct d2d_device, ID2D1Device_iface);
+}
+
void d2d_device_init(struct d2d_device *device, ID2D1Factory1 *iface, IDXGIDevice *dxgi_device)
{
device->ID2D1Device_iface.lpVtbl = &d2d_device_vtbl;
diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c
index 9b8771f895..d0b9695933 100644
--- a/dlls/d2d1/hwnd_render_target.c
+++ b/dlls/d2d1/hwnd_render_target.c
@@ -675,11 +675,14 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_Resize(ID2D1HwndRenderTa
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
IDXGISurface1 *dxgi_surface;
+ ID2D1DeviceContext *context;
+ ID2D1Bitmap1 *bitmap;
HRESULT hr;
TRACE("iface %p, width %u, height %u.\n", iface, size->width, size->height);
- d2d_d3d_render_target_create_rtv(render_target->dxgi_target, NULL);
+ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context);
+ ID2D1DeviceContext_SetTarget(context, NULL);
if (SUCCEEDED(hr = IDXGISwapChain_ResizeBuffers(render_target->swapchain, 1, size->width, size->height,
DXGI_FORMAT_UNKNOWN, 0)))
@@ -688,13 +691,25 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_Resize(ID2D1HwndRenderTa
(void **)&dxgi_surface)))
{
WARN("Failed to get buffer, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(context);
return hr;
}
- hr = d2d_d3d_render_target_create_rtv(render_target->dxgi_target, dxgi_surface);
+ hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(context, (IDXGISurface *)dxgi_surface, NULL, &bitmap);
IDXGISurface1_Release(dxgi_surface);
+ if (FAILED(hr))
+ {
+ WARN("Failed to create target bitmap, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(context);
+ return hr;
+ }
+
+ ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap);
+ ID2D1Bitmap1_Release(bitmap);
}
+ ID2D1DeviceContext_Release(context);
+
return hr;
}
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index f4e2f1c39d..fd9b4de1af 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -821,6 +821,7 @@ static void check_bitmap_surface_(unsigned int line, ID2D1Bitmap *bitmap, BOOL h
break;
}
+ todo_wine_if(options == D2D1_BITMAP_OPTIONS_TARGET)
ok_(__FILE__, line)(desc.BindFlags == bind_flags, "Unexpected bind flags %#x, bitmap options %#x.\n",
desc.BindFlags, options);
ok_(__FILE__, line)(desc.CPUAccessFlags == 0, "Unexpected cpu access flags %#x.\n", desc.CPUAccessFlags);
@@ -5289,10 +5290,7 @@ static void test_compatible_target_size(ID2D1RenderTarget *rt)
{
hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, size_tests[i].size, size_tests[i].pixel_size, NULL,
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &bitmap_rt);
- todo_wine
- ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
- if (FAILED(hr))
- return;
+ ok(SUCCEEDED(hr), "%u: failed to create render target, hr %#x.\n", i, hr);
if (size_tests[i].pixel_size)
expected_size = *size_tests[i].pixel_size;
@@ -5521,13 +5519,11 @@ static void test_bitmap_target(void)
ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
pixel_size = ID2D1BitmapRenderTarget_GetPixelSize(rt);
-todo_wine
ok(pixel_size.width == 0 && pixel_size.height == 0, "Got wrong size\n");
hr = ID2D1BitmapRenderTarget_GetBitmap(rt, &bitmap);
ok(SUCCEEDED(hr), "GetBitmap() failed, hr %#x.\n", hr);
pixel_size = ID2D1Bitmap_GetPixelSize(bitmap);
-todo_wine
ok(pixel_size.width == 0 && pixel_size.height == 0, "Got wrong size\n");
ID2D1Bitmap_Release(bitmap);
@@ -6990,15 +6986,10 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
bitmap2 = NULL;
ID2D1DeviceContext_GetTarget(context2, (ID2D1Image **)&bitmap2);
- todo_wine
ok_(__FILE__, line)(bitmap2 == bitmap, "Unexpected bitmap.\n");
- if (bitmap2)
- {
- check_bitmap_surface_(line, bitmap, has_surface, D2D1_BITMAP_OPTIONS_TARGET);
-
- ID2D1Bitmap_Release(bitmap2);
- }
+ check_bitmap_surface_(line, bitmap, has_surface, D2D1_BITMAP_OPTIONS_TARGET);
+ ID2D1Bitmap_Release(bitmap2);
ID2D1Bitmap_Release(bitmap);
ID2D1BitmapRenderTarget_Release(compatible_rt);
@@ -7095,6 +7086,8 @@ static void test_bitmap_surface(void)
ID2D1Bitmap1 *bitmap;
ID2D1Device *device;
ID2D1Image *target;
+ D2D1_SIZE_U size;
+ D2D1_TAG t1, t2;
unsigned int i;
HWND window;
HRESULT hr;
@@ -7128,14 +7121,10 @@ static void test_bitmap_surface(void)
bitmap = NULL;
ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
-todo_wine
ok(!!bitmap, "Unexpected target.\n");
-
-if (bitmap)
-{
check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW);
ID2D1Bitmap1_Release(bitmap);
-}
+
check_rt_bitmap_surface(rt, TRUE, D2D1_BITMAP_OPTIONS_NONE);
ID2D1DeviceContext_Release(device_context);
@@ -7213,8 +7202,45 @@ if (SUCCEEDED(hr))
check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
- ID2D1DeviceContext_Release(device_context);
ID2D1Bitmap1_Release(bitmap);
+
+ /* Without D2D1_BITMAP_OPTIONS_TARGET. */
+ memset(&bitmap_desc, 0, sizeof(bitmap_desc));
+ bitmap_desc.pixelFormat = ID2D1DeviceContext_GetPixelFormat(device_context);
+ size.width = size.height = 4;
+ hr = ID2D1DeviceContext_CreateBitmap(device_context, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok(SUCCEEDED(hr), "Failed to create a bitmap, hr %#x.\n", hr);
+ check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+ ID2D1DeviceContext_SetTags(device_context, 1, 2);
+
+ ID2D1DeviceContext_BeginDraw(device_context);
+ ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap);
+ hr = ID2D1DeviceContext_EndDraw(device_context, &t1, &t2);
+ ok(hr == D2DERR_INVALID_TARGET, "Unexpected hr %#x.\n", hr);
+ ok(t1 == 1 && t2 == 2, "Unexpected tags.\n");
+
+ ID2D1Bitmap1_Release(bitmap);
+
+ ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
+ ok(!!bitmap, "Expected target bitmap.\n");
+ ID2D1Bitmap1_Release(bitmap);
+
+ bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET;
+ hr = ID2D1DeviceContext_CreateBitmap(device_context, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok(SUCCEEDED(hr), "Failed to create a bitmap, hr %#x.\n", hr);
+ check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET);
+ ID2D1DeviceContext_SetTarget(device_context, NULL);
+ ID2D1DeviceContext_SetTags(device_context, 3, 4);
+
+ ID2D1DeviceContext_BeginDraw(device_context);
+ ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap);
+ hr = ID2D1DeviceContext_EndDraw(device_context, &t1, &t2);
+ ok(SUCCEEDED(hr), "EndDraw() failed, hr %#x.\n", hr);
+ ok(t1 == 0 && t2 == 0, "Unexpected tags.\n");
+
+ ID2D1Bitmap1_Release(bitmap);
+
+ ID2D1DeviceContext_Release(device_context);
}
ID2D1Device_Release(device);
IDXGIDevice_Release(dxgi_device);
--
2.19.0
Sept. 28, 2018
[PATCH 4/5] d2d1: Default to premultiplied alpha mode in CreateBitmapFromDxgiSurface().
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/d2d1/device.c | 1 +
dlls/d2d1/tests/d2d1.c | 64 ++++++++++++++++++++++++++++++++++++++++--
2 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index d1c1845171..9bf8ef65ac 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1852,6 +1852,7 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_CreateBitmapFromDxgiSurface(
memset(&bitmap_desc, 0, sizeof(bitmap_desc));
bitmap_desc.pixelFormat.format = surface_desc.Format;
+ bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
desc = &bitmap_desc;
}
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 80660b00f9..f4e2f1c39d 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -7019,6 +7019,41 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1DCRenderTarget_Release(dc_rt);
}
+static IDXGISurface *create_surface(IDXGIDevice *dxgi_device, DXGI_FORMAT format)
+{
+ D3D10_TEXTURE2D_DESC texture_desc;
+ ID3D10Texture2D *texture;
+ ID3D10Device *d3d_device;
+ IDXGISurface *surface;
+ HRESULT hr;
+
+ texture_desc.Width = 1;
+ texture_desc.Height = 1;
+ texture_desc.MipLevels = 1;
+ texture_desc.ArraySize = 1;
+ texture_desc.Format = format;
+ texture_desc.SampleDesc.Count = 1;
+ texture_desc.SampleDesc.Quality = 0;
+ texture_desc.Usage = D3D10_USAGE_DEFAULT;
+ texture_desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
+ texture_desc.CPUAccessFlags = 0;
+ texture_desc.MiscFlags = 0;
+
+ hr = IDXGIDevice_QueryInterface(dxgi_device, &IID_ID3D10Device, (void **)&d3d_device);
+ ok(SUCCEEDED(hr), "Failed to get device interface, hr %#x.\n", hr);
+
+ hr = ID3D10Device_CreateTexture2D(d3d_device, &texture_desc, NULL, &texture);
+ ok(SUCCEEDED(hr), "Failed to create a texture, hr %#x.\n", hr);
+
+ hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
+ ok(SUCCEEDED(hr), "Failed to get surface interface, hr %#x.\n", hr);
+
+ ID3D10Device_Release(d3d_device);
+ ID3D10Texture2D_Release(texture);
+
+ return surface;
+}
+
static void test_bitmap_surface(void)
{
static const struct bitmap_format_test
@@ -7050,12 +7085,13 @@ static void test_bitmap_surface(void)
D2D1_RENDER_TARGET_PROPERTIES rt_desc;
D2D1_BITMAP_PROPERTIES1 bitmap_desc;
ID2D1DeviceContext *device_context;
+ IDXGISurface *surface, *surface2;
+ D2D1_PIXEL_FORMAT pixel_format;
ID3D10Device1 *d3d_device;
IDXGISwapChain *swapchain;
IDXGIDevice *dxgi_device;
ID2D1Factory1 *factory;
ID2D1RenderTarget *rt;
- IDXGISurface *surface;
ID2D1Bitmap1 *bitmap;
ID2D1Device *device;
ID2D1Image *target;
@@ -7121,8 +7157,6 @@ if (SUCCEEDED(hr))
{
for (i = 0; i < ARRAY_SIZE(bitmap_format_tests); ++i)
{
- D2D1_PIXEL_FORMAT pixel_format;
-
memset(&bitmap_desc, 0, sizeof(bitmap_desc));
bitmap_desc.pixelFormat = bitmap_format_tests[i].original;
bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
@@ -7143,9 +7177,33 @@ if (SUCCEEDED(hr))
}
}
+ /* A8 surface */
+ hr = IDXGISurface_GetDevice(surface, &IID_IDXGIDevice, (void **)&dxgi_device);
+ ok(SUCCEEDED(hr), "Failed to get the device, hr %#x.\n", hr);
+
+ surface2 = create_surface(dxgi_device, DXGI_FORMAT_A8_UNORM);
+
+ hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(device_context, surface2, NULL, &bitmap);
+ ok(SUCCEEDED(hr) || broken(hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT) /* Win7 */,
+ "Failed to create a bitmap, hr %#x.\n", hr);
+
+ if (SUCCEEDED(hr))
+ {
+ pixel_format = ID2D1Bitmap1_GetPixelFormat(bitmap);
+ ok(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED, "Unexpected alpha mode %#x.\n", pixel_format.alphaMode);
+
+ ID2D1Bitmap1_Release(bitmap);
+ }
+
+ IDXGIDevice_Release(dxgi_device);
+ IDXGISurface_Release(surface2);
+
hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(device_context, surface, NULL, &bitmap);
ok(SUCCEEDED(hr), "Failed to create a bitmap, hr %#x.\n", hr);
+ pixel_format = ID2D1Bitmap1_GetPixelFormat(bitmap);
+ ok(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED, "Unexpected alpha mode %#x.\n", pixel_format.alphaMode);
+
check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW);
check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
--
2.19.0
Sept. 28, 2018
[PATCH 3/5] d2d1: Allow creating zero-sized bitmaps.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/d2d1/bitmap.c | 12 ++++++++++--
dlls/d2d1/tests/d2d1.c | 24 +++++++++++++++++++++++-
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index 85514627ca..fde348fa1c 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -315,8 +315,16 @@ HRESULT d2d_bitmap_create(struct d2d_device_context *context, D2D1_SIZE_U size,
return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
}
- texture_desc.Width = size.width;
- texture_desc.Height = size.height;
+ if (size.width == 0 || size.height == 0)
+ {
+ texture_desc.Width = 1;
+ texture_desc.Height = 1;
+ }
+ else
+ {
+ texture_desc.Width = size.width;
+ texture_desc.Height = size.height;
+ }
texture_desc.MipLevels = 1;
texture_desc.ArraySize = 1;
texture_desc.Format = desc->pixelFormat.format;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index dcd8c30688..80660b00f9 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -827,7 +827,10 @@ static void check_bitmap_surface_(unsigned int line, ID2D1Bitmap *bitmap, BOOL h
ok_(__FILE__, line)(desc.MiscFlags == 0, "Unexpected misc flags %#x.\n", desc.MiscFlags);
pixel_size = ID2D1Bitmap_GetPixelSize(bitmap);
- ok_(__FILE__, line)(desc.Width == pixel_size.width && desc.Height == pixel_size.height,
+ if (pixel_size.width == 0 || pixel_size.height == 0)
+ ok_(__FILE__, line)(desc.Width == 1 && desc.Height == 1, "Expected dummy 1x1 texture.\n");
+ else
+ ok_(__FILE__, line)(desc.Width == pixel_size.width && desc.Height == pixel_size.height,
"Mismatching texture size.\n");
ID3D10Texture2D_Release(texture);
@@ -6890,6 +6893,25 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1Bitmap_Release(bitmap);
+ /* Zero sized bitmaps. */
+ set_size_u(&size, 0, 0);
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ check_bitmap_surface_(line, bitmap, has_surface, options);
+ ID2D1Bitmap_Release(bitmap);
+
+ set_size_u(&size, 2, 0);
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ check_bitmap_surface_(line, bitmap, has_surface, options);
+ ID2D1Bitmap_Release(bitmap);
+
+ set_size_u(&size, 0, 2);
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ check_bitmap_surface_(line, bitmap, has_surface, options);
+ ID2D1Bitmap_Release(bitmap);
+
/* WIC bitmap. */
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
--
2.19.0
Sept. 28, 2018