if (FAILED(Swapchain->swapchain->GetDevice(__uuidof(ID3D11Device), (void**)&Device))) {
log_error("failed to get device from swapchain");
assert(false);
}
else
Device->GetImmediateContext(&DeviceContext);
static const auto GetCorrectDXGIFormat = [](DXGI_FORMAT format) {
switch (format) {
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
return DXGI_FORMAT_R8G8B8A8_UNORM;
}
return format;
};
DXGI_SWAP_CHAIN_DESC sd;
Swapchain->swapchain->GetDesc(&sd);
ID3D11Texture2D* BackBuffer = nullptr;
if (SUCCEEDED(Swapchain->swapchain->GetBuffer(0, IID_PPV_ARGS(&BackBuffer)))) {
if (BackBuffer) {
D3D11_RENDER_TARGET_VIEW_DESC desc{};
desc.Format = static_cast<DXGI_FORMAT>(GetCorrectDXGIFormat(sd.BufferDesc.Format));
desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
if (FAILED(Device->CreateRenderTargetView(BackBuffer, &desc, &RenderTarget))) {
log_error("failed to create rendertargetview, retrying..");
desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
if (FAILED(Device->CreateRenderTargetView(BackBuffer, &desc, &RenderTarget))) {
log_error("failed to create rendertargetview, retrying..");
if (FAILED(Device->CreateRenderTargetView(BackBuffer, &desc, &RenderTarget))) {
log_error("failed to create rendertargetview");
assert(false);
}
}
}
BackBuffer->Release();
BackBuffer = nullptr;
}
}