1
0
Эх сурвалжийг харах

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.
jpark37 6 жил өмнө
parent
commit
4da73445c3

+ 36 - 8
libobs-d3d11/d3d11-subsystem.cpp

@@ -70,18 +70,41 @@ gs_obj::~gs_obj()
 		next->prev_next = prev_next;
 		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));
 	memset(&desc, 0, sizeof(desc));
-	desc.BufferCount = data->num_backbuffers;
-	desc.BufferDesc.Format = ConvertGSTextureFormat(data->format);
 	desc.BufferDesc.Width = data->cx;
 	desc.BufferDesc.Width = data->cx;
 	desc.BufferDesc.Height = data->cy;
 	desc.BufferDesc.Height = data->cy;
+	desc.BufferDesc.Format = ConvertGSTextureFormat(data->format);
+	desc.SampleDesc.Count = 1;
 	desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
 	desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+	desc.BufferCount = num_backbuffers;
 	desc.OutputWindow = (HWND)data->window.hwnd;
 	desc.OutputWindow = (HWND)data->window.hwnd;
-	desc.SampleDesc.Count = 1;
 	desc.Windowed = true;
 	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)
 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;
 	HRESULT hr;
 
 
-	make_swap_desc(swapDesc, data);
+	make_swap_desc_win10(swapDesc, data);
 	hr = device->factory->CreateSwapChain(device->device, &swapDesc,
 	hr = device->factory->CreateSwapChain(device->device, &swapDesc,
 					      swap.Assign());
 					      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 */
 	/* Ignore Alt+Enter */
 	device->factory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER);
 	device->factory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER);

+ 0 - 3
libobs/graphics/graphics.c

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