У меня есть конвейер постобработки, который использует вычислительный шейдер для обработки текстуры и записи ее в RWByteAddressBuffer.
Затем содержимое RWByteAddressBuffer отправляется на устройство FPGA через прямой доступ к памяти (AMD DirectGMAтехнология).Это означает, что я инициирую внешнее устройство для доступа к физическим байтам этого буфера без API Direct3D, зная об этом.
Вот суть кода:
_context->CSSetShaderResources(0,1,_nonMsaaSrv.GetAddressOf());
_context->CSSetUnorderedAccessViews(0, 1, _unorderedAccessView.GetAddressOf(),nullptr);
_context->CSSetShader(_converter.Get(),0,0);
_context->Dispatch(1920, 1200, 1);
// ... wait for direct3d compute shader to finish processing?
// send the bytes to the fpga:
_dmaController->StartDMA(_d3dBufferPhysicalAddress, fpgaLogicalAddress);
Все работает, ноПроблема в том, что я не смог найти способ заблокировать поток или получить событие, которое указывает, что вычислительный шейдер завершил свою работу на графическом процессоре.
Этот вопрос предлагает решение, использующее ID3D11Query длясделать какой-то опрос.но я понимаю, что это просто занятое ожидание .Я надеялся найти лучшее решение, которое могло бы позволить потоку блокироваться, ожидая какого-то события.С такими API, как Cuda / OpenCL, это довольно тривиально.
Так можно ли сделать ожидание блокировки для вычислительного шейдера в direct3D 11?если так как?