我在可视化项目中使用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 );
我有一个片段着色器告诉应用程序该纹理的哪个部分/ 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级别不再可见,我将使用上面的代码解除它。
我尝试了这次随机崩溃后:
我的问题: