Skip to content

Commit 0ed7f6b

Browse files
committed
tests: Test resolving to images without RTV usage.
This hits the compute shader path in our implementation. Signed-off-by: Philip Rebohle <[email protected]>
1 parent bdc9496 commit 0ed7f6b

File tree

1 file changed

+55
-7
lines changed

1 file changed

+55
-7
lines changed

tests/d3d12_copy.c

+55-7
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,7 @@ void test_multisample_resolve(void)
12201220

12211221
void test_multisample_resolve_formats(void)
12221222
{
1223-
ID3D12Resource *ds, *ds_ms, *rt_f32, *rt_f32_ms, *rt_u32, *rt_u32_ms, *rt_s32, *rt_s32_ms, *combined_image;
1223+
ID3D12Resource *ds, *ds_ms, *rt_f32, *rt_f32_ms, *rt_u32, *rt_u32_ms, *rt_s32, *rt_s32_ms, *image_u32, *image_s32, *combined_image;
12241224
ID3D12PipelineState *pso_setup_render_targets, *pso_setup_stencil;
12251225
ID3D12RootSignature *rs_setup_render_targets, *rs_setup_stencil;
12261226
D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, dsv_handle;
@@ -1426,6 +1426,17 @@ void test_multisample_resolve_formats(void)
14261426
NULL, &IID_ID3D12Resource, (void**)&rt_s32);
14271427
ok(hr == S_OK, "Failed to create render target, hr %#x.\n");
14281428

1429+
/* FIXME we should not require UAV usage */
1430+
resource_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
1431+
hr = ID3D12Device_CreateCommittedResource(context.device, &heap_properties,
1432+
D3D12_HEAP_FLAG_NONE, &resource_desc, D3D12_RESOURCE_STATE_COPY_DEST,
1433+
NULL, &IID_ID3D12Resource, (void**)&image_u32);
1434+
ok(hr == S_OK, "Failed to create render target, hr %#x.\n");
1435+
hr = ID3D12Device_CreateCommittedResource(context.device, &heap_properties,
1436+
D3D12_HEAP_FLAG_NONE, &resource_desc, D3D12_RESOURCE_STATE_COPY_DEST,
1437+
NULL, &IID_ID3D12Resource, (void**)&image_s32);
1438+
ok(hr == S_OK, "Failed to create render target, hr %#x.\n");
1439+
14291440
resource_desc.Alignment = D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT;
14301441
resource_desc.Format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT;
14311442
resource_desc.SampleDesc.Count = 4;
@@ -1450,7 +1461,7 @@ void test_multisample_resolve_formats(void)
14501461
resource_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
14511462
resource_desc.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT;
14521463
resource_desc.Width = 4;
1453-
resource_desc.Height = 16;
1464+
resource_desc.Height = 24;
14541465
resource_desc.DepthOrArraySize = 1;
14551466
resource_desc.MipLevels = 1;
14561467
resource_desc.Format = DXGI_FORMAT_R32_TYPELESS;
@@ -1561,10 +1572,19 @@ void test_multisample_resolve_formats(void)
15611572
D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0xff, 0, NULL);
15621573

15631574
transition_resource_state(context.list, rt_f32, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1564-
transition_resource_state(context.list, rt_u32, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1565-
transition_resource_state(context.list, rt_s32, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1575+
transition_resource_state(context.list, rt_u32, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
1576+
transition_resource_state(context.list, rt_s32, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
15661577
transition_resource_state(context.list, ds, D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_RESOLVE_DEST);
15671578

1579+
ID3D12GraphicsCommandList_CopyResource(context.list, image_u32, rt_u32);
1580+
ID3D12GraphicsCommandList_CopyResource(context.list, image_s32, rt_s32);
1581+
1582+
transition_resource_state(context.list, rt_u32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1583+
transition_resource_state(context.list, rt_s32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1584+
1585+
transition_resource_state(context.list, image_u32, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1586+
transition_resource_state(context.list, image_s32, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_RESOLVE_DEST);
1587+
15681588
if (j)
15691589
{
15701590
dst_x = 1;
@@ -1604,11 +1624,20 @@ void test_multisample_resolve_formats(void)
16041624
ID3D12GraphicsCommandList1_ResolveSubresourceRegion(command_list1,
16051625
ds, 1, dst_x, dst_y, ds_ms, 1, j ? &src_rect : NULL,
16061626
DXGI_FORMAT_X32_TYPELESS_G8X24_UINT, mode);
1627+
1628+
ID3D12GraphicsCommandList1_ResolveSubresourceRegion(command_list1,
1629+
image_u32, 0, dst_x, dst_y, rt_u32_ms, 0, j ? &src_rect : NULL,
1630+
DXGI_FORMAT_R32_UINT, mode);
1631+
ID3D12GraphicsCommandList1_ResolveSubresourceRegion(command_list1,
1632+
image_s32, 0, dst_x, dst_y, rt_s32_ms, 0, j ? &src_rect : NULL,
1633+
DXGI_FORMAT_R32_SINT, mode);
16071634
}
16081635

16091636
transition_resource_state(context.list, rt_f32, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
16101637
transition_resource_state(context.list, rt_u32, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
16111638
transition_resource_state(context.list, rt_s32, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
1639+
transition_resource_state(context.list, image_u32, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
1640+
transition_resource_state(context.list, image_s32, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
16121641
transition_resource_state(context.list, ds, D3D12_RESOURCE_STATE_RESOLVE_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
16131642

16141643
copy_box.left = 0;
@@ -1635,6 +1664,10 @@ void test_multisample_resolve_formats(void)
16351664
ID3D12GraphicsCommandList_CopyTextureRegion(context.list, &copy_dst, 0, 8, 0, &copy_src, &copy_box);
16361665
copy_src.pResource = rt_s32;
16371666
ID3D12GraphicsCommandList_CopyTextureRegion(context.list, &copy_dst, 0, 12, 0, &copy_src, &copy_box);
1667+
copy_src.pResource = image_u32;
1668+
ID3D12GraphicsCommandList_CopyTextureRegion(context.list, &copy_dst, 0, 16, 0, &copy_src, &copy_box);
1669+
copy_src.pResource = image_s32;
1670+
ID3D12GraphicsCommandList_CopyTextureRegion(context.list, &copy_dst, 0, 20, 0, &copy_src, &copy_box);
16381671

16391672
transition_resource_state(context.list, combined_image, D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_COPY_SOURCE);
16401673
get_texture_readback_with_command_list(combined_image, 0, &rb, context.queue, context.list);
@@ -1649,8 +1682,6 @@ void test_multisample_resolve_formats(void)
16491682

16501683
float got_d = get_readback_float(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top);
16511684
float got_f = get_readback_float(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 4);
1652-
uint32_t got_u = get_readback_uint(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 8, 0);
1653-
int32_t got_s = (int32_t)get_readback_uint(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 12, 0);
16541685

16551686
if (mode == D3D12_RESOLVE_MODE_AVERAGE)
16561687
expected_f += 1.5f / 64.0f;
@@ -1674,13 +1705,26 @@ void test_multisample_resolve_formats(void)
16741705

16751706
if (mode != D3D12_RESOLVE_MODE_AVERAGE)
16761707
{
1708+
uint32_t got_u = get_readback_uint(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 8, 0);
1709+
int32_t got_s = (int32_t)get_readback_uint(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 12, 0);
1710+
16771711
/* MIN/MAX resolves are broken on AMD and return the first sample */
16781712
bug_if(is_amd_windows_device(context.device))
16791713
ok(got_u == expected_u, "Got %u, expected %u at (%u,%u) for R32_UINT.\n",
16801714
got_u, expected_u, x, y);
16811715
bug_if(is_amd_windows_device(context.device))
16821716
ok(got_s == expected_s, "Got %d, expected %d at (%u,%u) for R32_SINT.\n",
16831717
got_s, expected_s, x, y);
1718+
1719+
got_u = get_readback_uint(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 16, 0);
1720+
got_s = (int32_t)get_readback_uint(&rb, x + dst_x - src_rect.left, y + dst_y - src_rect.top + 20, 0);
1721+
1722+
bug_if(is_amd_windows_device(context.device))
1723+
ok(got_u == expected_u, "Got %u, expected %u at (%u,%u) for R32_UINT (UAV).\n",
1724+
got_u, expected_u, x, y);
1725+
bug_if(is_amd_windows_device(context.device))
1726+
ok(got_s == expected_s, "Got %d, expected %d at (%u,%u) for R32_SINT (UAV).\n",
1727+
got_s, expected_s, x, y);
16841728
}
16851729
}
16861730
}
@@ -1716,6 +1760,8 @@ void test_multisample_resolve_formats(void)
17161760
transition_resource_state(context.list, rt_f32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
17171761
transition_resource_state(context.list, rt_u32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
17181762
transition_resource_state(context.list, rt_s32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
1763+
transition_resource_state(context.list, image_u32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_COPY_DEST);
1764+
transition_resource_state(context.list, image_s32, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_COPY_DEST);
17191765
transition_resource_state(context.list, ds, D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_DEPTH_WRITE);
17201766
}
17211767
}
@@ -1729,8 +1775,10 @@ void test_multisample_resolve_formats(void)
17291775
ID3D12Resource_Release(rt_f32_ms);
17301776
ID3D12Resource_Release(rt_u32);
17311777
ID3D12Resource_Release(rt_u32_ms);
1732-
ID3D12Resource_Release(rt_s32_ms);
17331778
ID3D12Resource_Release(rt_s32);
1779+
ID3D12Resource_Release(rt_s32_ms);
1780+
ID3D12Resource_Release(image_u32);
1781+
ID3D12Resource_Release(image_s32);
17341782
ID3D12Resource_Release(combined_image);
17351783

17361784
ID3D12PipelineState_Release(pso_setup_render_targets);

0 commit comments

Comments
 (0)