|
|
@@ -20,7 +20,6 @@ typedef HRESULT(STDMETHODCALLTYPE *PFN_ExecuteCommandLists)(
|
|
|
static PFN_ExecuteCommandLists RealExecuteCommandLists = nullptr;
|
|
|
|
|
|
struct d3d12_data {
|
|
|
- ID3D12Device *device; /* do not release */
|
|
|
uint32_t cx;
|
|
|
uint32_t cy;
|
|
|
DXGI_FORMAT format;
|
|
|
@@ -144,7 +143,7 @@ static bool create_d3d12_tex(bb_info &bb)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static bool d3d12_init_11on12(void)
|
|
|
+static bool d3d12_init_11on12(ID3D12Device *device)
|
|
|
{
|
|
|
static HMODULE d3d11 = nullptr;
|
|
|
static PFN_D3D11ON12_CREATE_DEVICE create_11_on_12 = nullptr;
|
|
|
@@ -192,7 +191,7 @@ static bool d3d12_init_11on12(void)
|
|
|
hlog("d3d12_init_11on12: creating 11 device without swap queue");
|
|
|
}
|
|
|
|
|
|
- hr = create_11_on_12(data.device, 0, nullptr, 0, queues, num_queues, 0,
|
|
|
+ hr = create_11_on_12(device, 0, nullptr, 0, queues, num_queues, 0,
|
|
|
&data.device11, &data.context11, nullptr);
|
|
|
|
|
|
if (FAILED(hr)) {
|
|
|
@@ -210,9 +209,9 @@ static bool d3d12_init_11on12(void)
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static bool d3d12_shtex_init(HWND window, bb_info &bb)
|
|
|
+static bool d3d12_shtex_init(ID3D12Device *device, HWND window, bb_info &bb)
|
|
|
{
|
|
|
- if (!d3d12_init_11on12()) {
|
|
|
+ if (!d3d12_init_11on12(device)) {
|
|
|
return false;
|
|
|
}
|
|
|
if (!create_d3d12_tex(bb)) {
|
|
|
@@ -285,29 +284,28 @@ static inline bool d3d12_init_format(IDXGISwapChain *swap, HWND &window,
|
|
|
|
|
|
static void d3d12_init(IDXGISwapChain *swap)
|
|
|
{
|
|
|
- bb_info bb = {};
|
|
|
- HWND window;
|
|
|
- HRESULT hr;
|
|
|
+ ID3D12Device *device = nullptr;
|
|
|
+ const HRESULT hr = swap->GetDevice(IID_PPV_ARGS(&device));
|
|
|
+ if (SUCCEEDED(hr)) {
|
|
|
+ hlog("d3d12_init: device=0x%" PRIX64,
|
|
|
+ (uint64_t)(uintptr_t)device);
|
|
|
+
|
|
|
+ HWND window;
|
|
|
+ bb_info bb = {};
|
|
|
+ if (d3d12_init_format(swap, window, bb)) {
|
|
|
+ if (global_hook_info->force_shmem) {
|
|
|
+ hlog("d3d12_init: shared memory capture currently "
|
|
|
+ "unsupported; ignoring");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!d3d12_shtex_init(device, window, bb))
|
|
|
+ d3d12_free();
|
|
|
+ }
|
|
|
|
|
|
- hr = swap->GetDevice(__uuidof(ID3D12Device), (void **)&data.device);
|
|
|
- if (FAILED(hr)) {
|
|
|
+ device->Release();
|
|
|
+ } else {
|
|
|
hlog_hr("d3d12_init: failed to get device from swap", hr);
|
|
|
- return;
|
|
|
}
|
|
|
-
|
|
|
- data.device->Release();
|
|
|
-
|
|
|
- if (!d3d12_init_format(swap, window, bb)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (global_hook_info->force_shmem) {
|
|
|
- hlog("d3d12_init: shared memory capture currently "
|
|
|
- "unsupported; ignoring");
|
|
|
- }
|
|
|
-
|
|
|
- if (!d3d12_shtex_init(window, bb))
|
|
|
- d3d12_free();
|
|
|
}
|
|
|
|
|
|
static inline void d3d12_copy_texture(ID3D11Resource *dst, ID3D11Resource *src)
|