我试图用cuda处理从相机中检索到的帧。为此,我试图将GL_TEXTURE_2D
处理成另一个(我应用LUT)。我的主要问题是,我完全迷失了我应该用来做互操作的东西。
因为有许多不同的功能,有些是不推荐的,有些则不是。但是我的CUDA计算很老(3.0)所以我应该使用旧的吗?
目前,我正在关注SDI指南捕获:http://international.download.nvidia.com/quadro/product-literature/programmers-guides/PG-03776-001_v05.pdf
以下是我目前的情况:
这是我使用视频捕获的主循环,以及所有CUDA操作(使用cu对象)
int C_anccap::LoopAnimation()
{
MSG msg;
wglMakeCurrent(m_hDC, m_hRC);
cu->InitProcess(this->m_SDIin.GetTextureObjectHandle(0));
bool test = false;
// Animation loop.
while (!C_anccap::exit) {
if (this->CaptureVideo() != GL_FAILURE_NV)
{
cu->ProcessVideo(this->m_SDIin.GetTextureObjectHandle(0));
this->DisplayVideo();
if (this->rec[0].isStarted) {
glGetTexImage(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA, GL_UNSIGNED_BYTE, this->rec[0].pixels);
}
Sleep(16.6);
}
}
cu->ClearProcess(this->m_SDIin.GetTextureObjectHandle(0));
this->Shutdown();
wglMakeCurrent(NULL, NULL);
return FALSE;
}
这里有cu.cpp所有的CUDA功能:
extern "C" __global__ void cuda_Recons20to16_ZMWIR(unsigned char *src, uint16_t *buf16, int len)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int n = index * 3;
int m = index / 427;
n = n - m;
unsigned char res;
unsigned char res0, res1, res2;
unsigned char pix_src, tmp1, tmp2;
if (index < len)
{
pix_src = src[index];
src[index] = src[index + 10];
src[index + 10] = pix_src;
}
}
bool CUGL::done = false;
CUGL::~CUGL() {
cudaFree(d_buf16);
}
CUGL::CUGL()
{
if (!CUGL::done) {
size_t size_buf16 = 427 * 720 * sizeof(uint16_t);
cudaMalloc((void **)&d_buf16, size_buf16);
/*cudaError_t err = cudaSetDevice(0);
gpuErrchk(err);
err = cudaGLSetGLDevice(0);
gpuErrchk(err);*/
//CUGL::done = true;
}
}
void CUGL::InitProcess(GLuint buf)
{
if (!CUGL::done) {
CUdevice cuDevice;
CUcontext cuContext;
int selectedDevice = 0;
CUresult err = cuDeviceGet(&cuDevice, selectedDevice);
cuCtxCreate_v2(&cuContext, CU_CTX_MAP_HOST | CU_CTX_BLOCKING_SYNC, cuDevice);
cudaError_t cerr = cudaGraphicsGLRegisterBuffer(&CudaHandle, buf, cudaGraphicsMapFlagsNone);
gpuErrchk(cerr);
}
}
void CUGL::ClearProcess(GLuint buf)
{
//call only once
cudaError_t cerr = cudaGLUnregisterBufferObject(buf);
gpuErrchk(cerr);
}
void CUGL::ProcessVideo(GLuint buf)
{
if (!CUGL::done) {
unsigned char *dptr;
cudaError_t cerr = cudaGraphicsMapResources(1, &CudaHandle,0);
size_t num_bytes;
cudaGraphicsResourceGetMappedPointer((void**)&dptr, &num_bytes, CudaHandle);
//call kernel
cuda_Recons20to16_ZMWIR << <427, 720 >> > (dptr, d_buf16, 427 * 720/3);
//call every frame
cerr = cudaGraphicsUnmapResources(1,&CudaHandle,0);
}
}
如果您对如何继续的好教程或想法有任何建议。我拿了它。 如果你没有得到某些东西,请不要犹豫,我会跟着我的主题。 谢谢!
EDIT 我用cudagraphicmapresource编辑了我的代码,并且我试图通过修改内核中的纹理来获得视觉反馈。但是当我在openGL中显示它时,我没有看到任何修改。还有其他需要吗?