ARB_sparse_texture崩溃,导致计算机重新启动

时间:2015-07-05 10:54:29

标签: c++ opengl opengl-4 opengl-extensions

我在可视化项目中使用ARB_sparse_texture OpenGL扩展。我在glTexturePageCommitmentEXT调用上得到随机异常。当我在NVidia Mosaic模式下运行应用程序时,它会导致计算机重启。

我正在调用glTexturePageCommitmentEXT:

glTexturePageCommitmentEXT( textureId, level, 0, 0, layer, width, height, 1, false );

其中textureId指向使用以下项生成的稀疏纹理:

const PageSizeT & pageSize  = pageSizes( internalFormat );
pageSizeX   = pageSize.x[pageSizeIndex_];
pageSizeY   = pageSize.y[pageSizeIndex_];
pageSizeZ   = pageSize.z[pageSizeIndex_];

glGenTextures( 1, &id );
glBindTexture( GL_TEXTURE_2D_ARRAY, id );

glTexParameteri( GL_TEXTURE_2D_ARRAY, GL_TEXTURE_SPARSE_ARB, GL_TRUE );
glTexParameteri( GL_TEXTURE_2D_ARRAY, GL_VIRTUAL_PAGE_SIZE_INDEX_ARB, pageSizeIndex_ );

glTexParameteri( GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
glTexParameteri( GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

glTexParameteri( GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0 );

glTexStorage3D( GL_TEXTURE_2D_ARRAY, levels, internalFormat, width, height, layers );

handle = glGetTextureHandleARB( id );

glMakeTextureHandleResidentARB( handle );

glBindTexture( GL_TEXTURE_2D_ARRAY, 0 );

级别是mipmapping级别,0和0 x和y偏移,layer是GL_TEXTURE_2D_ARRAY中切片的索引,width和height是mipmap级别中的纹理大小

std::max( (int)textureWidth_ >> level_, 1 )

和1是深度。最后一个参数(false)是我要求扩展取消给定纹理区域的地方。要提交纹理特定区域,我对此函数进行了类似的调用,最后一个参数设置为true。

glTexturePageCommitmentEXT( textureId, level, 0, 0, layer, width, height, 1, false );
  • 我在NVidia Mosaic模式下运行了12个屏幕。
  • 我的计算机上安装了3台NVidia Quadro M6000。
  • 我有一个片段着色器告诉应用程序该纹理的哪个部分/ mipmap级别是可见的:

    layout(std430,binding = 4)buffer TexUsage { uint texUsage []; // [layer {level,level,level ..} ...]};

    atomicAdd(texUsage [layer * levelCount + int(textureQueryLod(tex,texCoord.xy).y)],1);

  • 当我找到图层的mipmap级别时,每个帧都可见我使用上面的步骤提交,我创建了一个Framebuffer:

    glGenFramebuffers(1,& id);

    glBindFramebuffer(GL_FRAMEBUFFER,id); glFramebufferTextureLayer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,textureId,level,layer);

    //做一些绘图

    glBindFramebuffer(GL_FRAMEBUFFER,0);

  • 或者,如果我发现层的mipmap级别不再可见,我将使用上面的代码解除它。

  • 我尝试了这次随机崩溃后:

    • 使用较小的纹理256x256x100 =>坠毁。
    • 不使用稀疏纹理=>我没有崩溃。
    • 尝试通过删除mipmap级别来解决问题(通过将级别设置为1)=>没有帮助。
    • 尝试禁用马赛克模式并强制1 GPU执行工作而不是三个GPU =>有些更好,至少我得到glTexturePageCommitmentEXT(...,false)调用的例外。但是仍然会随机崩溃。

我的问题:

  • 我该如何解决这个问题?
  • 发生了什么事?
  • 为什么我没有得到任何glError?
  • 为什么它只能在1个GPU处于活动状态时才会抛出异常(马赛克被禁用)?
  • 如何导致计算机重启以及如何防止它?
  • 我看到NVidia驱动程序可以选择“优化稀疏纹理”并打开它。这个设置在做什么?有经验吗?
  • 有什么建议可以改善这一切吗?

0 个答案:

没有答案