Выпуск спецификации OpenGL 4.6

Консорциум Khronos, занимающийся разработкой графических стандартов, отметил двадцатипятилетие с момента основания стандарта OpenGL публикацией новой версии спецификации OpenGL 4.6, которая стала первым обновлением с момента появления графического API Vulkan, пришедшего на смену OpenGL. Для оценки возможностей новой версии API на реальном оборудовании компания NVIDIA выпустила бета-версию (381.26.11) драйвера с поддержкой OpenGL 4.6. Сообщается, что любые GPU NVIDIA для которых уже имеется поддержка OpenGL 4.5 являются совместимыми и с OpenGL 4.6. Из открытых драйверов к поддержке новой спецификации наиболее близки драйверы Intel i965, Nouveau (nvc0) и RadeonSI, в которых реализовано 5 из 11 новых расширений OpenGL 4.6.

Наиболее интересным новшеством OpenGL 4.6 является возможность обработки переносимого промежуточного представления шейдеров SPIR-V, изначально разработанного для API Vulkan. SPIR-V универсален для всех платформ и может применяться как для графики, так и для параллельных вычислений. SPIR-V подразумевает выделение отдельной фазы компиляции шейдеров в промежуточное представление, что позволяет создавать фронтэнды для различных высокоуровневых языков. На основе различных высокоуровневых реализаций отдельно генерируется единый промежуточный код, который может использоваться драйверами OpenGL, Vulkan и OpenCL без применения встроенного компилятора шейдеров. Избавление драйвера от компилятора шейдеров существенно упрощает драйвер, ускоряет загрузку кода для GPU и делает драйвер независимым от высокоуровневых языков разработки программ для GPU. Для преобразования шейдеров на языке GLSL в представление SPIR-V развивается компилятор glslang, в который уже добавлена поддержка GLSL 4.60.

В основной состав спецификации OpenGL 4.6 включено 11 расширений:

  • GL_ARB_gl_spirv и GL_ARB_spirv_extensions для стандартизации поддержки SPIR-V в OpenGL;
  • GL_ARB_indirect_parameters и GL_ARB_shader_draw_parameters для снижения нагрузки на CPU при выполнении операций в пакетном режиме, связанных с рендерингом большого числа геометрических примитивов;
  • GL_ARB_pipeline_statistics_query и GL_ARB_transform_feedback_overflow_query для стандартизации в OpenGL ранее специфичных для Direct3D средств для получения статистики о ходе выполнения шейдеров и отлавливания переполнения буферов;
  • GL_ARB_texture_filter_anisotropic (бывшее расширение GL_EXT_texture_filter_anisotropic) с реализацией метода улучшения визуального качества текстур, на который ранее распространялись патентные ограничения;
  • GL_ARB_polygon_offset_clamp (бывшее расширение GL_EXT_polygon_offset_clamp) для устранения часто встречающегося визуального артефакта «утечка света» (light leak), возникающего при отрисовке теней;
  • GL_ARB_shader_atomic_counter_ops и GL_ARB_shader_group_vote с реализацией дополнительных функций шейдеров, расширяющих функциональность и производительность для рабочего стола (реализация атомарных счётчиков и функции для ускорения композитинга на процессорах SIMD);
  • GL_KHR_no_error, позволяет снизить нагрузку на драйвер при выполнении операций, которые заведомо не могут привести к ошибке. При помощи данного расширения приложение может отключить код проверки ошибок в драйвере, что положительно сказывается на производительности;

Добавлено три новшества, которые в дальнейшем будут оформлены как расширения OpenGL:

  • GL_KHR_parallel_shader_compile — позволяет приложениям запустить сразу несколько потоков компиляции шейдеров;
  • WGL_ARB_create_context_no_error и GXL_ARB_create_context_no_error для отключения контекста обработки ошибок в WGL или GLX.

Для улучшения переносимости с API Vulkan и Direct3D в спецификации OpenGL и OpenGL ES включена порция необязательных расширений для низкоуровневых манипуляций с объектами в памяти и управления синхронизацией выполнения операций с GPU: GL_EXT_memory_object* и GL_EXT_semaphore*. Указанные расширения позволяют импортировать в OpenGL-приложения объекты Vulkan для из привязки к текстурам или буферам в памяти. Для совместимости с Direct3D добавлено расширение GL_EXT_win32_keyed_mutex.

©  OpenNet