Vulkan     :       16 ,   
 


   Vulkan 1.3/1.4     C++:      . 31 ,   , 63    ,     .  ,    .





 

Vulkan     :       16 ,   









   31           Vulkan   C++.       .  C++     .

,    Vulkan. .        : OpenGL , DirectX 12    Windows,     ?.    :    .  .

   ,  Vulkan  ,  .      ,   . OpenGL      . Vulkan   :   ,   .  .

  ,    . Vulkan       .  OpenGL      ,   15    ,    ,        .  Vulkan   GPU      ,   .      .




   


   C++   , ,   , std::vector, std::unique_ptr  .

    ,     .   .

      Vulkan, OpenGL   .      .

:    Vulkan 1.3  .          2016    .   vulkaninfo    1.




 











    Khronos Vulkan Tutorial (https://docs.vulkan.org/tutorial/latest/00_Introduction.html): Vulkan 1.4  , dynamic rendering  render passes, timeline semaphores, Slang, C++20  Vulkan-Hpp  RAII. ,       .   20162020    VkRenderPass  VkFramebuffer.      :  ,  .




  


     ,      :      .   ,       .




 


   ,         .

        .

               .

        .

          .        ,       .

      .    A.




 


   : , ,    , , .      (// ??  1 ??),        .   :     .

    .  0     .  I    .  II  : , , 3D, .  III    C++   .  IV  Vulkan  ,     .  V  ,    .

     ?   Vulkan   ,     ,  ,  .   ,  ,      .

  .  debug- validation layers  ,  :   Vulkan   ,    UB.  15  ,    .    .

. Vulkan  .   : ,    ,   ,   .   




 0.  



   :    ,    .




 0.   Vulkan,      OpenGL



       .   ,    Vulkan,             .  Vulkan       -   .  ,   ,      .




0.1. :      


CPU      .    , ,  . GPU     ,          .         .  JSON      .

: CPU  . CPU    ( ),         . GPU          .     :      .












     .  GPU  ,   .  GPU   ,   .  GPU  ,   .  OpenGL     .  Vulkan  .

. CPU  GPU    .    CPU   ,     . ,    GPU,  ,  GPU   .




0.2.  OpenGL     


     OpenGL.  .












 glDrawArrays    ,     :

1.  .   ?   ?   ?   ,   .

2.  . OpenGL    .    ,       ,       .

3.   .           .         .   .

4.  .   ,     ?     ?  .

5.  .       glBufferSubData,  GPU    ?   ,    .

6. ,   .        ,    .

     ,     OpenGL. :  ,          .




0.3.  Vulkan:  


Vulkan   2016 .   Khronos Group   AMD Mantle.  :      ,        .












  :   ,     draw call   .  :    .   Vulkan     ,  UB:  ,       ,   AMD .

  : Vulkan   .   2D-  SDL, raylib   . Vulkan ,     ,       ,      .  ,        Unreal.

.  ,  .   ,  Python (PEP 20).   Python,     Vulkan  .

.       ,        .   . .      .       .




0.4.   Vulkan


  Vulkan  ,    .         .












   ,     :












Buffer  Image    : , , .    (DeviceMemory)     .      :  ,  .   10      VMA.




0.5.   1:    


      C++  ,    .      Vulkan. Ÿ      godbolt.org (https://godbolt.org):  GCC  Clang,  Execute.



















 .

 explicit Noisy(std::string_view name)  explicit   .          Noisy ,     .      explicit,    .

 : name_{name}   .      ,      .

 = delete     ,   vk::raii-.       .  (std::move) vk::raii- :  ,    .

 std::string_view name_     ,   .   :     .    std::string     .

 Noisy instance_{"Instance"};       (default member initializer).      .

         .        ,     -Wreorder.      .

   App()     .   ~App()    .        GPU.

    main  .    app ,         .

       Vulkan.    .        1,     .       28.


























.

 vk::raii::Context context;     = nullptr.  Context      Vulkan       .       .

 = nullptr    vk::raii-   :  ,    .    ,   .      .

       0.4  .     : ,  ,      Instance.  ,   Vulkan.

 std::vector<vk::Image> swapchainImages   ,  raii.  swapchain  ,   ,     swapchain.

 commandBuffers   commandPool.  vk::raii::CommandBuffer    ,        .

    ,    .  ,    0.7.

 if (*device)   *  vk::raii-    vk::Device,      bool.     (  ),  .

 device.waitIdle()  CPU,  GPU    .      ,  GPU    .

 try {  } catch (...) {}    C++  noexcept. ,   ,  std::terminate.    ,     :  GPU ,    .

 inline     ,      .    .cpp,  ,     .

.  device  commandPool  ?    ,     vkDestroyCommandPool    VkDevice.  UB.     ,      ,     .




0.6.   


   Vulkan   . CPU   ,  GPU        .












            (frames in flight),  CPU  GPU:












GPU  :     0, CPU    1.    CPU  :   ( , uniform-)    0.  CPU  fence F0.     GPU (GPU-bound),   :    100%.

  ,   ?                .    : GPU ,  .




0.7.   2: drawFrame 


    Vulkan-.    :    .   8      .      :     ,    .



















 1  waitForFences.  CPU,  fence   .   GPU,    ,    fence   . commandBuffers[currentFrame]      GPU.         ,   .

 *inFlight[currentFrame]  *   vk::raii::Fence  vk::Fence. raii-  ,      .     .

 vk::True    fence  .    ,  .

 UINT64_MAX  -  ,  584 .   .

   [[nodiscard]],    .   (,  ) Vulkan-Hpp    .

      ?   fence      ( vk::FenceCreateFlagBits::eSignaled).      ,   .

 2  acquireNextImage.   swapchain    .  :    ,     .      .    ,    imageAvailable[currentFrame].    GPU,   CPU.

 auto [acquireResult, imageIndex]    (C++17).     + ,      .

 imageIndex      0, 1, 2:    2, 0, 2, 1.  imageIndex    currentFrame!    .

  eErrorOutOfDateKHR (  ) Vulkan-Hpp    vk::OutOfDateKHRError.     9.

 3  resetFences.  fence   ,  GPU    .   acquire,     ?  acquire  ,    ,   .  fence    ,       1 .

 4  . cmd.reset()   . ,       eResetCommandBuffer ( 7). auto& cmd   : vk::raii::CommandBuffer  .

 5  submit2.    GPU,  ,     .

 waitInfo    imageAvailable,     eColorAttachmentOutput (   ).      ,    .

 cmdInfo    .

 signalInfo     (eAllCommands) ,  renderFinished[imageIndex].       .

   submit2  fence.   submit , GPU  inFlight[currentFrame],      1   .

  submit2,    submit?   synchronization2   Vulkan 1.3.     ,        .  .

      (.semaphore = )  designated initializers  C++20.       ,  .  sType Vulkan-Hpp  .     VULKAN_HPP_NO_STRUCT_CONSTRUCTORS ( 1).

 6  presentKHR.      imageIndex,   renderFinished[imageIndex].  &*renderFinished[imageIndex]   : *     vk::Semaphore  raii-, &   . Vulkan    ,          .       ,    .      ,      3.

  :  imageAvailable  currentFrame,  renderFinished  imageIndex?  present  fence.   ,           .   :   N     acquire,   present  . , ,    N, .  renderFinished  currentFrame        ,      .

 7.       : 0, 1, 0, 1

. Fence    GPU  CPU:  ,  . Semaphore      GPU:  ,  , CPU   . imageAvailable     , renderFinished    swapchain.

.  imageIndex  currentFrame     .  , fences  uniform-  currentFrame.  swapchain,  image views  renderFinished  imageIndex.




0.8.    ?


      CPU  4:    .     ,     :












  ,       ( 23)    ( 25).  submit  present  :  ,        .

 ( ).      VkDevice      .          .            .     IV:     .




  0


 CPU  , GPU   .

 Vulkan   API: ,      .

 : Instance ? PhysicalDevice ? Device ?  .

    : create, allocate, enumerate/get.

    .  C++     .

     device.waitIdle().

 : wait fence ? acquire ? reset fence ? record ? submit ? present.

 Fence: GPU ? CPU. Semaphore: GPU ? GPU.

         GPU  .

   , submit  present  .




   


 0.1.    .   .      , ,      ,   . :      ?












 0.2.  . CPU    4 , GPU    10 . Vsync , present , MAX_FRAMES_IN_FLIGHT = 2. ()   FPS   ? ()     CPU  fence? ()    FPS     MAX_FRAMES_IN_FLIGHT = 1  = 3?

 0.3.     ?    5   fence: graphicsQueue.submit2(submitInfo);.     , fences   eSignaled. ()    (  )      ? ()   fences   eSignaled? ()   MAX_FRAMES_IN_FLIGHT = 3?

         ,   A.




 1. ,    CMake   



        ,   GLFW  ,    Vulkan.  .       ,   ,   C++        ,   .




1.1. Vulkan SDK


Vulkan SDK  LunarG    ( Vulkan-Hpp),  ,   slangc,  vulkaninfo  vkconfig.   SDK  :    NVIDIA, AMD, Intel  Mesa.

 Windows:   vulkan.lunarg.com (https://vulkan.lunarg.com).     VULKAN_SDK.

 Linux:  SDK    ,    source setup-env.sh (   ~/.bashrc).  Mesa    libvulkan1    .

 macOS: SDK  MoltenVK   Vulkan  Metal. ,    (portability,  2).

  :












  vulkaninfo   apiVersion   .  1.3  .   1.2   ,    90% .   RenderDoc (https://renderdoc.org):  ,      .   .




1.2.  











   vcpkg (https://vcpkg.io)   .  vcpkg,  bootstrap-    VCPKG_ROOT.    CMake.












    GLFW  GLM.     10 (VMA), 13 (stb_image), 14 (fastgltf)  29 (Tracy). Vulkan-Hpp   SDK,    vcpkg:        .




1.3. CMakeLists.txt 


















:












.

  1. CMAKE_CXX_STANDARD 23   C++23  std::print  std::expected.       C++20. EXTENSIONS OFF   GNU,      MSVC. EXPORT_COMPILE_COMMANDS  compile_commands.json    clangd   IDE.

  2. find_package(Vulkan)    CMake.   SDK   VULKAN_SDK. CONFIG      ,   vcpkg.

  3. Vulkan::Vulkan   Vulkan. vk::raii::Context    ,    VMA   10. PRIVATE     .

  4.  ,      . VULKAN_HPP_NO_STRUCT_CONSTRUCTORS    vk::-    .     { .semaphore =  }. GLM_FORCE_DEPTH_ZERO_TO_ONE  glm::perspective      Vulkan.        .

  5.   . /utf-8  MSVC ,        . /permissive-    .

  6.       . ASan      use-after-free, TSan   .    ,  elseif. TSan       III.




1.4.  GLFW  RAII-


GLFW      init/terminate  create/destroy.   ,      .




























.

  1. GlfwLibrary    ,       .     glfwVulkanSupported:    ,     . ,    ,   .     throw   .

  2. std::unique_ptr    ,    .      operator(),   WindowPtr    .  ,      C++.

  3. GLFW_CLIENT_API = GLFW_NO_API    .   GLFW   OpenGL,     Vulkan surface .

  4. glfw   window,     glfwTerminate.   ,     0.

  5. enumerateInstanceVersion  ,   API  .     32- ,  VK_API_VERSION_*   .   ,   :      3.

  6. glfwPollEvents   : ,  , .    ,   .

 catch (const std::exception&)  main   . Vulkan-Hpp     (vk::SystemError  ),       .     RAII-  .

.  #include  . glfw3.h  glfwCreateWindowSurface,       vulkan.h.     4        .




1.5.   C++:   vk::raii


 vk::raii   ,    :   ,   ,   .



















.

 std::exchange(other.handle_, Handle{})         .    ,     .

 noexcept   . std::vector          .    ,   .

 if (this != &other)   x = std::move(x).   reset()   ,      .

 vk::raii::Buffer   ,           .   : vk::raii-     .    ,      .

. ,  :  ,  noexcept,     .       .

.   GLFW      : glfwInit, glfwCreateWindow, glfwPollEvents.    ,  macOS.           ,     .




  1


 SDK =  +  + slangc.   .

 vulkaninfo --summary      .

 : VULKAN_HPP_NO_STRUCT_CONSTRUCTORS, GLFW_INCLUDE_NONE, GLM_FORCE_DEPTH_ZERO_TO_ONE.

 GLFW_CLIENT_API = GLFW_NO_API,  surface  .

 vulkan_raii.hpp   glfw3.h.

 RAII-:  ,  noexcept-.




   


 1.1.   .  POSIX     int,      (stdin).   -1.   Unique ,     ,   UniqueFd.

 1.2. .  ,   vk::raii::Context    instance-  ,    ,   VK_LAYER_KHRONOS_validation.        std::ranges.

    A.




 I.  



       ,     .      Pepelac -  create().




 2. Instance   :   



Instance      Vulkan.    ,   API ,     .    ,      UB.         Instance,        .




2.1.   


   ,    .    instance (   , )   device (swapchain,   GPU).    ,   : KHR  Khronos, EXT   , NV/AMD/ARM   .

  ,           .  VK_LAYER_KHRONOS_validation          .












     ,     debug-.




2.2. :  Instance






































2.3.   


 1.  NDEBUG      (   assert).     constexpr bool,    if constexpr  #ifdef.   if constexpr    ,    .   debug-    .  namespace { }        .cpp.

 2.  callback   . VKAPI_ATTR  VKAPI_CALL     .     ,   32- Windows  Android    . severity    ,   switch. type   , vk::to_string     { Validation }.  vk::False   . vk::True     .

 makeDebugMessengerInfo ,  :      . eVerbose  eInfo     ,  ,    - .

 3. GLFW  ,        : VK_KHR_surface   (VK_KHR_win32_surface, VK_KHR_xcb_surface, VK_KHR_wayland_surface).    ,   ,       std::vector.  vector(first, last)     .   vk::EXTDebugUtilsExtensionName    ,   VK_EXT_DEBUG_UTILS_EXTENSION_NAME,     vk.

 4.    , vkCreateInstance  VK_ERROR_EXTENSION_NOT_PRESENT,    ,  .       . std::span<const char* const>     :    vector,  array,     . extensionName  Vulkan-Hpp    char[256]. .data()        ,    string_view   .   const char*  ==  ,   ,     .

 5. ApplicationInfo   .       :          .    apiVersion:   Vulkan,    .   ,    :     3.

 InstanceCreateInfo    pNext.      ,  Vulkan     ABI.    DebugUtilsMessengerCreateInfoEXT.  ?  messenger   instance    .    vkCreateInstance  vkDestroyInstance   .   pNext   messenger     .

instance = vk::raii::Instance(context, createInfo);         ,   nullptr.     ,    .     Vulkan   ,        .   : ,     vkCreate*,     .

 6.   C  vkCreateDebugUtilsMessengerEXT      vkGetInstanceProcAddr:     . vk::raii::Instance         .




2.4.      C


        C API.     ,      .




















2.5.    


     VUID (Valid Usage ID),  VUID-vkDestroyDevice-device-05137.      .     : VUID,   (  )   .     :

1.    .     ,  .

2.  VUID    docs.vulkan.org (https://docs.vulkan.org)   .

3.   ,   .   28    ,   0x7f3a      .

 :     debugCallback   .        ,   .

.   :            .   ,    .        .

.  SDK ( 2025 )  pfnUserCallback  C- (VkBool32, VkDebugUtilsMessageSeverityFlagBitsEXT  ..).      callback,  SDK     C-.

. Callback     ,     Vulkan.    IV      , callback   .   std::println   .    callback    std::vector  ,  .




  2


 Instance =  API +  instance + .

      GLFW, VK_EXT_debug_utils   debug.

      .

 DebugUtilsMessengerCreateInfoEXT  pNext instance      instance.

 apiVersion  ,    ,    .

   vkCreate*     .

      .




   


 2.1.  .   callback  pUserData      .      ,   debug-    ,     . ,  callback     .

 2.2.   .  ensureSupported       .   ,              .  std::views::filter.

    A.




 3.    :   



     GPU:  ,  ,   llvmpipe. Vulkan      .      ,          .




3.1.   


 PhysicalDevice      .     :  ,  ,  .       .

 Device ( )       .    ,      .    ,    .

 Queue family      .     :












      ,    .      GPU,       IV.      .




3.2. Surface 


  ,  ,        .    surface.      4,      GLFW:












GLFW   ,     C-. static_cast<VkInstance>(*instance)  vk::Instance  VkInstance.  vk::raii::SurfaceKHR(instance, raw)   :    . window   GLFWwindow*,  Pepelac   .   main,     .




3.3. :  













































3.4. 


 1. std::optional<uint32_t>        .    UINT32_MAX     . optional        *. std::array kDeviceExtensions = {}  CTAD:       (std::array<const char*, 1>).

 2. queueFlags   .  flags & vk::QueueFlagBits::eGraphics  ,  static_cast<bool>         .  Vulkan-Hpp  :   QueueFlags  BufferUsageFlags  . getSurfaceSupportKHR(i, *surface) ,    i    .       ,      ( 3.2).

    . Async compute   compute  graphics:          . Transfer   transfer:  DMA-,     .      ,   :    ,      .

 3.    .   ,    .    .     :

 props.apiVersion   Vulkan,     .   ,      <.

 getFeatures2<>()    Vulkan-Hpp.      pNext,  vkGetPhysicalDeviceFeatures2    .    .get<T>().  C      ,    .

      . samplerAnisotropy    ( 13), shaderDrawParameters  Slang-, timelineSemaphore   IV, synchronization2  dynamicRendering   .  Vulkan 1.3   ,     ,      .

 4. instance.enumeratePhysicalDevices()   vk::raii::PhysicalDevice.     raii-, PhysicalDevice :        .  score < 0 ? std::string() : std::to_string(score)       ,     std::string.

 5.  :

 DeviceQueueCreateInfo       .      ,   .      ,      .

 pQueuePriorities     0  1.   ,   .      vkCreateDevice,  priority    ,    .

 vk::StructureChain<>   Vulkan-Hpp.     pNext: DeviceCreateInfo ? Features2 ? Vulkan11 ? Vulkan12 ? Vulkan13.      ,       .    vk::ImageCreateInfo   .

   1.0 (samplerAnisotropy)   PhysicalDeviceFeatures2  .    pEnabledFeatures  DeviceCreateInfo   nullptr.   ,  .

 vk::raii::Device(physicalDevice, )    device-   ,    .        .

 vk::raii::Queue(device, family, 0)     0  .         ,  raii::Queue   .

  Pepelac   GLFWwindow* window, QueueFamilies families, vk::raii::Queue computeQueue = nullptr  vk::raii::Queue transferQueue = nullptr    graphicsQueue.

. ,       Device, ,     .  ,     UB.            (rateDevice),    .

.    GPU        .     CI    llvmpipe    CPU.         ,  ,          3 FPS.

.   PhysicalDevice    .    VkQueue   :       submit   .   transfer  compute   :    -,    .     23  24.




  3


 PhysicalDevice   , Device   .

 Ƹ : apiVersion ? 1.3, VK_KHR_swapchain,  ,  graphics + present.

    StructureChain  Features2/11/12/13.

  : compute  graphics, transfer  . .

  VkQueue =    .




   


 3.1.   .    PEPELAC_GPU.   ,    ,      .               .

 3.2.   .   GPU,         ,   .  findQueueFamilies   present-,    . ,   createLogicalDevice,    .

    A.




 4. Surface  swapchain:  



Vulkan     .    ,         presentation engine,    . Swapchain        :  ,       .




4.1.   swapchain











       :   ( acquire),    ( present).   ,    , :   .     ,   .




4.2.  











FIFO   ,     .   .




4.3. :  swapchain































4.4. 


 1  . B8G8R8A8     8 .  BGR    ,    .   Srgb.       (   =   ),    - .    sRGB-    , .  Unorm     ,        .

std::ranges::find_if(formats, )  .   formats.end()    . formats.front() :         surface.

 2  .  MAILBOX:    .    FIFO,   . std::span<const T>  ,   Vulkan-Hpp,  .

 3  . currentExtent    .   0xFFFFFFFF    ,  , , Wayland.           . std::clamp(x, lo, hi)    min(max(x, lo), hi).     200%  1280?720  2560?1440 ,   4.2.

 4.      + surface.     ,    ,    .

 5   .  MAILBOX  :   ,   ,   . std::max(3u, )  3u  unsigned,  std::max     int  uint32_t   . maxImageCount == 0    ,     .  :   ,    .     getImages(),       renderFinished.

 6  . compositeAlpha ,        .    eOpaque,   ,    .  &    ,    ? :       bool.

 7  . ,      :

 imageUsage = eColorAttachment           .     (blit)   eTransferDst,    caps.supportedUsageFlags.

 imageSharingMode = eExclusive        .  ,  eConcurrent.        23.

 preTransform = currentTransform    .           ,      identity.

 clipped = vk::True   ,   ,  .     .

 getImages()  std::vector<vk::Image>     RAII.   swapchain.

 8  image views.        ,     . View ,   :  ,  mip-,   ,   (, , ). : std::string_view  std::string.        view.

 reserve     ,      emplace_back.

 emplace_back(device, info)  vk::raii::ImageView   . vk::ImageViewCreateInfo{}     :          .

 components  :    eIdentity,   .

  Pepelac   vk::Format swapchainFormat  vk::Extent2D swapchainExtent   swapchain.    ( 6)   ( 7).

. Image    , ImageView  ,   .   view,    image.      ,   ,   .

. MAILBOX       .    100%  GPU,        .    UI-  FIFO.

. Swapchain     acquireNextImage   . present    .    acquire  present          .  Windows  macOS present    ,    .  ,      .




  4


 Surface =   Vulkan. Swapchain =       .

 : B8G8R8A8Srgb + SrgbNonlinear,   .

 : MAILBOX  ,  FIFO ( ).

     : glfwGetFramebufferSize.

 : currentExtent = 0xFFFFFFFF, maxImageCount = 0.

      getImages().

      ImageView.




   


 4.1.  vsync.      bool vsync.  vsync   FIFO.  vsync      MAILBOX ? IMMEDIATE ? FIFO.       ,   if.

 4.2.   4K-.    glfwGetWindowSize  glfwGetFramebufferSize     200%.   ,    swapchain  ?     glfwGetFramebufferSize,  currentExtent  ?

    A.




 5. : ,    



    ,  GPU    :   ,   .     Slang,   SPIR-V  ,    SPIR-V     .     .   .




5.1.  











    ,    ( 6).

              clip space.    w    (NDC).

  ,    ,       .

           .

 NDC  Vulkan: x  ?1 ()  +1 (), y  ?1 ()  +1 (), z  0  1.  OpenGL y  ,  z   ?1.     OpenGL      .




5.2.    Slang


Slang     ,   HLSL.        ,     .      :     11.












.

  1. static const    ,   C++. float2, float3, float4    2, 3  4 .    NDC,        .        .  ,       6.

  2.  SV_Position (SV  system value)  :    ,    .  color   Slang      location.     ,  .

  3. [shader("vertex")]   . SV_VertexID      draw: 0, 1, 2.       .  float4(xy, 0.0, 1.0)   w = 1   .   12     .

  4.      ,     . SV_Target       0.  1.0   .




5.3.   SPIR-V  CMake


SPIR-V      32- .     ,     OpenGL.  :     GLSL   ,       ,    .












.

  5. find_program  slangc  SDK   PATH. REQUIRED     ,  SDK  .

  6. add_custom_command ,    OUTPUT      (DEPENDS). CMake      .slang. target_sources  .spv ,   pepelac   .     .

  slangc: -target spirv   ; -profile spirv_1_4   SPIR-V (Vulkan 1.3   1.6); -emit-spirv-directly   SPIR-V ,   GLSL; -fvk-use-entrypoint-name    vertMain  fragMain,       main  ; -matrix-layout-column-major      ,   GLM ( 12); -g  debug   ,  RenderDoc   .

 "$<$<CONFIG:Debug>:-g>"  generator expression:  -g   Debug.   ,    .

 PEPELAC_SHADER_DIR   C++     .    .            .




5.4.  SPIR-V  shader module


















.

  7.  std::ios::ate      ,  tellg()   .  seekg(0)    .    vector<uint32_t>,    vector<char>. Vulkan ,  pCode    4 .  char    ,  reinterpret_cast<const uint32_t*>        .    (uint32_t* ? char*)   .

   0x07230203     SPIR-V.       ,  -     HTML- 404,   .

  8. codeSize   ,  pCode    uint32_t. ,    . span::size_bytes()     code.size()  code.size() * 4.

 Shader module    ,     SPIR-V.      GPU       6.     ,   .  vk::raii::ShaderModule      copy elision  C++17.

.  : .slang ? (slangc,  ) ? .spv ? (ShaderModule,  ) ? (,   ) ?   GPU.     ,   -    ( 25).

.      (pName)       SPIR-V.  -fvk-use-entrypoint-name,     "vertMain"   ,    .      .

.vkCreateShaderModule      , device    .          .      23  25.




  5


  :    .    .

 NDC  Vulkan: Y , Z  0  1.

 Slang: [shader("vertex")], SV_Position, SV_VertexID, SV_Target.

 slangc  -target spirv -fvk-use-entrypoint-name       .spv.

 SPIR-V   vector<uint32_t>:   4 .

 codeSize   .

 Shader module     .




   


 5.1.   .   ,   draw(6, 1, 0, 0)         .        :     .       .

 5.2.  .   SPIR-V   :      1623,     815.  readSpirv,       ( )     1.6.    1.6   ?

    A.




 6. Graphics pipeline:   



 OpenGL     glEnable(GL_BLEND)  ,     draw call     .  Vulkan         pipeline.       .       .  ,         0.




6.1.    











 dynamic rendering.      VkRenderPass       .  Vulkan 1.3      PipelineRenderingCreateInfo.        .




6.2. 
























6.3. 


 1.  shader module   ,  stage  pName.    :       ,  RAII      . std::array stages{}      (CTAD),        .

 2.  vertexInput    ,    SV_VertexID.  eTriangleList:  0-1-2   , 3-4-5  .   strip, fan,   ,  list    .

 3. Viewport  ,    NDC. Scissor  ,     .     .           .    ( 7),      .

 4. :

 depthClampEnable       .   ,   .

 polygonMode = eFill   . eLine ()   fillModeNonSolid,   6.1.

 cullMode = eBack + frontFace = eClockwise  ,     ,  .     .         ,      .

 lineWidth = 1.0f   ,     .  0    .

 5.    ,    MSAA.      14.

 6.  :     . colorWriteMask     .    :  .    ,      ,    .     :   .

 7.            OpenGL. Viewport  scissor   ,    . Vulkan 1.3      (cull mode,  , ).    ,    25.

 8. Pipeline layout      :    push constants.    ,   layout   .   ,    :     .

 9.     ,         10.     .     ,    ,  :   ,   . PipelineRenderingCreateInfo   :       swapchainFormat.         beginRendering ( 7).

 10. vk::raii::Pipeline(device, nullptr, info)     pipeline cache.   ,    25.     :   SPIR-V     .        .        (   25).

.  .   ,  . ,        ,   .  (, )     push constants,     .

.   ,  ?  :  colorWriteMask,  frontFace (   ),   viewport.   cullMode = eNone.   ,    .

.     .              .  vkCreateGraphicsPipelines      .        25.




  6


  =  +   + layout +  . .

 Viewport  scissor   .

 cullMode + frontFace     .

 colorWriteMask = RGBA,    .

 Dynamic rendering: PipelineRenderingCreateInfo  pNext, renderPass = nullptr.

 Shader module      .




   


 6.1. .   ,    (ePolygonMode::eLine),       F1.              3?     ?

 6.2. .    (alpha blending):  =  ? ? +  ? (1 ? ?).    PipelineColorBlendAttachmentState.    ,    ?         ?

    A.




 7.  :    GPU



,   GPU,     : , , , .     CPU, GPU     .        ( 21).        .




7.1. ,    


   ,    .       ,     . ,   graphics-,    transfer-.

     :












    Pending:     GPU.       ,  ,  .      0  waitForFences.




7.2. Layout    


GPU    -    ,    :   ,      ,     .    layout.          layout.     ,     GPU.

     :












      15.   :   ,   ,   X  ,   ,  ,    Y.




7.3. 































7.4. 


 1.    ,       .  f(a, b, c, d, e, f)      .   designated initializers    .   .srcStage  .dstStage   :      .

ImageMemoryBarrier2  pipelineBarrier2   synchronization2.   API        .       ,    . subresourceRange ,    :    mip   .    mip- ( 13)  .

 2.  eResetCommandBuffer      (cmd.reset()  drawFrame).       .   22      ,  . allocateCommandBuffers  std::vector<vk::raii::CommandBuffer>.           . ePrimary  ,     .  secondary    21.

 3. eOneTimeSubmit  :       .       .       .

 4.  . oldLayout = eUndefined :    ,      .     ePresentSrcKHR   .   : srcStage = eColorAttachmentOutput   ,   submit   imageAvailable ( 0,  5).       :  layout   ,     .   eTopOfPipe      ,   .

 5. Dynamic rendering     :

 RenderingAttachmentInfo   ,   . loadOp ,       : eClear ( ), eLoad ()  eDontCare (). storeOp ,   .   GPU     load/store       .

 vk::ClearColorValue(r, g, b, a)   (union)  float/int/uint .    Vulkan-Hpp  ,    .      : sRGB-   .

 RenderingInfo    : ,  ,   ,  ( 14).

 6.  .  : bindPipeline  setViewport,    viewport .       ,   . setViewport(0, viewport)       viewport,   ArrayProxy,       . draw(3, 1, 0, 0)       SV_VertexID = 0, 1, 2.

 7.  :      (srcAccess = eColorAttachmentWrite),      ePresentSrcKHR.    :     renderFinished.      ,      layout.     ,      .      .

.     . cmd.draw      ,   .    submit,    fence   .

.    beginRendering      PipelineRenderingCreateInfo .   swapchain   (     HDR-)     .

.     ,   ,   .            :  ,      .    21 :    .     GPU  ,     .




  7


  ? .     .

 : Initial ? Recording ? Executable ? Pending.  Pending   .

 :  (Undefined ? ColorAttachment) ? beginRendering ? pipeline, viewport, scissor, draw ? endRendering ?  (ColorAttachment ? PresentSrc).

 loadOp: Clear / Load / DontCare. storeOp: Store / DontCare.

 srcStage   =    acquire.

   =    .




   


 7.1.  .  ,        3 .  std::chrono::steady_clock.        ,   ?   steady_clock,   system_clock?

 7.2. .   :       ,   beginRendering.  :  ,  viewport   ,  scissor   ?  ?

    A.




 8.  I:   



   : instance, , swapchain, , .        .        .      , .       .




8.1.   











    . Binary semaphore  :  signal,  wait.  signal   wait    . Wait   signal     .   IV  timeline-   .   acquire  present   .




8.2. :  











. clear()      9,     . emplace_back(device, info)  RAII-   .   SemaphoreCreateInfo{}   sType,     :      .  eSignaled ,   ,   drawFrame,   fence.     ,       .




8.3.   : pepelac.hpp


   ,  ,     28.        .

























8.4.    



























.

  3.          .    ,   ,     .  , , , createGraphicsPipeline  ?   ,  ~Pepelac  ,         .  ,  if (initialized).     RAII.

 explicit Pepelac(GLFWwindow*)        .   ,  const Pepelac&,  -    Vulkan-. ,   .

  4. steady_clock   ,       .    . duration<double>     .     ,    : glfwSetWindowTitle      .

  5.  :  ? .     drawFrame:  FIFO    acquireNextImage   fence,  CPU  .  sleep  .

  renderer  waitIdle    Vulkan  .   ,  GLFW.    main   .




8.5. 


,     -    ,       .   .      ( FIFO)    ( MAILBOX).

   ,   :

1.   ?      ,      .

2.  ,   ? colorWriteMask, frontFace,   .

3.   ?    7    submit2.

4.     ? Fence   eSignaled     submit2.

5.   ?   RenderDoc  ,     ( 28).

.    Vulkan      :       .      .   

.    device.waitIdle()  queue.waitIdle()     .     CPU  GPU,      . waitIdle         swapchain,     .

.     .     ,      vk::OutOfDateKHRError. Swapchain     ,        .

.       ,     . CPU  GPU    , fence    ,  join  .    ,              data race,    16    CPU.




  8


 Fence: GPU ? CPU,  ,   eSignaled.

 Binary semaphore: GPU ? GPU,   signal/wait.

 imageAvailable  inFlight      ; renderFinished    .

   ,      RAII.

 waitIdle     .

    ?  ?  ?  ?  ? RenderDoc.




   


 8.1.   .  waitForFences   fence   (getStatus())    ,   CPU   GPU.     FPS.     ,    ?     FIFO?

 8.2.  .   graphicsQueue.waitIdle()   drawFrame,     .    CPU/GPU  CPU = 4   GPU = 10    FPS    .            ?

    A.




 9.  swapchain: ,   



 ,          . Swapchain    ,    ,     .       :  ,       fence.




9.1.  Vulkan   











    ,          out-of-date.   swapchain  0?0   .




9.2. : 


     createSwapchain   4:












  :



















   2  6  drawFrame:












    installResizeCallback(), recreateSwapchain()   bool framebufferResized = false;. installResizeCallback()    .




9.3. 


  createSwapchain.  oldSwapchain  ,   swapchain  .           .      swapchain = vk::raii::SwapchainKHR(device, info);.  C++     ( ),        .       ,    . RAII    .

 1  callback. GLFW  C-      .     : glfwSetWindowUserPointer     . Callback    ,       . this      static_cast.  this    ,   Pepelac   ,  :        .  callback   . Callback   glfwPollEvents,    ,    swapchain     .

 2   .     0?0,  swapchain    . glfwWaitEvents()      ,       .     .   IV      ,        .

 3  waitIdle.  ,   :     ,     .            view.

 4   view. View   ,    swapchain.     ,   swapchain      . vector::clear()    raii::ImageView.      0     .

 56.     4  ,  oldSwapchain.      : viewport  scissor       .      ,  .   ,             .

 7  .  swapchain     ,  renderFinished  imageIndex.         . waitIdle   GPU,    .   present      ,    .     VK_KHR_swapchain_maintenance1  fence  present.  Roadmap 2026      swapchain,         .

  2 drawFrame. acquireNextImage  vk::OutOfDateKHRError   vk::SystemError.   ,     :     .       0: fence    acquire.    return : fence  ,    drawFrame   1  .       0  .

  6. Suboptimal   ,   .   present,          acquire  .  framebufferResized     :  ,  .

.    swapchain,   : image views ,     ,    .   14      :       .

.    eErrorOutOfDateKHR :        ,    .    callback  : out-of-date     ,      .   .

.  swapchain    . -, device.waitIdle() ,              . -,          view.   IV   :     ,      .




  9


 : OutOfDateKHRError (), eSuboptimalKHR, callback ,  0?0.

 :   ? waitIdle ?  views ?  swapchain  oldSwapchain ? views ? (,   ).

 swapchain = vk::raii::SwapchainKHR(...)      .

 Suboptimal    present.

 Callback    .

 Fence   acquire,   return  .




   


 9.1.   .      F11  glfwSetWindowMonitor.     swapchain?    recreateSwapchain()   callback ?        ?

 9.2.  .  :    (       14)    swapchain,    ,     .  recreateSwapchain ,           ,  .

    A.




 II.   



   ,          .      ,  .




 10.  GPU: ,   ,    



 C++   new,    .  Vulkan   ,   :   GPU,   CPU  - .     ,     .         .         .       VMA.




10.1.    


     (heaps)    ,         .   :












    ,     DEVICE_LOCAL | HOST_VISIBLE. :    ,       .

   . HOST_COHERENT ,   CPU   GPU   vkFlushMappedMemoryRanges. HOST_CACHED    CPU .           .




10.2.     (   )











 ,   .    3:  maxMemoryAllocationCount     4096.             .        .     64256     ,  alignment   .   ,   VMA.




10.3. VMA  RAII-


VMA        AMD,  -. : find_package(VulkanMemoryAllocator CONFIG REQUIRED)  GPUOpen::VulkanMemoryAllocator  target_link_libraries.       .cpp:










































.

  1. VmaAllocatorCreateInfo  C-,  designated initializers    . VMA    C,   Vulkan-Hpp   C-  static_cast.  Vulkan VMA   ,      Vulkan::Vulkan   1.  ,        Unique   1.

  2. vmaCreateBuffer      10.2        . VMA_MEMORY_USAGE_AUTO   :      ,   .      , CPU   ,  VMA  .  VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT  CPU   , VMA    . VMA_ALLOCATION_CREATE_MAPPED_BIT     ,    pMappedData.

   std::exchange    .     ,      .     double free.

  3. std::span<const std::byte>     .         std::as_bytes(std::span{vec}).       .         ,   ASan   . vmaCopyMemoryToAllocation   flush,  VMA   .  memcpy  mapped()   ,   vmaFlushAllocation.




10.4. Staging:     


CPU      .      :




























.

  4. immediateSubmit    GPU  .       .   23        . std::function     .   ( )      GPU. Fence   eSignaled:       GPU.      : fence      ,       .

  5.  staging.     usage:  staging  eTransferSrc ( ),    eTransferDst ( )   .     ,    .      ([&]).  ,     ,  staging  result . return result;  :  NRVO  .

  Pepelac   GpuAllocator allocator;   .   createLogicalDevice  : allocator = GpuAllocator(instance, physicalDevice, device);.  GpuBuffer      ,     .

.    VkDeviceMemory   :    4096 .   VMA:  GPU =  ; CPU  = HOST_ACCESS_SEQUENTIAL_WRITE; CPU  = HOST_ACCESS_RANDOM;   = + MAPPED.

.  GpuBuffer      ,   GPU.  createDeviceLocalBuffer    waitForFences.      ,      ,    use-after-free  GPU.  ( )    22.

. VMA   :   ,       .  VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT     ,     :   IV    -.   immediateSubmit  :       ,     .




  10


  =  ,  =   .      memoryTypeBits.

  : buffer ? requirements ? allocate ? bind.   ~4096.

 VMA:  , vmaCreateBuffer, VMA_MEMORY_USAGE_AUTO + -.

 Staging: host-visible TransferSrc ? copyBuffer ? device-local TransferDst.

 vmaCopyMemoryToAllocation  flush .  memcpy   .

  : device ? allocator ? .




   


 10.1.  .   createDeviceLocalBuffer(std::span<const T> items, usage),           .   .      std::vector<std::string>       ?

 10.2. ReBAR    .    Resizable BAR       CPU,  staging  .   VMA_ALLOCATION_CREATE_HOST_ACCESS_ALLOW_TRANSFER_INSTEAD_BIT   vmaGetAllocationMemoryProperties,     :     staging.

    A.




 11.    



             .       ,            . .         .




11.1.    


    :

 Binding   :  ,    (stride)    (      ).

 Attribute   :    (location),      .












     .    ,      .       .           ,  GPU      .   ,  .




11.2. :    











.

  1.    GLM-. glm::vec2   float, 8 ; glm::vec3   float, 12 .    4 ,       20.

  2. stride = sizeof(Vertex)        . eVertex      , eInstance     ( 11.1).  constexpr:  Vulkan-Hpp     .

  3. location    [[vk::location(N)]]  .       ,     : eR32G32Sfloat    32- float,    . offsetof(Vertex, color)      (8).       .    {{  }}  ,  std::array      .




  .


   .

   ,     (https://www.litres.ru/book/aleksey-primak/vulkan-i-mnogopotochnost-dlia-smertnykh-ili-kak-zastavit-ra-74727397/)  .

      Visa, MasterCard, Maestro,    ,   ,     ,  PayPal, WebMoney, ., QIWI ,       .


