Сбой ARB_sparse_texture, приводящий к перезагрузке компьютера

Я использую расширение 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 );
  • У меня 12 экранов работает в режиме NVidia Mosaic.
  • У меня на компьютере установлено 3 NVidia Quadro M6000.
  • У меня есть фрагмент шейдера, чтобы сообщить приложению, какой уровень части / 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 слоя больше не виден, я отменяю его с кодом выше.

  • После того, как у меня случился этот случайный сбой, я попытался

    • Использование меньших текстур 256x256x100 => Сбой.
    • Не используя разреженные текстуры => У меня не было сбоев.
    • Попытка изолировать проблему с удалением уровней mipmap (установив уровни в 1) => не помогла.
    • Попытался отключить режим мозаики и заставить работать 1 GPU вместо трех GPU => Что лучше, по крайней мере, я получил исключение для вызова glTexturePageCommitmentEXT (…, false). Но все равно есть случайный сбой.

Мои вопросы :

  • Как я могу решить эту проблему?
  • Что происходит?
  • Почему я не получаю никакой ошибки?
  • Почему он может генерировать исключения только тогда, когда активен 1 графический процессор (мозаика отключена)?
  • Как это может привести к перезагрузке компьютера и как я могу предотвратить это?
  • Я вижу, что у драйвера NVidia есть опция «Оптимизировать разреженное текстурирование», и он включен. Что делает этот параметр? Есть опыт?
  • Любое предложение улучшить все это?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]