0

I'm trying to initialize Direct3D and Direct2D in my code, but I'm encountering an issue when trying to obtain the IDXGIDevice interface from my ID3D12Device8 interface. When I attempt to query the interface, it returns the HRESULT E_NOINTERFACE, indicating that the interface is not supported. However, I need the IDXGIDevice interface to create a Direct2D device.

Here's a snippet of my code:

        ID3D12Device8* device = nullptr;
    IDXGIDevice* dxgiDevice = nullptr;

    ID2D1Device* d2dDevice = nullptr;
    ID2D1DeviceContext* d2dContext = nullptr;

    IDXGIFactory7* dxgiFactory = nullptr;
    ID2D1Factory* d2dFactory = nullptr;
    IDXGIAdapter4* dxgiAdapter = nullptr;
    DXGI_ADAPTER_DESC1 g_adapterDesc{};

    DescriptorHeap g_rtvHeap;
    DescriptorHeap g_dsvHeap;
    DescriptorHeap g_srvHeap;
    DescriptorHeap g_uavHeap;

    void Initialize()
    {
        THROW_IF_FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED));
        THROW_IF_FAILED(MFStartup(MF_VERSION) == S_OK);
#ifdef _DEBUG
        {
            ID3D12Debug* debugController;
            D3D12GetDebugInterface(IID_PPV_ARGS(&debugController));
            debugController->EnableDebugLayer();
        }
#endif
        if (device)
            Shutdown();
        {
            // Create factory
            THROW_IF_FAILED(CreateDXGIFactory2(0, IID_PPV_ARGS(&dxgiFactory)));
            // Enumerate adapters and find suitable
            IDXGIAdapter1* adapter1 = nullptr;
            for (UINT i = 0; dxgiFactory->EnumAdapters1(i, &adapter1) != DXGI_ERROR_NOT_FOUND; ++i)
            {
                // Check if adapter supports d3d12
                if (SUCCEEDED(D3D12CreateDevice(adapter1, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device))))
                {       
                    THROW_IF_FAILED(adapter1->QueryInterface(IID_PPV_ARGS(&dxgiAdapter))); // Get adapter
                    break;
                }
            }
        }
        //auto ii = GetDXGIDevice(device);

        SET_NAME(device, L"MAIN_DEVICE");

        new (&g_rtvHeap) DescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_RTV, D3D12_DESCRIPTOR_HEAP_FLAG_NONE, 128);
        new (&g_dsvHeap) DescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_DSV, D3D12_DESCRIPTOR_HEAP_FLAG_NONE, 128);
        new (&g_srvHeap) DescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, 128);
        new (&g_uavHeap) DescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, 128);

        THROW_IF_FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2dFactory));
        D2D1_CREATION_PROPERTIES d2dCreationProps = { D2D1_THREADING_MODE_SINGLE_THREADED, D2D1_DEBUG_LEVEL_INFORMATION };
                device->QueryInterface(IID_PPV_ARGS(&dxgiDevice));
        D2D1CreateDevice(dxgiDevice, &d2dCreationProps, &d2dDevice);
    }

I've verified that the ID3D12Device8 interface is successfully created and that the DXGI factory and adapter are also obtained without any errors. However, when I call QueryInterface on the adapter to obtain the IDXGIDevice interface, it fails with the E_NOINTERFACE HRESULT.

I would appreciate any insights into why I'm unable to retrieve the IDXGIDevice interface from the ID3D12Device8 interface and how I can resolve this issue. Thank you!

Simon Mourier
  • 132,049
  • 21
  • 248
  • 298
glack66
  • 11
  • 1
  • 2
    This is not supported with Direct3D12 https://stackoverflow.com/questions/40416714/cant-acquire-idxgidevice-or-idxgidevice1-from-id3d12device-in-dx12 https://gamedev.stackexchange.com/a/132981/137062 https://walbourn.github.io/anatomy-of-direct3d-12-create-device/ depending on what you need to do (like Direct2D), it may be simpler to use Direct3D11. – Simon Mourier Jun 27 '23 at 06:39

0 Answers0