=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3d12/tests: Add visual test for rendering to swapchain.
Alexandre Julliard
julliard at winehq.org
Fri Jun 1 18:19:54 CDT 2018
Module: wine
Branch: master
Commit: a77b93c4d796fc78aabf78e589c380a98ca725b7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a77b93c4d796fc78aabf78e589c380a98ca725b7
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Jun 1 12:45:11 2018 +0200
d3d12/tests: Add visual test for rendering to swapchain.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d3d12/tests/Makefile.in | 2 +-
dlls/d3d12/tests/d3d12.c | 96 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 96 insertions(+), 2 deletions(-)
diff --git a/dlls/d3d12/tests/Makefile.in b/dlls/d3d12/tests/Makefile.in
index d055aba..b3406f9 100644
--- a/dlls/d3d12/tests/Makefile.in
+++ b/dlls/d3d12/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = d3d12.dll
-IMPORTS = d3d12
+IMPORTS = d3d12 dxgi user32
C_SRCS = \
d3d12.c
diff --git a/dlls/d3d12/tests/d3d12.c b/dlls/d3d12/tests/d3d12.c
index 27a6b27..c8f17f3 100644
--- a/dlls/d3d12/tests/d3d12.c
+++ b/dlls/d3d12/tests/d3d12.c
@@ -237,7 +237,7 @@ static void create_render_target_(unsigned int line, struct test_context *contex
resource_desc.Height = 32;
resource_desc.DepthOrArraySize = 1;
resource_desc.MipLevels = 1;
- resource_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+ resource_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
resource_desc.SampleDesc.Count = 1;
resource_desc.SampleDesc.Quality = 0;
resource_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
@@ -443,6 +443,46 @@ static ID3D12Resource *create_readback_buffer_(unsigned int line, ID3D12Device *
D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE, D3D12_RESOURCE_STATE_COPY_DEST);
}
+static HWND create_window(DWORD style)
+{
+ return CreateWindowA("static", "d3d12_test", style, 0, 0, 256, 256, NULL, NULL, NULL, NULL);
+}
+
+static IDXGISwapChain3 *create_swapchain(ID3D12CommandQueue *queue, HWND window,
+ unsigned int width, unsigned int height)
+{
+ IDXGISwapChain1 *swapchain1;
+ DXGI_SWAP_CHAIN_DESC1 desc;
+ IDXGISwapChain3 *swapchain;
+ IDXGIFactory4 *factory;
+ HRESULT hr;
+
+ hr = CreateDXGIFactory2(0, &IID_IDXGIFactory4, (void **)&factory);
+ ok(hr == S_OK, "Failed to create factory, hr %#x.\n", hr);
+
+ desc.Width = width;
+ desc.Height = height;
+ desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+ desc.Stereo = FALSE;
+ desc.SampleDesc.Count = 1;
+ desc.SampleDesc.Quality = 0;
+ desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+ desc.BufferCount = 2;
+ desc.Scaling = DXGI_SCALING_STRETCH;
+ desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
+ desc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
+ desc.Flags = 0;
+ hr = IDXGIFactory4_CreateSwapChainForHwnd(factory, (IUnknown *)queue, window, &desc, NULL, NULL, &swapchain1);
+ ok(hr == S_OK, "Failed to create swapchain, hr %#x.\n", hr);
+
+ IDXGIFactory4_Release(factory);
+
+ hr = IDXGISwapChain1_QueryInterface(swapchain1, &IID_IDXGISwapChain3, (void **)&swapchain);
+ ok(hr == S_OK, "Failed to query IDXGISwapChain3, hr %#x.\n", hr);
+ IDXGISwapChain1_Release(swapchain1);
+ return swapchain;
+}
+
struct resource_readback
{
unsigned int width;
@@ -651,8 +691,62 @@ static void test_draw(void)
destroy_test_context(&context);
}
+static void test_swapchain_draw(void)
+{
+ static const float white[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ ID3D12GraphicsCommandList *command_list;
+ struct test_context context;
+ ID3D12Resource *backbuffer;
+ IDXGISwapChain3 *swapchain;
+ ID3D12CommandQueue *queue;
+ unsigned int index;
+ ULONG refcount;
+ HWND window;
+ HRESULT hr;
+ RECT rect;
+ BOOL ret;
+
+ if (!init_test_context(&context))
+ return;
+ command_list = context.list;
+ queue = context.queue;
+
+ window = create_window(0);
+ ret = GetClientRect(window, &rect);
+ ok(ret, "Failed to get client rect.\n");
+ set_viewport(&context.viewport, 0.0f, 0.0f, rect.right, rect.bottom, 0.0f, 1.0f);
+ swapchain = create_swapchain(queue, window, rect.right, rect.bottom);
+ index = IDXGISwapChain3_GetCurrentBackBufferIndex(swapchain);
+ hr = IDXGISwapChain3_GetBuffer(swapchain, index, &IID_ID3D12Resource, (void **)&backbuffer);
+ ok(hr == S_OK, "Failed to get swapchain buffer %u, hr %#x.\n", index, hr);
+ ID3D12Device_CreateRenderTargetView(context.device, backbuffer, NULL, context.rtv);
+
+ 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, &rect);
+ ID3D12GraphicsCommandList_DrawInstanced(command_list, 3, 1, 0, 0);
+
+ transition_sub_resource_state(command_list, backbuffer, 0,
+ D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE);
+
+ check_sub_resource_uint(backbuffer, 0, queue, command_list, 0xff00ff00, 0);
+
+ refcount = ID3D12Resource_Release(backbuffer);
+ ok(!refcount, "Backbuffer has %u references left.\n", refcount);
+ refcount = IDXGISwapChain3_Release(swapchain);
+ ok(!refcount, "Swapchain has %u references left.\n", refcount);
+ DestroyWindow(window);
+ destroy_test_context(&context);
+}
+
START_TEST(d3d12)
{
test_interfaces();
test_draw();
+ test_swapchain_draw();
}
More information about the wine-cvs
mailing list