Я прочитал кое-что о 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 передаются в графический процессор. Что если glTexSubImage () (пиксельные данные второго PBO теперь должны быть переданы) будет достигнуто до завершения первой передачи? Приведет ли это к циклам остановки процессора?
OpenGL представит точку синхронизации и убедится, что дальнейшие асинхронные операции не будут влиять на любые операции, запланированные предыдущими вызовами, использующими модифицированные объекты OpenGL.
Что если glTexSubImage () (пиксельные данные второго PBO теперь должны быть переданы) будет достигнуто до завершения первой передачи?
Ничего неожиданного. Все вызовы, запланированные после вызова glTexSubImage, будут использовать измененные данные. Все звонки, запланированные до его использования, используют неизмененные данные. Спецификация OpenGL требует этого.
Приведет ли это к циклам остановки процессора?
Может или не может. OpenGL не указывает это.
Других решений пока нет …