graphics: libobs-d3d11: Use DXGI_SWAP_EFFECT_FLIP_DISCARD on Windows 10

This is supposed to eliminate a copy by DWM with extra benefits for
borderless fullsceen, which should help the fullscreen projector.
master
jpark37 2019-09-05 22:46:00 -07:00
parent 2ae9d6f683
commit 4da73445c3
2 changed files with 37 additions and 12 deletions

View File

@ -70,18 +70,41 @@ gs_obj::~gs_obj()
next->prev_next = prev_next;
}
static inline void make_swap_desc(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data)
static inline void make_swap_desc_common(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data,
UINT num_backbuffers,
DXGI_SWAP_EFFECT effect)
{
memset(&desc, 0, sizeof(desc));
desc.BufferCount = data->num_backbuffers;
desc.BufferDesc.Format = ConvertGSTextureFormat(data->format);
desc.BufferDesc.Width = data->cx;
desc.BufferDesc.Height = data->cy;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.OutputWindow = (HWND)data->window.hwnd;
desc.BufferDesc.Format = ConvertGSTextureFormat(data->format);
desc.SampleDesc.Count = 1;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.BufferCount = num_backbuffers;
desc.OutputWindow = (HWND)data->window.hwnd;
desc.Windowed = true;
desc.SwapEffect = effect;
}
static inline void make_swap_desc_win7(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data)
{
UINT num_backbuffers = data->num_backbuffers;
if (num_backbuffers == 0)
num_backbuffers = 1;
make_swap_desc_common(desc, data, num_backbuffers,
DXGI_SWAP_EFFECT_DISCARD);
}
static inline void make_swap_desc_win10(DXGI_SWAP_CHAIN_DESC &desc,
const gs_init_data *data)
{
UINT num_backbuffers = data->num_backbuffers;
if (num_backbuffers == 0)
num_backbuffers = 2;
make_swap_desc_common(desc, data, num_backbuffers,
DXGI_SWAP_EFFECT_FLIP_DISCARD);
}
void gs_swap_chain::InitTarget(uint32_t cx, uint32_t cy)
@ -166,11 +189,16 @@ gs_swap_chain::gs_swap_chain(gs_device *device, const gs_init_data *data)
{
HRESULT hr;
make_swap_desc(swapDesc, data);
make_swap_desc_win10(swapDesc, data);
hr = device->factory->CreateSwapChain(device->device, &swapDesc,
swap.Assign());
if (FAILED(hr))
throw HRError("Failed to create swap chain", hr);
if (FAILED(hr)) {
make_swap_desc_win7(swapDesc, data);
hr = device->factory->CreateSwapChain(device->device, &swapDesc,
swap.Assign());
if (FAILED(hr))
throw HRError("Failed to create swap chain", hr);
}
/* Ignore Alt+Enter */
device->factory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER);

View File

@ -1272,9 +1272,6 @@ gs_swapchain_t *gs_swapchain_create(const struct gs_init_data *data)
if (!gs_valid_p("gs_swapchain_create", data))
return NULL;
if (new_data.num_backbuffers == 0)
new_data.num_backbuffers = 1;
return graphics->exports.device_swapchain_create(graphics->device,
&new_data);
}