Selaa lähdekoodia

win-capture: Refactor DX12 backbuffer code

It was undesirable to pass arrays via function parameters, so a
structure should be used instead.

Also increases total allowable backbuffers to 8.
jp9000 9 vuotta sitten
vanhempi
sitoutus
414ff5ba14
1 muutettua tiedostoa jossa 29 lisäystä ja 24 poistoa
  1. 29 24
      plugins/win-capture/graphics-hook/d3d12-capture.cpp

+ 29 - 24
plugins/win-capture/graphics-hook/d3d12-capture.cpp

@@ -10,6 +10,8 @@
 #include "dxgi-helpers.hpp"
 #include "../funchook.h"
 
+#define MAX_BACKBUFFERS 8
+
 struct d3d12_data {
 	ID3D12Device                   *device; /* do not release */
 	uint32_t                       base_cx;
@@ -29,7 +31,7 @@ struct d3d12_data {
 	union {
 		struct {
 			struct shtex_data      *shtex_info;
-			ID3D11Resource         *backbuffer11[3];
+			ID3D11Resource         *backbuffer11[MAX_BACKBUFFERS];
 			UINT                   backbuffer_count;
 			UINT                   cur_backbuffer;
 			ID3D11Texture2D        *copy_tex;
@@ -62,19 +64,24 @@ void d3d12_free(void)
 	hlog("----------------- d3d12 capture freed ----------------");
 }
 
-static bool create_d3d12_tex(ID3D12Resource *backbuffer[3], UINT count)
+struct bb_info {
+	ID3D12Resource *backbuffer[MAX_BACKBUFFERS];
+	UINT count;
+};
+
+static bool create_d3d12_tex(bb_info &bb)
 {
 	D3D11_RESOURCE_FLAGS rf11 = {};
 	HRESULT hr;
 
-	if (!count)
+	if (!bb.count)
 		return false;
 
-	data.backbuffer_count = count;
+	data.backbuffer_count = bb.count;
 
-	for (UINT i = 0; i < count; i++) {
+	for (UINT i = 0; i < bb.count; i++) {
 		hr = data.device11on12->CreateWrappedResource(
-				backbuffer[i],
+				bb.backbuffer[i],
 				&rf11,
 				D3D12_RESOURCE_STATE_COPY_SOURCE,
 				D3D12_RESOURCE_STATE_PRESENT,
@@ -104,7 +111,7 @@ static bool create_d3d12_tex(ID3D12Resource *backbuffer[3], UINT count)
 		return false;
 	}
 
-	for (UINT i = 0; i < count; i++) {
+	for (UINT i = 0; i < bb.count; i++) {
 		data.device11on12->ReleaseWrappedResources(
 				&data.backbuffer11[i], 1);
 	}
@@ -191,13 +198,12 @@ static bool d3d12_init_11on12(void)
 	return true;
 }
 
-static bool d3d12_shtex_init(HWND window, ID3D12Resource *backbuffer[3],
-		UINT count)
+static bool d3d12_shtex_init(HWND window, bb_info &bb)
 {
 	if (!d3d12_init_11on12()) {
 		return false;
 	}
-	if (!create_d3d12_tex(backbuffer, count)) {
+	if (!create_d3d12_tex(bb)) {
 		return false;
 	}
 	if (!capture_init_shtex(&data.shtex_info, window,
@@ -211,12 +217,11 @@ static bool d3d12_shtex_init(HWND window, ID3D12Resource *backbuffer[3],
 }
 
 static inline bool d3d12_init_format(IDXGISwapChain *swap, HWND &window,
-		ID3D12Resource *backbuffer[3], UINT *p_count)
+		bb_info &bb)
 {
 	DXGI_SWAP_CHAIN_DESC desc;
 	IDXGISwapChain3 *swap3;
 	HRESULT hr;
-	UINT count;
 
 	hr = swap->GetDesc(&desc);
 	if (FAILED(hr)) {
@@ -237,31 +242,32 @@ static inline bool d3d12_init_format(IDXGISwapChain *swap, HWND &window,
 		swap3->Release();
 	}
 
-	count = desc.SwapEffect == DXGI_SWAP_EFFECT_DISCARD
+	hlog("Buffer count: %d, swap effect: %d", (int)desc.BufferCount,
+			(int)desc.SwapEffect);
+
+	bb.count = desc.SwapEffect == DXGI_SWAP_EFFECT_DISCARD
 		? 1 : desc.BufferCount;
 
-	if (count > 3) {
+	if (bb.count > MAX_BACKBUFFERS) {
 		hlog("Somehow it's using more than the max backbuffers.  "
 				"Not sure why anyone would do that.");
-		count = 1;
+		bb.count = 1;
 		data.dxgi_1_4 = false;
 	}
 
-	for (UINT i = 0; i < count; i++) {
+	for (UINT i = 0; i < bb.count; i++) {
 		hr = swap->GetBuffer(i, __uuidof(ID3D12Resource),
-				(void**)&backbuffer[i]);
+				(void**)&bb.backbuffer[i]);
 		if (FAILED(hr)) {
 			if (i > 0) {
 				for (UINT j = 0; j < i; j++) {
-					backbuffer[j]->Release();
+					bb.backbuffer[j]->Release();
 				}
 			}
 			return false;
 		}
 	}
 
-	*p_count = count;
-
 	if (data.using_scale) {
 		data.cx = global_hook_info->cx;
 		data.cy = global_hook_info->cy;
@@ -274,11 +280,10 @@ static inline bool d3d12_init_format(IDXGISwapChain *swap, HWND &window,
 
 static void d3d12_init(IDXGISwapChain *swap)
 {
-	ID3D12Resource *backbuffer[3];
 	bool success = true;
+	bb_info bb = {};
 	HWND window;
 	HRESULT hr;
-	UINT count;
 
 	data.using_scale = global_hook_info->use_scale;
 
@@ -290,7 +295,7 @@ static void d3d12_init(IDXGISwapChain *swap)
 
 	data.device->Release();
 
-	if (!d3d12_init_format(swap, window, backbuffer, &count)) {
+	if (!d3d12_init_format(swap, window, bb)) {
 		return;
 	}
 	if (data.using_scale) {
@@ -302,7 +307,7 @@ static void d3d12_init(IDXGISwapChain *swap)
 					"unsupported; ignoring");
 		}
 
-		success = d3d12_shtex_init(window, backbuffer, count);
+		success = d3d12_shtex_init(window, bb);
 	}
 
 	if (!success)