From: Józef Kucia Subject: [PATCH vkd3d v2 3/6] vkd3d: Handle SINT and UINT formats in ClearRenderTargetView(). Message-Id: <20190717111737.874-3-joseph.kucia@gmail.com> Date: Wed, 17 Jul 2019 13:17:34 +0200 From: Jactry Zeng Signed-off-by: Jactry Zeng Signed-off-by: Józef Kucia --- libs/vkd3d/command.c | 24 +++++++++++++++- libs/vkd3d/utils.c | 40 ++++++++++++++++++++++++++ libs/vkd3d/vkd3d_private.h | 2 ++ tests/d3d12.c | 59 +++++++++++++++++--------------------- 4 files changed, 92 insertions(+), 33 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index eeae9cf4efe2..d620f9fd0f3c 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; + 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 (vk_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 (vk_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 5c8d3635b22c..d87349ab29a3 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 vk_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 vk_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 6e2dc2b2bb8e..79155768e2fe 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 vk_format_is_signed_integer(VkFormat format) DECLSPEC_HIDDEN; +bool vk_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 4223ec2c690d..c53d6053de1c 100644 --- a/tests/d3d12.c +++ b/tests/d3d12.c @@ -4329,15 +4329,14 @@ static void test_clear_depth_stencil_view(void) destroy_test_context(&context); } -#define test_clear_rtv_r8g8b8a8_2d(a, b, c, d, e, f, g) test_clear_rtv_r8g8b8a8_2d_(__LINE__, a, b, c, d, e, f, g) +#define test_clear_rtv_r8g8b8a8_2d(a, b, c, d, e, f) test_clear_rtv_r8g8b8a8_2d_(__LINE__, a, b, c, d, e, f) static void test_clear_rtv_r8g8b8a8_2d_(unsigned int line, const struct test_context *context, ID3D12Resource *resource, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, - const float *color, unsigned int expected, unsigned int max_diff, bool is_todo) + const float *color, unsigned int expected, unsigned int max_diff) { ID3D12GraphicsCommandList_ClearRenderTargetView(context->list, rtv_handle, color, 0, NULL); transition_resource_state(context->list, resource, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE); - todo_if(is_todo) check_sub_resource_uint_(line, resource, 0, context->queue, context->list, expected, max_diff); reset_command_list(context->list, context->allocator); @@ -4345,16 +4344,14 @@ static void test_clear_rtv_r8g8b8a8_2d_(unsigned int line, const struct test_con D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); } -#define test_clear_rtv_r16g16b16a16_2d(a, b, c, d, e, f, g) test_clear_rtv_r16g16b16a16_2d_(__LINE__, a, b, c, d, e, f, g) +#define test_clear_rtv_r16g16b16a16_2d(a, b, c, d, e) test_clear_rtv_r16g16b16a16_2d_(__LINE__, a, b, c, d, e) static void test_clear_rtv_r16g16b16a16_2d_(unsigned int line, const struct test_context *context, - ID3D12Resource *resource, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, - const float *color, uint64_t expected, unsigned int max_diff, bool is_todo) + ID3D12Resource *resource, D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle, const float *color, uint64_t expected) { ID3D12GraphicsCommandList_ClearRenderTargetView(context->list, rtv_handle, color, 0, NULL); transition_resource_state(context->list, resource, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE); - todo_if(is_todo) - check_sub_resource_uint64_(line, resource, 0, context->queue, context->list, expected, max_diff); + check_sub_resource_uint64_(line, resource, 0, context->queue, context->list, expected, 0); reset_command_list(context->list, context->allocator); transition_resource_state(context->list, resource, @@ -4395,7 +4392,6 @@ static void test_clear_render_target_view(void) const float *color; unsigned int expected; unsigned int max_diff; - bool is_todo; } test_r8g8b8a8_unorm[] = { @@ -4404,21 +4400,20 @@ static void test_clear_render_target_view(void) }, test_r8g8b8a8_uint[] = { - {green, 0x01000100, 0, true}, - {color, 0x00000000, 0, true}, - {negative_value, 0x00000001, 0, true}, + {green, 0x01000100, 0}, + {color, 0x00000000, 0}, + {negative_value, 0x00000001, 0}, }, test_r8g8b8a8_sint[] = { - {green, 0x01000100, 0, true}, - {color, 0x00000000, 0, true}, - {negative_value, 0xfe00ff01, 0, true}, + {green, 0x01000100, 0}, + {color, 0x00000000, 0}, + {negative_value, 0xfe00ff01, 0}, }; static const struct { const float *color; uint64_t expected; - bool is_todo; } test_r16g16b16a16_unorm[] = { @@ -4426,15 +4421,15 @@ static void test_clear_render_target_view(void) }, test_r16g16b16a16_uint[] = { - {green, 0x0010000, true}, - {color, 0x00000000, true}, - {negative_value, 0x00000001, true}, + {green, 0x0010000}, + {color, 0x00000000}, + {negative_value, 0x00000001}, }, test_r16g16b16a16_sint[] = { - {green, 0x0010000, true}, - {color, 0x00000000, true}, - {negative_value, 0xfffe0000ffff0001, true}, + {green, 0x0010000}, + {color, 0x00000000}, + {negative_value, 0xfffe0000ffff0001}, }; STATIC_ASSERT(ARRAY_SIZE(array_colors) == ARRAY_SIZE(array_expected_colors)); @@ -4487,14 +4482,14 @@ static void test_clear_render_target_view(void) { vkd3d_test_set_context("Test %u", i); test_clear_rtv_r8g8b8a8_2d(&context, resource, rtv_handle, test_r8g8b8a8_unorm[i].color, - test_r8g8b8a8_unorm[i].expected, test_r8g8b8a8_unorm[i].max_diff, test_r8g8b8a8_unorm[i].is_todo); + test_r8g8b8a8_unorm[i].expected, test_r8g8b8a8_unorm[i].max_diff); } vkd3d_test_set_context(NULL); /* sRGB view */ rtv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; ID3D12Device_CreateRenderTargetView(device, resource, &rtv_desc, rtv_handle); - test_clear_rtv_r8g8b8a8_2d(&context, resource, rtv_handle, color, 0xbf95bc59, 2, false); + test_clear_rtv_r8g8b8a8_2d(&context, resource, rtv_handle, color, 0xbf95bc59, 2); /* DXGI_FORMAT_R8G8B8A8_UINT view */ rtv_desc.Format = DXGI_FORMAT_R8G8B8A8_UINT; @@ -4503,7 +4498,7 @@ static void test_clear_render_target_view(void) { vkd3d_test_set_context("Test %u", i); test_clear_rtv_r8g8b8a8_2d(&context, resource, rtv_handle, test_r8g8b8a8_uint[i].color, - test_r8g8b8a8_uint[i].expected, test_r8g8b8a8_uint[i].max_diff, test_r8g8b8a8_uint[i].is_todo); + test_r8g8b8a8_uint[i].expected, test_r8g8b8a8_uint[i].max_diff); } vkd3d_test_set_context(NULL); @@ -4514,7 +4509,7 @@ static void test_clear_render_target_view(void) { vkd3d_test_set_context("Test %u", i); test_clear_rtv_r8g8b8a8_2d(&context, resource, rtv_handle, test_r8g8b8a8_sint[i].color, - test_r8g8b8a8_sint[i].expected, test_r8g8b8a8_sint[i].max_diff, test_r8g8b8a8_sint[i].is_todo); + test_r8g8b8a8_sint[i].expected, test_r8g8b8a8_sint[i].max_diff); } vkd3d_test_set_context(NULL); @@ -4537,8 +4532,8 @@ static void test_clear_render_target_view(void) for (i = 0; i < ARRAY_SIZE(test_r16g16b16a16_unorm); i++) { vkd3d_test_set_context("Test %u", i); - test_clear_rtv_r16g16b16a16_2d(&context, resource, rtv_handle, test_r16g16b16a16_unorm[i].color, - test_r16g16b16a16_unorm[i].expected, 0, test_r16g16b16a16_unorm[i].is_todo); + test_clear_rtv_r16g16b16a16_2d(&context, resource, rtv_handle, + test_r16g16b16a16_unorm[i].color, test_r16g16b16a16_unorm[i].expected); } vkd3d_test_set_context(NULL); @@ -4548,8 +4543,8 @@ static void test_clear_render_target_view(void) for (i = 0; i < ARRAY_SIZE(test_r16g16b16a16_uint); i++) { vkd3d_test_set_context("Test %u", i); - test_clear_rtv_r16g16b16a16_2d(&context, resource, rtv_handle, test_r16g16b16a16_uint[i].color, - test_r16g16b16a16_uint[i].expected, 0, test_r16g16b16a16_uint[i].is_todo); + test_clear_rtv_r16g16b16a16_2d(&context, resource, rtv_handle, + test_r16g16b16a16_uint[i].color, test_r16g16b16a16_uint[i].expected); } vkd3d_test_set_context(NULL); @@ -4559,8 +4554,8 @@ static void test_clear_render_target_view(void) for (i = 0; i < ARRAY_SIZE(test_r16g16b16a16_sint); i++) { vkd3d_test_set_context("Test %u", i); - test_clear_rtv_r16g16b16a16_2d(&context, resource, rtv_handle, test_r16g16b16a16_sint[i].color, - test_r16g16b16a16_sint[i].expected, 0, test_r16g16b16a16_sint[i].is_todo); + test_clear_rtv_r16g16b16a16_2d(&context, resource, rtv_handle, + test_r16g16b16a16_sint[i].color, test_r16g16b16a16_sint[i].expected); } vkd3d_test_set_context(NULL); -- 2.21.0