Операции над шейдерной программой замораживают контекст GL при использовании достаточно большого SSBO - PullRequest
0 голосов
/ 05 февраля 2019

Я делаю параллельное сокращение в вычислительном шейдере.Я рекурсивно вычисляю ограничивающую рамку фрагментов (начиная с G-буфера, полученного в результате рендеринга сцены), а затем ограничивающую рамку кусков ограничивающих прямоугольников и так далее, пока не получу один ограничивающий прямоугольник.

Сначала я делал это с текстурой глубины и одной vec2, содержащей минимальную и максимальную глубины, и сохранял иерархию в SSBO следующим образом:

// Each tile holds the min and max depth of the subtiles in the level under it.
// Each tile holds 32 items and is 8*4 or 4*8 depending on the level. Conceptually,
// the texDepth texture is level 4.
layout(std430, binding = 5) buffer aabbHierarchy
{
    vec2 level0[8 * 4], // one 8*4 tile
        level1[32 * 32], // 8*4 4*8 tiles
        level2[256 * 128], // 32*32 8*4 tiles
        level3[1024 * 1024]; // 256*128 4*8 tiles
};

В конце концов ястолкнулся с проблемами и решил переключиться на полные AABB.Структура и SSBO изменились следующим образом:

struct AABB
{
    vec4 low, high;
};

layout(std430, binding = 5) buffer aabbHierarchy
{
    AABB level0[8 * 4],
        level1[32 * 32],
        level2[256 * 128],
        level3[1024 * 1024];
};

Конечно, я изменил все, что касалось выполнения фактических вычислений соответственно.

Но теперь, как выясняется, контекст GL замирает, когда явыполнить любой вызов после glUseProgram в этой программе.Сам по себе вызов glUseProgram не имеет никаких проблем, но любой вызов GL, который я делаю после зависания моего приложения.Очевидно, этого не произошло, когда изначально использовался vec2.

. Я выполнил математические расчеты, и мой SSBO составляет 34 636 800 байт (с AABB), что намного меньше, чем ограничение размера блока SSBO в 128 МБ.,Ни в одной точке моего приложения glCheckError не возвращается ничего, кроме 0, и все мои компиляции шейдеров, распределение буферов и создание текстур работают (по крайней мере, они не возвращают ошибку).В качестве дополнительного бонуса выделение SSBO того же размера, что и для AABB, но использование его в качестве шейдера vec2 не приводит к зависанию приложения.

Я использую контекст OpenGL 4.4 с #version 430в вычислительном шейдере, без расширения.Это работает на ASUS RoG fx553vd с Nvidia GeForce GTX 1050.

РЕДАКТИРОВАТЬ: так как я не мог копировать в MCVE, это должно быть что-то делать с кодом вокруг него.Тем не менее, полное отсутствие сообщений об ошибках действительно странно.Мне удалось найти ту самую строку, которая вызвала ошибку, и воспроизвести тот факт, что в этом контексте любой вызов GL (даже такой простой, как glGetIntegerv) остановит приложение.

Это довольно большаяпроект, так что извините за это.Проблемная строка - там , а корень проекта там .Обратите внимание, что это ветка aabbHierarchy, а не master.Я добавил расширенную трассировку, чтобы было ясно, где и когда произойдет сбой программы.

РЕДАКТИРОВАТЬ 2: Я добавил контекст отладки OpenGL, и все, что он сделал для меня, это распечатал пару строк «Подробная информация о буфере»это не поможет.

1 Ответ

0 голосов
/ 06 февраля 2019

Оказывается, это проблема с драйверами.Я смог предоставить минимальный рабочий пример, который зависает на моем Nvidia, но отлично работает на моем интегрированном графическом процессоре Intel.

Для дальнейшего использования, с 02/06/2019, драйвер Nvidia уже давно использует вычислительные шейдерыкоторые объявляют массивы структур в буферных интерфейсных блоках.Это прекрасно работает:

layout(std430, binding = 0) buffer bleh
{
    vec2 array[100000];
};

, но это займет 5 фактических секунд, чтобы завершить выполнение glUseProgram:

struct AABB
{
    vec2 a;
};
layout(std430, binding = 0) buffer bleh
{
    AABB array[100000];
};

Шахта выглядит как зависание, потому что я выделяю более 30 МБШейдерное хранилище с буферной поддержкой через структуру, что совершенно нормально, но, видя, что драйверу Nvidia требуется 5 секунд для обработки 100 КБ, я могу только удивляться, сколько времени это займет.

На моем графическом процессоре Intel вызов glUseProgram для обоих выполняется мгновенно.Я сообщу об этом Nvidia как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...