From 353c7f76715a37e45ff63df8dbb35ff2b657ae26 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Sun, 26 Apr 2020 12:52:50 +0100 Subject: [PATCH] [tests] Add D3D9 swapchain refcounting tests --- tests/d3d9/test_d3d9_triangle.cpp | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/d3d9/test_d3d9_triangle.cpp b/tests/d3d9/test_d3d9_triangle.cpp index 5e6bc8b4..81549d0c 100644 --- a/tests/d3d9/test_d3d9_triangle.cpp +++ b/tests/d3d9/test_d3d9_triangle.cpp @@ -116,6 +116,44 @@ public: nullptr, &m_device); + // Funny Swapchain Refcounting + // "One of the things COM does really well, is lifecycle management" + // Implicit Swapchain + { + IDirect3DSurface9* pSurface1 = nullptr; + IDirect3DSurface9* pSurface2 = nullptr; + status = m_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface1); + D3DPRESENT_PARAMETERS newParams = params; + newParams.BackBufferWidth = 10; + newParams.BackBufferHeight = 10; + status = m_device->Reset(&newParams); + status = m_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface2); + + IDirect3DSwapChain9* pSwapChain2 = nullptr; + IDirect3DSwapChain9* pSwapChain3 = nullptr; + status = pSurface1->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast(&pSwapChain2)); + status = pSurface2->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast(&pSwapChain3)); + + printf("E_NOINTERFACE! for pSwapchain2"); + status = m_device->Reset(¶ms); + } + // Additional swapchain + { + IDirect3DSwapChain9* pSwapChain2 = nullptr; + IDirect3DSwapChain9* pSwapChain3 = nullptr; + IDirect3DSwapChain9* pSwapChain4 = nullptr; + IDirect3DSurface9* pSurface = nullptr; + status = m_device->CreateAdditionalSwapChain(¶ms, &pSwapChain2); + status = pSwapChain2->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurface); + status = pSurface->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast(&pSwapChain3)); + pSwapChain2->Release(); + UINT count = pSwapChain2->Release(); + printf("Count: %u - Should be 0 and swapchain dead!", count); + status = pSurface->GetContainer(__uuidof(IDirect3DSwapChain9), reinterpret_cast(&pSwapChain4)); + // E_NOINTERFACE ! + printf("E_NOINTERFACE!"); + } + m_device->AddRef(); Com backbuffer;