什么OpenGL Bindless纹理函数glMakeTextureHandleNonResident实际上做什么?

时间:2015-02-07 00:21:12

标签: c++ opengl textures opengl-4

我有一个可以测试无边框纹理的工作原型。我有一台摄像机,可以播放超过6演出的纹理,而我只有2演出的VRAM。我有一个内截头体,用于获取视口中用于渲染的对象列表,以及一个外截头体用于队列(驻留)即将渲染的纹理,所有其他纹理,如果它们是居民,使用函数glMakeTextureHandleNonResident进行非常驻。

程序运行,但是gpu的VRAM表现得好像它有一个GC步骤,它以随机的时间间隔清除VRAM。当它这样做时,我的渲染完全冻结,但随后跳到正确的帧,最终回到60 FPS。我很好奇glMakeTextureHandleNonResident实际上并没有在“调用”时将纹理拉出VRAM。有没有人确切知道GPU正在通过该呼叫做什么?

GPU:Nvidia 750GT M

1 个答案:

答案 0 :(得分:2)

Bindless纹理基本上会在硬件上显示转换表,以便您可以在着色器中使用任意整数(句柄)来引用纹理,而不是GL的传统绑定到图像单元机制;它们不允许您直接控制GPU内存驻留。

Sparse textures实际上听起来更像你想要的。请注意,这两件事可以一起使用。


使句柄非驻留不一定从VRAM中驱逐纹理内存,它只是从所述转换表中删除句柄。纹理记忆的驱逐可以推迟到将来的某个时间,正如您所发现的那样。

您可以在GL_ARB_bindless_texture的扩展程序规范中详细了解这一点。

void glMakeImageHandleResidentARB(GLuint64句柄,GLenum访问):

  

“当图像句柄驻留时,它引用的纹理不一定被认为是AreTexturesResident命令的驻留。”

的问题:

  

(18)纹理和图像处理可以是驻留的或非驻留的。怎么样            处理驻留与纹理驻留查询交互            OpenGL 1.1(glAreTexturesResidentGL_TEXTURE_RESIDENT)?

     
    

<强>分辨

         
      

纹理和图像处理的驻留状态             扩展完全独立于OpenGL 1.1的GL_TEXTURE_RESIDENT             查询。纹理手柄的驻留是否是一个函数             已经调用glMakeTextureHandleResidentARB来处理句柄。 OpenGL 1.1             驻留性通常是纹理数据是否的函数             驻留在GPU可访问的内存中。

             

当纹理句柄没有驻留时,它引用的纹理              可能会也可能不会存储在GPU可访问的内存中 。该             在这种情况下,GL_TEXTURE_RESIDENT查询可能会返回GL_TRUE。但是,确实如此             不保证纹理手柄可以安全使用。

             

当纹理句柄驻留时,它引用的纹理是             也被认为是旧的GL_TEXTURE_RESIDENT居民             查询。当图像句柄驻留时,它所引用的纹理             可能会或可能不会被视为查询的居民 - 居民             图像句柄可能仅指单个mipmap级别的单个图层             完整的纹理。