Ответ 1
По сути, вы просто реализуете спинлок. Только вместо одной переменной блокировки у вас есть целая текстура блокировок.
Логично, что вы делаете, имеет смысл. Но что касается OpenGL, на самом деле это не сработает.
Смотрите, модель выполнения шейдера OpenGL утверждает, что вызовы выполняются в порядке, который в значительной степени не определен по отношению друг к другу. Но спин-блокировки работают только в том случае, если есть гарантия продвижения вперед между различными потоками. По сути, спин-блокировки требуют, чтобы поток, который вращается, не мог заставить исполнительную систему не запускать поток, который он ожидает.
OpenGL не предоставляет такой гарантии. Это означает, что один поток может полностью заблокировать пиксель, а затем прекратить выполнение (по какой-либо причине), в то время как другой поток блокирует этот пиксель. Блокированный поток никогда не прекращает выполнение, а поток, которому принадлежит блокировка, никогда не возобновляет выполнение.
Как это может произойти в реальной системе? Хорошо, допустим, у вас есть группа вызова фрагмента шейдера, выполняющаяся на некоторых фрагментах из треугольника. Все они блокируют свои пиксели. Но тогда они расходятся в исполнении из-за условного перехода в пределах области блокировки. Расхождение в исполнении может означать, что некоторые из этих вызовов передаются в другой исполнительный блок. Если в данный момент нет ни одного доступного, тогда они фактически останавливаются, пока один не станет доступным.
Теперь, допустим, что пришла какая-то другая группа вызова фрагментного шейдера и ей была назначена исполнительная единица перед расходящейся группой. Если эта группа пытается спинлокировать пиксели из расходящейся группы, она по существу истощает расходящуюся группу времени выполнения, ожидая того, что никогда не произойдет.
Очевидно, что в реальных графических процессорах имеется более одного исполнительного модуля, но вы можете себе представить, что при наличии большого количества групп вызовов вполне возможно, что в таком сценарии время от времени возникают проблемы.