GL-CL-Interop:测试纹理完整性

时间:2012-01-26 15:06:02

标签: opengl opencl nvidia

编辑:根据建议,我将纹理目标更改为GL_TEXTURE_2D。所以初始化现在看起来像这样:

void initTexture( int width, int height )
{
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width,
            height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);
}

由于它是GL_TEXTURE_2D,因此需要定义mipmap。应该如何反映OpenCL Image2D的初始化?

texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex, &err));

但我仍然得到CL_INVALID_GL_OBJECT。所以问题仍然是:如何在初始化OpenCL Image2D时检查纹理完整性?


以前的方法:

我正在使用 avcodec 解码视频文件。结果是AVFrame。我可以在GL_TEXTURE_RECTANGLE_ARB上显示帧。

这是gl(glew)背景初始化后纹理初始化的摘录:

GLuint tex = 0;

void initTexture( int width, int height )
{
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB8, width,
            height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
}

现在我想将tex分配给Image2DGL以获取OpenCL和OpenGL之间的互操作。我使用的是Nvidia Geforce 310M,Cuda Toolkit 4. OpenGL版本为3.3.0,GLX版本为1.4。

texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_WRITE, GL_TEXTURE_RECTANGLE_ARB, 0, tex, &err));

这回复了:

clCreateFromGLBuffer: -60 (CL_INVALID_GL_OBJECT)

在我开始渲染循环之前,这一切都在发生。之后我可以在纹理上显示视频帧。 OpenCL上下文允许纹理目标(GL_TEXTURE_RECTANGLE_ARB),因为启用了相应的OpenGL扩展(GL_ARB_texture_rectangle)。

现在,OpenCL 1.1规范中的错误描述指出:

  

CL_INVALID_GL_OBJECT如果纹理不是类型匹配的GL纹理对象   texture_target,如果未定义指定的纹理miplevel,或者是宽度或高度   指定的miplevel为零。

我正在使用GL_TEXTURE_RECTANGLE_ARB,因此没有mipmapping(据我所知)。但是我发现的是Nvidia OpenCL implementation notes中的这句话:

  

如果在调用clCreateFromGLTexture2D时指定的纹理对象或   clCreateFromGLTexture3D根据纹理上的OpenGL规则不完整   完整性然后调用将返回errcode_ret中的CL_INVALID_GL_OBJECT。

如何在不提供任何实际纹理内容的情况下初始化纹理的状态下验证纹理完整性?有什么想法吗?

1 个答案:

答案 0 :(得分:4)

我能够解决无法创建Image2DGL的问题。我缺少为texture2D指定一个4通道内部格式:

void initTexture( int width, int height )
{
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
    glBindTexture(GL_TEXTURE_2D, 0);
}

通过指定 GL_RGBA ,我能够成功创建Image2DGL(相当于clCreateFromGLTexture2D)。这似乎满足了纹理完整性的要求。