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

rdo*_*eui 3 opengl nvidia opencl

编辑:按照建议,我将纹理目标更改为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);
}
Run Code Online (Sandbox Code Playgroud)

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

texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex, &err));
Run Code Online (Sandbox Code Playgroud)

不过我还是收到了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);
}
Run Code Online (Sandbox Code Playgroud)

现在我想为OpenCL 和 OpenGL 之间的互操作分配tex一个Image2DGL。我使用的是 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));
Run Code Online (Sandbox Code Playgroud)

这给出了一个:

clCreateFromGLBuffer: -60 (CL_INVALID_GL_OBJECT)
Run Code Online (Sandbox Code Playgroud)

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

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

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

我正在使用 GL_TEXTURE_RECTANGLE_ARB,所以没有 mipmapping(据我所知)。但是,我在Nvidia OpenCL 实施说明中发现了以下声明:

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

在我只初始化纹理而不提供任何实际纹理内容的状态下,如何验证纹理完整性?有任何想法吗?

rdo*_*eui 5

我能够解决无法创建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);
}
Run Code Online (Sandbox Code Playgroud)

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