Спинлок GLSL никогда не прекращается

Я пытаюсь реализовать спин-блокировку GLSL, чтобы иметь возможность осуществлять однопроходное отслаивание по глубине. У меня возникли проблемы, потому что примеров использования текстуры блокировки мало. Я должен признать, что я действительно не знаю, что я здесь делаю, поэтому я опишу, вероятно, больше контекста, чем необходимо, просто чтобы быть в безопасности.

Я написал фрагмент программы, которая ничего не должна делать эффективно:

#version 420 core

//The lock texture holds either 0 or 1.
//0 means that the texture is available.
//1 means that the texture is locked.  
layout(r32ui) coherent uniform uimage2D img2D_0; //locking texture

layout(RGBA32F) coherent uniform image2D img2D_1; //data texture (currently unused)

void main() {
    ivec2 coord = ivec2(gl_FragCoord.xy);

    //The loop's exchange function swaps out the old value with 1.

    //If the locking texture was 0, 0 will be returned, terminating the loop;
    //the locking texture will now contain 1, indicating that the locking
    //texture is now locked.

    //Conversely, if the locking texture contains 1, then the exchange function
    //will write a 1 (so the texture is still locked), and return 1, indicating
    //that the texture is locked and unavailable.
    while (imageAtomicExchange(img2D_0,coord,1u)==1u);

    //The locking texture is locked.  More code would go here

    //This unlocks the texture.
    imageAtomicExchange(img2D_0,coord,0);
}

Текстура блокировки создается так:

//data is an array initialized to all 0.
glTexImage2D(GL_TEXTURE_2D,0,GL_R32UI,size_x,size_y,0,GL_RED_INTEGER,GL_UNSIGNED_INT,data);

Чтобы выполнить алгоритм, я беру FBO с цветным вложением RGBA F32 и включаю его. Я связываю вышеприведенный шейдер, затем передаю текстуру блокировки в img2D_0 и прикрепление цвета к img2D_1, используя этот код:

glBindImageTextureEXT(
    /* 0, 1, respectively */,
    texture_id, 0,GL_FALSE,0, GL_READ_WRITE,
    /* GL_R32UI, GL_RGBA32F, respectively */
);

Затем объект визуализируется с помощью VBO, а некоторые вторичные проходы показывают содержимое данных.

Проблема заключается в том, что данный фрагмент программы приводит к сбою видеодрайвера (поскольку он никогда не завершается). Мой вопрос почему? Текстура инициализирована равной 0, и я уверен, что моя логика для функций обмена верна. Правильны ли мои настройки и методология?

Ответы на вопрос(1)

Ваш ответ на вопрос