Example #1
0
SwapChain::SwapChain(Device& device, Window& window)
    : device_(device),
      window_(window)
{
    MEMBER_LOG_STRING_TAG(L"SwapChain");

    MEMBER_LOG << L"Initializing for window: " << window_.GetWindowProperties().name;

    dxgiSwapChainDesc_.BufferDesc.Width = window.GetWindowProperties().dimensions.GetHeight();
    dxgiSwapChainDesc_.BufferDesc.Height = window.GetWindowProperties().dimensions.GetWidth();
    
    // TODO: Add custom refresh rate
    dxgiSwapChainDesc_.BufferDesc.RefreshRate.Numerator = 0;
    dxgiSwapChainDesc_.BufferDesc.RefreshRate.Denominator = 0;

    // TODO: Add custom formatting
    dxgiSwapChainDesc_.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    dxgiSwapChainDesc_.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
    dxgiSwapChainDesc_.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

    // TODO: Add multi sampling options
    dxgiSwapChainDesc_.SampleDesc.Count = 1;
    dxgiSwapChainDesc_.SampleDesc.Quality = 0;

    dxgiSwapChainDesc_.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    dxgiSwapChainDesc_.BufferCount = 2;
    dxgiSwapChainDesc_.OutputWindow = window.GetHWnd();

    // Set this to true now, change actual fullscreen state on resize
    dxgiSwapChainDesc_.Windowed = TRUE;
    dxgiSwapChainDesc_.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    dxgiSwapChainDesc_.Flags = 0;

    e_throw_com_ret_error(device.GetDXGIFactory()
        .CreateSwapChain(&device.GetD3DDevice(),
                          &dxgiSwapChainDesc_,
                          ReceiveCOM(dxgiSwapChain_)), "IDXGIFactory::CreateSwapChain");

    // Finish setup in Resize
    Resize(window.GetWindowProperties().dimensions);
}