CUDA和openGL之间的互操作性

时间:2017-07-18 08:43:34

标签: c++ opengl cuda interop

我试图用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中显示它时,我没有看到任何修改。还有其他需要吗?

0 个答案:

没有答案