HRESULT CoreWindowNativeWindow::createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain) { if (device == NULL || factory == NULL || swapChain == NULL || width == 0 || height == 0) { return E_INVALIDARG; } DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; swapChainDesc.Width = mRotationFlags ? height : width; swapChainDesc.Height = mRotationFlags ? width : height; swapChainDesc.Format = format; swapChainDesc.Stereo = FALSE; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER; swapChainDesc.BufferCount = 2; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChainDesc.Scaling = DXGI_SCALING_STRETCH; *swapChain = nullptr; ComPtr<IDXGISwapChain1> newSwapChain; HRESULT result = factory->CreateSwapChainForCoreWindow(device, mCoreWindow.Get(), &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf()); if (SUCCEEDED(result)) { #if 0 //(WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) // Qt: allow Windows Phone to resize, but don't modify the backing texture in the swap chain. // Test if swapchain supports resize. On Windows Phone devices, this will return DXGI_ERROR_UNSUPPORTED. On // other devices DXGI_ERROR_INVALID_CALL should be returned because the combination of flags passed // (DXGI_SWAP_CHAIN_FLAG_NONPREROTATED | DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE) are invalid flag combinations. if (newSwapChain->ResizeBuffers(swapChainDesc.BufferCount, swapChainDesc.Width, swapChainDesc.Height, swapChainDesc.Format, DXGI_SWAP_CHAIN_FLAG_NONPREROTATED | DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE) == DXGI_ERROR_UNSUPPORTED) { mSupportsSwapChainResize = false; } #endif // (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP) result = newSwapChain.CopyTo(swapChain); } if (SUCCEEDED(result)) { // If automatic swapchain resize behaviors have been disabled, then // unregister for the resize change events. if (mSupportsSwapChainResize == false) { unregisterForSizeChangeEvents(); } } return result; }
HRESULT CoreWindowNativeWindow::createSwapChain(ID3D11Device *device, IDXGIFactory2 *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, bool containsAlpha, IDXGISwapChain1 **swapChain) { if (device == nullptr || factory == nullptr || swapChain == nullptr || width == 0 || height == 0) { return E_INVALIDARG; } DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; swapChainDesc.Width = width; swapChainDesc.Height = height; swapChainDesc.Format = format; swapChainDesc.Stereo = FALSE; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER; swapChainDesc.BufferCount = 2; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChainDesc.Scaling = DXGI_SCALING_STRETCH; swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; *swapChain = nullptr; ComPtr<IDXGISwapChain1> newSwapChain; HRESULT result = factory->CreateSwapChainForCoreWindow(device, mCoreWindow.Get(), &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf()); if (SUCCEEDED(result)) { result = newSwapChain.CopyTo(swapChain); } if (SUCCEEDED(result)) { // If automatic swapchain resize behaviors have been disabled, then // unregister for the resize change events. if (mSupportsSwapChainResize == false) { unregisterForSizeChangeEvents(); } } return result; }
CoreWindowNativeWindow::~CoreWindowNativeWindow() { unregisterForSizeChangeEvents(); }
SwapChainPanelNativeWindow::~SwapChainPanelNativeWindow() { unregisterForSizeChangeEvents(); }
HRESULT SwapChainPanelNativeWindow::createSwapChain(ID3D11Device *device, DXGIFactory *factory, DXGI_FORMAT format, unsigned int width, unsigned int height, DXGISwapChain **swapChain) { if (device == NULL || factory == NULL || swapChain == NULL || width == 0 || height == 0) { return E_INVALIDARG; } DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; swapChainDesc.Width = width; swapChainDesc.Height = height; swapChainDesc.Format = format; swapChainDesc.Stereo = FALSE; swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_BACK_BUFFER; swapChainDesc.BufferCount = 2; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChainDesc.Scaling = DXGI_SCALING_STRETCH; swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; *swapChain = nullptr; ComPtr<IDXGISwapChain1> newSwapChain; ComPtr<ISwapChainPanelNative> swapChainPanelNative; RECT currentPanelSize = {}; HRESULT result = factory->CreateSwapChainForComposition(device, &swapChainDesc, nullptr, newSwapChain.ReleaseAndGetAddressOf()); if (SUCCEEDED(result)) { result = mSwapChainPanel.As(&swapChainPanelNative); } if (SUCCEEDED(result)) { result = swapChainPanelNative->SetSwapChain(newSwapChain.Get()); } if (SUCCEEDED(result)) { // The swapchain panel host requires an instance of the swapchain set on the SwapChainPanel // to perform the runtime-scale behavior. This swapchain is cached here because there are // no methods for retreiving the currently configured on from ISwapChainPanelNative. mSwapChain = newSwapChain; result = newSwapChain.CopyTo(swapChain); } // If the host is responsible for scaling the output of the swapchain, then // scale it now before returning an instance to the caller. This is done by // first reading the current size of the swapchain panel, then scaling if (SUCCEEDED(result) && mRequiresSwapChainScaling) { result = GetSwapChainPanelSize(mSwapChainPanel, ¤tPanelSize); } // Scale the swapchain to fit inside the contents of the panel. if (SUCCEEDED(result) && mRequiresSwapChainScaling) { SIZE currentSize = { currentPanelSize.right, currentPanelSize.bottom }; result = scaleSwapChain(currentSize); } if (SUCCEEDED(result)) { // If automatic swapchain resize behaviors have been disabled, then // unregister for the resize change events. if (mSupportsSwapChainResize == false) { unregisterForSizeChangeEvents(); } } return result; }