[PATCH vkd3d 3/3] vkd3d: Handle SINT and UINT format in ClearRenderTargetView().

Jactry Zeng jzeng at codeweavers.com
Tue Jul 16 02:46:27 CDT 2019


Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
---
 libs/vkd3d/command.c       | 24 ++++++++++++++++++++++-
 libs/vkd3d/utils.c         | 40 ++++++++++++++++++++++++++++++++++++++
 libs/vkd3d/vkd3d_private.h |  2 ++
 tests/d3d12.c              | 24 +++++++++++------------
 4 files changed, 77 insertions(+), 13 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index eeae9cf..12eea0e 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -4631,11 +4631,11 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearDepthStencilView(ID3D12Gra
 static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12GraphicsCommandList1 *iface,
         D3D12_CPU_DESCRIPTOR_HANDLE rtv, const FLOAT color[4], UINT rect_count, const D3D12_RECT *rects)
 {
-    const union VkClearValue clear_value = {{{color[0], color[1], color[2], color[3]}}};
     struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList1(iface);
     const struct d3d12_rtv_desc *rtv_desc = d3d12_rtv_desc_from_cpu_handle(rtv);
     struct VkAttachmentDescription attachment_desc;
     struct VkAttachmentReference color_reference;
+    union VkClearValue clear_value;
 
     TRACE("iface %p, rtv %#lx, color %p, rect_count %u, rects %p.\n",
             iface, rtv.ptr, color, rect_count, rects);
@@ -4655,6 +4655,28 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearRenderTargetView(ID3D12Gra
     color_reference.attachment = 0;
     color_reference.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
 
+    if (vkd3d_format_is_signed_integer(rtv_desc->format))
+    {
+        clear_value.color.uint32[0] = color[0];
+        clear_value.color.uint32[1] = color[1];
+        clear_value.color.uint32[2] = color[2];
+        clear_value.color.uint32[3] = color[3];
+    }
+    else if (vkd3d_format_is_unsigned_integer(rtv_desc->format))
+    {
+        clear_value.color.uint32[0] = max(0, color[0]);
+        clear_value.color.uint32[1] = max(0, color[1]);
+        clear_value.color.uint32[2] = max(0, color[2]);
+        clear_value.color.uint32[3] = max(0, color[3]);
+    }
+    else
+    {
+        clear_value.color.float32[0] = color[0];
+        clear_value.color.float32[1] = color[1];
+        clear_value.color.float32[2] = color[2];
+        clear_value.color.float32[3] = color[3];
+    }
+
     d3d12_command_list_clear(list, &attachment_desc, &color_reference, NULL,
             rtv_desc->view, rtv_desc->width, rtv_desc->height, rtv_desc->layer_count,
             &clear_value, rect_count, rects);
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
index 5c8d363..f41d5bb 100644
--- a/libs/vkd3d/utils.c
+++ b/libs/vkd3d/utils.c
@@ -262,6 +262,46 @@ bool dxgi_format_is_typeless(DXGI_FORMAT dxgi_format)
     }
 }
 
+bool vkd3d_format_is_signed_integer(VkFormat format)
+{
+    switch (format)
+    {
+        case VK_FORMAT_R32G32B32A32_SINT:
+        case VK_FORMAT_R16G16B16A16_SINT:
+        case VK_FORMAT_R32G32B32_SINT:
+        case VK_FORMAT_R8G8B8A8_SINT:
+        case VK_FORMAT_R32G32_SINT:
+        case VK_FORMAT_R16G16_SINT:
+        case VK_FORMAT_R8G8_SINT:
+        case VK_FORMAT_R32_SINT:
+        case VK_FORMAT_R16_SINT:
+        case VK_FORMAT_R8_SINT:
+            return true;
+        default:
+            return false;
+    }
+}
+
+bool vkd3d_format_is_unsigned_integer(VkFormat format)
+{
+    switch (format)
+    {
+        case VK_FORMAT_R32G32B32A32_UINT:
+        case VK_FORMAT_R16G16B16A16_UINT:
+        case VK_FORMAT_R32G32B32_UINT:
+        case VK_FORMAT_R8G8B8A8_UINT:
+        case VK_FORMAT_R32G32_UINT:
+        case VK_FORMAT_R16G16_UINT:
+        case VK_FORMAT_R8G8_UINT:
+        case VK_FORMAT_R32_UINT:
+        case VK_FORMAT_R16_UINT:
+        case VK_FORMAT_R8_UINT:
+            return true;
+        default:
+            return false;
+    }
+}
+
 DXGI_FORMAT vkd3d_get_dxgi_format(VkFormat format)
 {
     DXGI_FORMAT dxgi_format;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 6e2dc2b..9fc3abb 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -1123,6 +1123,8 @@ HRESULT vkd3d_init_depth_stencil_formats(struct d3d12_device *device) DECLSPEC_H
 void vkd3d_cleanup_depth_stencil_formats(struct d3d12_device *device) DECLSPEC_HIDDEN;
 
 bool dxgi_format_is_typeless(DXGI_FORMAT dxgi_format) DECLSPEC_HIDDEN;
+bool vkd3d_format_is_signed_integer(VkFormat format) DECLSPEC_HIDDEN;
+bool vkd3d_format_is_unsigned_integer(VkFormat format) DECLSPEC_HIDDEN;
 
 static inline const struct vkd3d_format *vkd3d_format_from_d3d12_resource_desc(
         const struct d3d12_device *device, const D3D12_RESOURCE_DESC *desc, DXGI_FORMAT view_format)
diff --git a/tests/d3d12.c b/tests/d3d12.c
index 09cd884..9837184 100644
--- a/tests/d3d12.c
+++ b/tests/d3d12.c
@@ -4406,15 +4406,15 @@ static void test_clear_render_target_view(void)
     },
     test_r8g8b8a8_uint[] =
     {
-        {green, 0, 0x01000100, true},
-        {color, 0, 0x00000000, true},
-        {negative_value, 0, 0x00000001, true},
+        {green, 0, 0x01000100, false},
+        {color, 0, 0x00000000, false},
+        {negative_value, 0, 0x00000001, false},
     },
     test_r8g8b8a8_sint[] =
     {
-        {green, 0, 0x01000100, true},
-        {color, 0, 0x00000000, true},
-        {negative_value, 0, 0xfe00ff01, true},
+        {green, 0, 0x01000100, false},
+        {color, 0, 0x00000000, false},
+        {negative_value, 0, 0xfe00ff01, false},
     };
     static const struct
     {
@@ -4430,15 +4430,15 @@ static void test_clear_render_target_view(void)
     },
     test_r16g16b16a16_uint[] =
     {
-        {green, 0, 0x0010000, true},
-        {color, 0, 0x00000000, true},
-        {negative_value, 0, 0x00000001, true},
+        {green, 0, 0x0010000, false},
+        {color, 0, 0x00000000, false},
+        {negative_value, 0, 0x00000001, false},
     },
     test_r16g16b16a16_sint[] =
     {
-        {green, 0, 0x0010000, true},
-        {color, 0, 0x00000000, true},
-        {negative_value, 0, 0xfffe0000ffff0001, true},
+        {green, 0, 0x0010000, false},
+        {color, 0, 0x00000000, false},
+        {negative_value, 0, 0xfffe0000ffff0001, false},
     };
 
     STATIC_ASSERT(ARRAY_SIZE(array_colors) == ARRAY_SIZE(array_expected_colors));
-- 
2.20.1




More information about the wine-devel mailing list