Конечно можно рендерить в закадровую текстуру и отображать ее в другом процессе. Чтобы отобразить, вы можете позвонить CopyResource
или CopyTextureRegion
, чтобы скопировать общий ресурс в резервный буфер Swapchain
и затем представить его.
Я не уверен, что вы подразумеваете под named shared memory approach
, но чтобы обеспечить совместное использование памяти между процессами, вам необходимо:
В процессе A:
В процессе B:
Образец наброска быстро (создает буфер, но это не должно отличаться для текстур):
Microsoft::WRL::ComPtr<ID3D12Resource> ptr{};
if (isProcessA) {
HANDLE handle{};
throwIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES{D3D12_HEAP_TYPE_DEFAULT},
D3D12_HEAP_FLAG_SHARED,
&CD3DX12_RESOURCE_DESC::Buffer(1024),
D3D12_RESOURCE_STATE_COMMON,
nullptr,
IID_PPV_ARGS(&ptr)));
throwIfFailed(device->CreateSharedHandle(ptr.Get(), nullptr, GENERIC_ALL, L"Name", &handle));
} else {
HANDLE handle{};
throwIfFailed(device->OpenSharedHandleByName(L"Name", GENERIC_ALL, &handle));
throwIfFailed(device->OpenSharedHandle(handle, IID_PPV_ARGS(&ptr)));
}
Обратите внимание, что вы должны избегать коллизий значений Name
, передаваемых в ID3D12Device :: CreateCommittedResource .
Подробнее см. * 104 3 * * MSDN 1044 *.