Состояние гонки с PBO

Я читал что-то о PBO в OpenGL, и у меня возник вопрос относительно состояния гонки.

Возьмем следующий пример: у меня есть два PBO, и я хочу передать их пиксельные данные по очереди в объект текстуры. Поэтому, когда я запускаю асинхронную передачу пикселей для одного PBO, я сразу же могу делать что-то еще с ЦП, в то время как данные пикселей передаются в фоновом режиме. Теперь я делаю некоторые манипуляции с пикселями на втором PBO, и когда это будет сделано, я хочу передать пиксели из второго PBO в объект текстуры. Но что, если передача первого ПБО еще не сделана? Это похоже на первый пример: http://www.songho.ca/opengl/gl_pbo.html< /а>

index = (index + 1) % 2;
nextIndex = (index + 1) % 2;

glBindTexture(GL_TEXTURE_2D, textureId);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[index]);

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, 0);

glTextSubImage2D() вернется немедленно, и я смогу начать работать со вторым PBO, в то время как данные первого PBO передаются на GPU. Что, если glTexSubImage() (теперь должны быть переданы пиксельные данные второго PBO) достигается до завершения первой передачи? Приведет ли это к остановке процессора?


person Stan    schedule 03.03.2013    source источник


Ответы (1)


OpenGL вводит точку синхронизации и гарантирует, что дальнейшие асинхронные операции не повлияют на какие-либо операции, запланированные прежними вызовами с использованием измененных объектов OpenGL.

Что, если glTexSubImage() (теперь должны быть переданы пиксельные данные второго PBO) достигается до завершения первой передачи?

Ничего неожиданного. Все вызовы, запланированные после вызова glTexSubImage, будут использовать измененные данные. Все вызовы, запланированные до этого, используют неизмененные данные. Спецификация OpenGL предписывает это.

Приведет ли это к остановке процессора?

Может, а может и нет. OpenGL не указывает это.

person datenwolf    schedule 03.03.2013