Directx 12: обмен графической c памятью между двумя процессами - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь создать два приложения. Одно приложение будет визуализировать текстуру вне экрана, а второе приложение будет считывать ее из памяти graphi c и отображать / представлять ее в окне.

Я сомневаюсь, можно ли разделить память graphi c в directx 12.

Мой метод именованной разделяемой памяти вызывает ошибку comptr addref ...

Я использую comptr для ID3D12Resource для данных текстуры ...

Итак как мы можем go продолжать с таким подходом ...

1 Ответ

2 голосов
/ 20 января 2020

Конечно можно рендерить в закадровую текстуру и отображать ее в другом процессе. Чтобы отобразить, вы можете позвонить 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 *.

...