Beispiel #1
0
HRESULT WrappedIDXGIFactory2::staticCreateSwapChainForCoreWindow( IDXGIFactory2 *factory,
        IUnknown *pDevice,
        IUnknown *pWindow,
        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
        IDXGIOutput *pRestrictToOutput,
        IDXGISwapChain1 **ppSwapChain)
{
    if(WrappedID3D11Device::IsAlloc(pDevice) ||
            WrappedIDXGIDevice::IsAlloc(pDevice) ||
            WrappedIDXGIDevice1::IsAlloc(pDevice) ||
            WrappedIDXGIDevice2::IsAlloc(pDevice) ||
            WrappedIDXGIDevice3::IsAlloc(pDevice)
      )
    {
        WrappedID3D11Device *wrapDevice = (WrappedID3D11Device *)pDevice;

        if(WrappedIDXGIDevice::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice *)(IDXGIDevice *)pDevice)->GetD3DDevice();
        if(WrappedIDXGIDevice1::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice1 *)(IDXGIDevice1 *)pDevice)->GetD3DDevice();
        if(WrappedIDXGIDevice2::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice2 *)(IDXGIDevice2 *)pDevice)->GetD3DDevice();
        if(WrappedIDXGIDevice3::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice3 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice();

        if(!RenderDoc::Inst().GetCaptureOptions().AllowFullscreen)
        {
            RDCWARN("Impossible to disallow fullscreen on call to CreateSwapChainForCoreWindow");
        }

        HRESULT ret = factory->CreateSwapChainForCoreWindow(wrapDevice->GetReal(), pWindow, pDesc, pRestrictToOutput, ppSwapChain);

        if(SUCCEEDED(ret))
        {
            HWND wnd = NULL;
            (*ppSwapChain)->GetHwnd(&wnd);
            *ppSwapChain = new WrappedIDXGISwapChain2(*ppSwapChain, wnd, wrapDevice);
        }

        return ret;
    }
    else
    {
        RDCERR("Creating swap chain with non-hooked device!");
    }

    return factory->CreateSwapChainForCoreWindow(pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain);
}
Beispiel #2
0
HRESULT WrappedIDXGIFactory::staticCreateSwapChain(IDXGIFactory *factory,
	IUnknown *pDevice,
	DXGI_SWAP_CHAIN_DESC *pDesc,
	IDXGISwapChain **ppSwapChain)
{
	if(WrappedID3D11Device::IsAlloc(pDevice) ||
		WrappedIDXGIDevice::IsAlloc(pDevice) ||
		WrappedIDXGIDevice1::IsAlloc(pDevice)
#if defined(INCLUDE_DXGI_1_2)
		|| WrappedIDXGIDevice2::IsAlloc(pDevice)
		|| WrappedIDXGIDevice3::IsAlloc(pDevice)
#endif
		)
	{
		WrappedID3D11Device *wrapDevice = (WrappedID3D11Device *)pDevice;
		
		if(WrappedIDXGIDevice::IsAlloc(pDevice))
			wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice *)(IDXGIDevice *)pDevice)->GetD3DDevice();
		if(WrappedIDXGIDevice1::IsAlloc(pDevice))
			wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice1 *)(IDXGIDevice1 *)pDevice)->GetD3DDevice();
#if defined(INCLUDE_DXGI_1_2)
		if(WrappedIDXGIDevice2::IsAlloc(pDevice))
			wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice2 *)(IDXGIDevice2 *)pDevice)->GetD3DDevice();
		if(WrappedIDXGIDevice3::IsAlloc(pDevice))
			wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice3 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice();
#endif

		if(!RenderDoc::Inst().GetCaptureOptions().AllowFullscreen && pDesc)
		{
			pDesc->Windowed = TRUE;
		}

		HRESULT ret = factory->CreateSwapChain(wrapDevice->GetReal(), pDesc, ppSwapChain);
	
		if(SUCCEEDED(ret))
			*ppSwapChain = new WrappedIDXGISwapChain2(*ppSwapChain, pDesc ? pDesc->OutputWindow : NULL, wrapDevice);

		return ret;
	}
	else
	{
		RDCERR("Creating swap chain with non-hooked device!");
	}

	return factory->CreateSwapChain(pDevice, pDesc, ppSwapChain);
}
Beispiel #3
0
HRESULT WrappedIDXGIFactory2::staticCreateSwapChainForHwnd( IDXGIFactory2 *factory,
        IUnknown *pDevice,
        HWND hWnd,
        const DXGI_SWAP_CHAIN_DESC1 *pDesc,
        const DXGI_SWAP_CHAIN_FULLSCREEN_DESC *pFullscreenDesc,
        IDXGIOutput *pRestrictToOutput,
        IDXGISwapChain1 **ppSwapChain)
{
    if(WrappedID3D11Device::IsAlloc(pDevice) ||
            WrappedIDXGIDevice::IsAlloc(pDevice) ||
            WrappedIDXGIDevice1::IsAlloc(pDevice) ||
            WrappedIDXGIDevice2::IsAlloc(pDevice) ||
            WrappedIDXGIDevice3::IsAlloc(pDevice)
      )
    {
        WrappedID3D11Device *wrapDevice = (WrappedID3D11Device *)pDevice;

        if(WrappedIDXGIDevice::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice *)(IDXGIDevice *)pDevice)->GetD3DDevice();
        if(WrappedIDXGIDevice1::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice1 *)(IDXGIDevice1 *)pDevice)->GetD3DDevice();
        if(WrappedIDXGIDevice2::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice2 *)(IDXGIDevice2 *)pDevice)->GetD3DDevice();
        if(WrappedIDXGIDevice3::IsAlloc(pDevice))
            wrapDevice = (WrappedID3D11Device *)((WrappedIDXGIDevice3 *)(IDXGIDevice3 *)pDevice)->GetD3DDevice();

        if(!RenderDoc::Inst().GetCaptureOptions().AllowFullscreen && pFullscreenDesc)
        {
            pFullscreenDesc = NULL;
        }

        HRESULT ret = factory->CreateSwapChainForHwnd(wrapDevice->GetReal(), hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain);

        if(SUCCEEDED(ret))
            *ppSwapChain = new WrappedIDXGISwapChain2(*ppSwapChain, hWnd, wrapDevice);

        return ret;
    }
    else
    {
        RDCERR("Creating swap chain with non-hooked device!");
    }

    return factory->CreateSwapChainForHwnd(pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain);
}