[PATCH] mfplat/tests: Add a test for buffers created for d3d12 resources.

Nikolay Sivov nsivov at codeweavers.com
Thu Dec 2 12:23:43 CST 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplat/tests/mfplat.c | 92 ++++++++++++++++++++++++++++++++++----
 1 file changed, 84 insertions(+), 8 deletions(-)

diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index cec27c2c23f..cee90567084 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -6558,6 +6558,8 @@ static ID3D12Device *create_d3d12_device(void)
     ID3D12Device *device;
     HRESULT hr;
 
+    if (!pD3D12CreateDevice) return NULL;
+
     hr = pD3D12CreateDevice(NULL, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device);
     if (FAILED(hr))
         return NULL;
@@ -6565,7 +6567,7 @@ static ID3D12Device *create_d3d12_device(void)
     return device;
 }
 
-static void test_dxgi_surface_buffer(void)
+static void test_d3d11_surface_buffer(void)
 {
     DWORD max_length, cur_length, length, color;
     IMFDXGIBuffer *dxgi_buffer;
@@ -6791,6 +6793,72 @@ static void test_dxgi_surface_buffer(void)
     ID3D11Device_Release(device);
 }
 
+static void test_d3d12_surface_buffer(void)
+{
+    IMFDXGIBuffer *dxgi_buffer;
+    D3D12_HEAP_PROPERTIES heap_props;
+    D3D12_RESOURCE_DESC desc;
+    ID3D12Resource *resource;
+    IMFMediaBuffer *buffer;
+    unsigned int refcount;
+    ID3D12Device *device;
+    IUnknown *obj;
+    HRESULT hr;
+
+    /* d3d12 */
+    if (!(device = create_d3d12_device()))
+    {
+        skip("Failed to create a D3D12 device, skipping tests.\n");
+        return;
+    }
+
+    memset(&heap_props, 0, sizeof(heap_props));
+    heap_props.Type = D3D12_HEAP_TYPE_DEFAULT;
+
+    memset(&desc, 0, sizeof(desc));
+    desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
+    desc.Alignment = 0;
+    desc.Width = 32;
+    desc.Height = 32;
+    desc.DepthOrArraySize = 1;
+    desc.MipLevels = 1;
+    desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+    desc.SampleDesc.Count = 1;
+    desc.SampleDesc.Quality = 0;
+    desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
+    desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET;
+
+    hr = ID3D12Device_CreateCommittedResource(device, &heap_props, D3D12_HEAP_FLAG_NONE,
+            &desc, D3D12_RESOURCE_STATE_RENDER_TARGET, NULL, &IID_ID3D12Resource, (void **)&resource);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D12Resource, (IUnknown *)resource, 0, FALSE, &buffer);
+todo_wine
+    ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr);
+
+if (SUCCEEDED(hr))
+{
+    check_interface(buffer, &IID_IMF2DBuffer, TRUE);
+    check_interface(buffer, &IID_IMF2DBuffer2, TRUE);
+    check_interface(buffer, &IID_IMFDXGIBuffer, TRUE);
+    check_interface(buffer, &IID_IMFGetService, FALSE);
+
+    hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer);
+    ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr);
+
+    hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D12Resource, (void **)&obj);
+    ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr);
+    ok(obj == (IUnknown *)resource, "Unexpected resource pointer.\n");
+    IUnknown_Release(obj);
+
+    IMFDXGIBuffer_Release(dxgi_buffer);
+    IMFMediaBuffer_Release(buffer);
+}
+    ID3D12Resource_Release(resource);
+    refcount = ID3D12Device_Release(device);
+    ok(!refcount, "Unexpected device refcount %u.\n", refcount);
+}
+
 static void test_sample_allocator_sysmem(void)
 {
     IMFVideoSampleAllocatorNotify test_notify = { &test_notify_callback_vtbl };
@@ -7335,7 +7403,9 @@ static void test_sample_allocator_d3d11(void)
 static void test_sample_allocator_d3d12(void)
 {
     IMFVideoSampleAllocator *allocator;
+    D3D12_HEAP_PROPERTIES heap_props;
     IMFDXGIDeviceManager *manager;
+    D3D12_HEAP_FLAGS heap_flags;
     IMFDXGIBuffer *dxgi_buffer;
     IMFMediaType *video_type;
     ID3D12Resource *resource;
@@ -7346,12 +7416,6 @@ static void test_sample_allocator_d3d12(void)
     IMFSample *sample;
     HRESULT hr;
 
-    if (!pD3D12CreateDevice)
-    {
-        skip("Missing d3d12 support, some tests will be skipped.\n");
-        return;
-    }
-
     if (!(device = create_d3d12_device()))
     {
         skip("Failed to create a D3D12 device, skipping tests.\n");
@@ -7411,6 +7475,14 @@ todo_wine
     ok(!desc.Layout, "Unexpected layout %u.\n", desc.Layout);
     ok(!desc.Flags, "Unexpected flags %#x.\n", desc.Flags);
 
+    hr = ID3D12Resource_GetHeapProperties(resource, &heap_props, &heap_flags);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(heap_props.Type == D3D12_HEAP_TYPE_DEFAULT, "Unexpected heap type %u.\n", heap_props.Type);
+    ok(heap_props.CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_UNKNOWN, "Unexpected page property %u.\n",
+            heap_props.CPUPageProperty);
+    ok(!heap_props.MemoryPoolPreference, "Unexpected pool preference %u.\n", heap_props.MemoryPoolPreference);
+    ok(heap_flags == D3D12_HEAP_FLAG_ALLOW_ONLY_NON_RT_DS_TEXTURES, "Unexpected heap flags %#x.\n", heap_flags);
+
     ID3D12Resource_Release(resource);
     IMFDXGIBuffer_Release(dxgi_buffer);
     IMFSample_Release(sample);
@@ -7656,6 +7728,9 @@ START_TEST(mfplat)
     if (!pMFCreateVideoSampleAllocatorEx)
         win_skip("MFCreateVideoSampleAllocatorEx() is not available. Some tests will be skipped.\n");
 
+    if (!pD3D12CreateDevice)
+        skip("Missing d3d12 support, some tests will be skipped.\n");
+
     CoInitialize(NULL);
 
     test_startup();
@@ -7703,7 +7778,8 @@ START_TEST(mfplat)
     test_MFCreateTrackedSample();
     test_MFFrameRateToAverageTimePerFrame();
     test_MFMapDXGIFormatToDX9Format();
-    test_dxgi_surface_buffer();
+    test_d3d11_surface_buffer();
+    test_d3d12_surface_buffer();
     test_sample_allocator_sysmem();
     test_sample_allocator_d3d9();
     test_sample_allocator_d3d11();
-- 
2.33.0




More information about the wine-devel mailing list