Я пытаюсь захватывать кадры рабочего стола, используя Desktop Duplication API, и кодировать их сразу с помощью NvPipe, не обращаясь к процессору с пикселями.
Есть ли способ использовать данные ID3D11Texture2D в качестве входных данных для NvPipe или какой-нибудь другой эффективный способ сделать это? Я работаю над решением для виртуальной реальности, для которого требуется как можно более низкая задержка, поэтому даже сэкономленные 1 мс имеют большое значение.
Редактировать: После следующих рекомендаций @Soonts я получил этот код, который, похоже, не работает:
cudaArray *array;
m_DeviceContext->CopySubresourceRegion(CopyBuffer, 0, 0, 0, 0, m_SharedSurf, 0, Box);
cudaError_t err = cudaGraphicsD3D11RegisterResource(&_cudaResource, CopyBuffer, cudaGraphicsRegisterFlagsNone);
err = cudaGraphicsResourceSetMapFlags(_cudaResource, cudaGraphicsMapFlagsReadOnly);
cudaStream_t cuda_stream;
cudaStreamCreate(&cuda_stream);
err = cudaGraphicsMapResources(1, &_cudaResource, cuda_stream);
err = cudaGraphicsSubResourceGetMappedArray(&array, _cudaResource, 0, 0);
uint64_t compressedSize = NvPipe_Encode(encoder, array, dataPitch, buffer.data(), buffer.size(), width, height, false);
NvPipe_Encode приводит к нарушению доступа к памяти и ничего не делает. Я не знаю, на каком этапе я ошибаюсь, так как я не могу найти какую-либо документацию о каких-либо функциях или переменных / структурах в Интернете, и размещение наблюдений за переменными не показывает никакой ценной информации, кроме их адреса в памяти.