@@ -1220,7 +1220,7 @@ void test_multisample_resolve(void)
1220
1220
1221
1221
void test_multisample_resolve_formats (void )
1222
1222
{
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 ;
1224
1224
ID3D12PipelineState * pso_setup_render_targets , * pso_setup_stencil ;
1225
1225
ID3D12RootSignature * rs_setup_render_targets , * rs_setup_stencil ;
1226
1226
D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle , dsv_handle ;
@@ -1426,6 +1426,17 @@ void test_multisample_resolve_formats(void)
1426
1426
NULL , & IID_ID3D12Resource , (void * * )& rt_s32 );
1427
1427
ok (hr == S_OK , "Failed to create render target, hr %#x.\n" );
1428
1428
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
+
1429
1440
resource_desc .Alignment = D3D12_DEFAULT_MSAA_RESOURCE_PLACEMENT_ALIGNMENT ;
1430
1441
resource_desc .Format = DXGI_FORMAT_D32_FLOAT_S8X24_UINT ;
1431
1442
resource_desc .SampleDesc .Count = 4 ;
@@ -1450,7 +1461,7 @@ void test_multisample_resolve_formats(void)
1450
1461
resource_desc .Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D ;
1451
1462
resource_desc .Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT ;
1452
1463
resource_desc .Width = 4 ;
1453
- resource_desc .Height = 16 ;
1464
+ resource_desc .Height = 24 ;
1454
1465
resource_desc .DepthOrArraySize = 1 ;
1455
1466
resource_desc .MipLevels = 1 ;
1456
1467
resource_desc .Format = DXGI_FORMAT_R32_TYPELESS ;
@@ -1561,10 +1572,19 @@ void test_multisample_resolve_formats(void)
1561
1572
D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL , 1.0f , 0xff , 0 , NULL );
1562
1573
1563
1574
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 );
1566
1577
transition_resource_state (context .list , ds , D3D12_RESOURCE_STATE_DEPTH_WRITE , D3D12_RESOURCE_STATE_RESOLVE_DEST );
1567
1578
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
+
1568
1588
if (j )
1569
1589
{
1570
1590
dst_x = 1 ;
@@ -1604,11 +1624,20 @@ void test_multisample_resolve_formats(void)
1604
1624
ID3D12GraphicsCommandList1_ResolveSubresourceRegion (command_list1 ,
1605
1625
ds , 1 , dst_x , dst_y , ds_ms , 1 , j ? & src_rect : NULL ,
1606
1626
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 );
1607
1634
}
1608
1635
1609
1636
transition_resource_state (context .list , rt_f32 , D3D12_RESOURCE_STATE_RESOLVE_DEST , D3D12_RESOURCE_STATE_COPY_SOURCE );
1610
1637
transition_resource_state (context .list , rt_u32 , D3D12_RESOURCE_STATE_RESOLVE_DEST , D3D12_RESOURCE_STATE_COPY_SOURCE );
1611
1638
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 );
1612
1641
transition_resource_state (context .list , ds , D3D12_RESOURCE_STATE_RESOLVE_DEST , D3D12_RESOURCE_STATE_COPY_SOURCE );
1613
1642
1614
1643
copy_box .left = 0 ;
@@ -1635,6 +1664,10 @@ void test_multisample_resolve_formats(void)
1635
1664
ID3D12GraphicsCommandList_CopyTextureRegion (context .list , & copy_dst , 0 , 8 , 0 , & copy_src , & copy_box );
1636
1665
copy_src .pResource = rt_s32 ;
1637
1666
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 );
1638
1671
1639
1672
transition_resource_state (context .list , combined_image , D3D12_RESOURCE_STATE_COPY_DEST , D3D12_RESOURCE_STATE_COPY_SOURCE );
1640
1673
get_texture_readback_with_command_list (combined_image , 0 , & rb , context .queue , context .list );
@@ -1649,8 +1682,6 @@ void test_multisample_resolve_formats(void)
1649
1682
1650
1683
float got_d = get_readback_float (& rb , x + dst_x - src_rect .left , y + dst_y - src_rect .top );
1651
1684
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 );
1654
1685
1655
1686
if (mode == D3D12_RESOLVE_MODE_AVERAGE )
1656
1687
expected_f += 1.5f / 64.0f ;
@@ -1674,13 +1705,26 @@ void test_multisample_resolve_formats(void)
1674
1705
1675
1706
if (mode != D3D12_RESOLVE_MODE_AVERAGE )
1676
1707
{
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
+
1677
1711
/* MIN/MAX resolves are broken on AMD and return the first sample */
1678
1712
bug_if (is_amd_windows_device (context .device ))
1679
1713
ok (got_u == expected_u , "Got %u, expected %u at (%u,%u) for R32_UINT.\n" ,
1680
1714
got_u , expected_u , x , y );
1681
1715
bug_if (is_amd_windows_device (context .device ))
1682
1716
ok (got_s == expected_s , "Got %d, expected %d at (%u,%u) for R32_SINT.\n" ,
1683
1717
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 );
1684
1728
}
1685
1729
}
1686
1730
}
@@ -1716,6 +1760,8 @@ void test_multisample_resolve_formats(void)
1716
1760
transition_resource_state (context .list , rt_f32 , D3D12_RESOURCE_STATE_COPY_SOURCE , D3D12_RESOURCE_STATE_RENDER_TARGET );
1717
1761
transition_resource_state (context .list , rt_u32 , D3D12_RESOURCE_STATE_COPY_SOURCE , D3D12_RESOURCE_STATE_RENDER_TARGET );
1718
1762
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 );
1719
1765
transition_resource_state (context .list , ds , D3D12_RESOURCE_STATE_COPY_SOURCE , D3D12_RESOURCE_STATE_DEPTH_WRITE );
1720
1766
}
1721
1767
}
@@ -1729,8 +1775,10 @@ void test_multisample_resolve_formats(void)
1729
1775
ID3D12Resource_Release (rt_f32_ms );
1730
1776
ID3D12Resource_Release (rt_u32 );
1731
1777
ID3D12Resource_Release (rt_u32_ms );
1732
- ID3D12Resource_Release (rt_s32_ms );
1733
1778
ID3D12Resource_Release (rt_s32 );
1779
+ ID3D12Resource_Release (rt_s32_ms );
1780
+ ID3D12Resource_Release (image_u32 );
1781
+ ID3D12Resource_Release (image_s32 );
1734
1782
ID3D12Resource_Release (combined_image );
1735
1783
1736
1784
ID3D12PipelineState_Release (pso_setup_render_targets );
0 commit comments