Я использую расширение ARB_sparse_texture OpenGL в проекте визуализации. Я получаю случайное исключение при вызове glTexturePageCommitmentEXT. Это приводит к перезагрузке компьютера, когда я запускаю свое приложение в режиме мозаики NVidia.
Я вызываю 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 );
уровень — это уровень отображения, 0 и 0 — смещение по оси x и y, уровень — это индекс слайса в GL_TEXTURE_2D_ARRAY, ширина и высота — размер текстуры на уровне 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) буфер TexUsage {
uint texUsage []; // [layer {level, level, level ..} …]};
atomicAdd (texUsage [layer * levelCount + int (textureQueryLod (tex, texCoord.xy) .y)], 1);
Каждый кадр, когда я нахожу уровень mipmap уровня, видим, я фиксирую это с помощью описанных выше шагов и создаю Framebuffer:
glGenFramebuffers (1, &Я бы );
glBindFramebuffer (GL_FRAMEBUFFER, id);
glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureId, level, layer);
// сделать рисунок
glBindFramebuffer (GL_FRAMEBUFFER, 0);
Или, если я обнаружил, что уровень mipmap слоя больше не виден, я отменяю его с кодом выше.
После того, как у меня случился этот случайный сбой, я попытался
Мои вопросы :
Задача ещё не решена.