{"id":472888,"date":"2025-09-01T21:00:09","date_gmt":"2025-09-01T21:00:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=472888"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=472888","title":{"rendered":"<span>Vulkan \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Rust. \u0427\u0430\u0441\u0442\u044c 1<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/981\/00f\/10d\/98100f10d9c516e8a4648092ed8d1f01.jpg\" alt=\"\" title=\"\" width=\"2925\" height=\"1615\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/981\/00f\/10d\/98100f10d9c516e8a4648092ed8d1f01.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/981\/00f\/10d\/98100f10d9c516e8a4648092ed8d1f01.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0432\u044b\u0432\u043e\u0434\u0443 \u0446\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0432 Vulkan c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ash. \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u043b \u0434\u0435\u043b\u043e \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043b\u0438\u0431\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 api, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Vulkan &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0440\u0443\u0442\u044b\u0445 \u0444\u0438\u0447 \u043e\u0442 GPU<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 vulkan device<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0439 Vulkan<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 AppInfo&lt;&#8216;_&gt;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0435\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Instance<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0435\u0432 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 rust<\/p>\n<pre><code class=\"bash\">cargo new --bin CryEngine<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c<\/p>\n<pre><code class=\"bash\">cargo add ash<\/code><\/pre>\n<pre><code class=\"rust\">use ash::Entry; use ash::vk::*;  fn main() {      \/*        \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Vulkan, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e load \u0438\u043b\u0438        \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e linked \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c features         \u0434\u043b\u044f ash     *\/     let entry = unsafe { Entry::load().unwrap() };      \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e VK_API_VERSION     let version = unsafe {          entry.try_enumerate_instance_version()        .expect(\"Error enumerate instance version\")      };      let api_version = match version {         \/\/ \u0422\u0443\u0442 \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u043e\u0432\u0435\u0435 \u0432\u0435\u0440\u0441\u0438\u044f 1.1+         Some(version) =&gt; {             version         },         \/\/ \u0415\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f         None =&gt; {             API_VERSION_1_0         }     }; } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 ApplicationInfo&lt;&#8216;_&gt;, \u043e\u043d\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Vulkan Instance<\/p>\n<pre><code class=\"rust\"> use ash::Entry; use ash::vk::*;  fn main() {      let entry = unsafe { Entry::load().unwrap() };      \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e     let version = unsafe {          entry.try_enumerate_instance_version()        .expect(\"Error enumerate instance version\")      };      \/\/ \u0412\u044b\u0431\u043e\u0440 \u0432\u0435\u0440\u0441\u0438\u0438     let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      \/*          \u0421\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0437\u0434\u0435\u0441\u044c - \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f vulkan, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c,          \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0435 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u0411\u0443\u043a\u0432\u0430 \"\u0441\" \u043f\u0435\u0440\u0435\u0434 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442          \u0435\u0451 \u0432 CStr \u0441\u0442\u0440\u043e\u043a\u0443     *\/       let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);  } <\/code><\/pre>\n<p><strong>Layers and Extensions<\/strong><\/p>\n<p>\u0412 Vulkan \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u043e\u0438(Layers). Layers &#8212; \u044d\u0442\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Vulkan API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Vulkan. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438: <a href=\"https:\/\/docs.vulkan.org\/guide\/latest\/layers.html\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.vulkan.org\/guide\/latest\/layers.html<\/a><\/p>\n<pre><code class=\"rust\"> use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };     let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\")};      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");     for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     } }<\/code><\/pre>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0441\u043b\u043e\u0438:<\/p>\n<pre><code class=\"bash\">\"VK_LAYER_AMD_switchable_graphics\" \"VK_LAYER_VALVE_steam_overlay\" \"VK_LAYER_VALVE_steam_fossilize\" \"VK_LAYER_OBS_HOOK\" \"VK_LAYER_RENDERDOC_Capture\" \"VK_LAYER_LUNARG_api_dump\" \"VK_LAYER_LUNARG_gfxreconstruct\" \"VK_LAYER_KHRONOS_synchronization2\" \"VK_LAYER_KHRONOS_validation\" \"VK_LAYER_LUNARG_monitor\" \"VK_LAYER_LUNARG_screenshot\" \"VK_LAYER_KHRONOS_profiles\" \"VK_LAYER_KHRONOS_shader_object\" \"VK_LAYER_LUNARG_crash_diagnostic\"<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f &#8212; VK_LAYER_KHRONOS_validation, \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Vulkan<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f extensions(\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f), \u043e\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 Vulkan<\/p>\n<pre><code class=\"rust\">use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };      let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\")};      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          \/\/\/ \u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c None, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0445, \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c          \/\/\/ \u043e\u0431 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f, \u043d\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");     for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");     for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\"); }<\/code><\/pre>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Window OS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439<\/p>\n<pre><code class=\"bash\">\"VK_KHR_device_group_creation\" \"VK_KHR_external_fence_capabilities\" \"VK_KHR_external_memory_capabilities\" \"VK_KHR_external_semaphore_capabilities\" \"VK_KHR_get_physical_device_properties2\" \"VK_KHR_get_surface_capabilities2\" \"VK_KHR_surface\" \"VK_KHR_win32_surface\" \"VK_EXT_debug_report\" \"VK_EXT_debug_utils\" \"VK_EXT_swapchain_colorspace\" \"VK_KHR_portability_enumeration\" \"VK_LUNARG_direct_driver_loading\" <\/code><\/pre>\n<p>\u0418\u0437 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u044f \u0432\u044b\u0434\u0435\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e 4 \u043d\u0443\u0436\u043d\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p> &#171;VK_KHR_surface&#187; &#8212; \u041f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. Vulkan \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 FrameBuffre \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e \u0441\u0430\u043c\u043e \u043e\u043a\u043d\u043e \u043e\u0441<\/p>\n<\/li>\n<li>\n<p> &#171;VK_KHR_win32_surface&#187; &#8212; \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 Windows<\/p>\n<\/li>\n<li>\n<p> &#171;VK_EXT_debug_report&#187; &#8212; \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<\/li>\n<li>\n<p> &#171;VK_EXT_debug_utils&#187;  &#8212; \u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c InstanceCreateInfo&lt;&#8216;_&gt; \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u0430\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0441\u043b\u043e\u044f\u043c\u0438<\/p>\n<pre><code class=\"rust\"> use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };      let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };       println!(\"------------Layers---------------\");      for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");      for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\");      \/\/\/ \u0411\u0435\u0440\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f!     let required_extensions = [         CStr::from_bytes_with_nul(b\"VK_KHR_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_KHR_win32_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_report\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_utils\\0\").unwrap().as_ptr(),     ];      \/\/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u043b\u043e\u0438!     let required_layers = [         CStr::from_bytes_with_nul(b\"VK_LAYER_KHRONOS_validation\\0\").unwrap().as_ptr(),     ];      let instance_info = InstanceCreateInfo::default()         .enabled_extension_names(&amp;required_extensions)         .enabled_layer_names(&amp;required_layers)         .application_info(&amp;app_info);      let instance = unsafe {         \/\/ \u0412\u043c\u0435\u0441\u0442\u043e None \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e callback \u0444\u0443\u043d\u043a\u0446\u0438\u044e         entry.create_instance(&amp;instance_info, None)         .map_err(|e| format!(\"Error create insatnce with errror: {}\", e))         .unwrap()     }; } <\/code><\/pre>\n<p><strong>Device(\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e)<\/strong><\/p>\n<p>Device &#8212; \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e device \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440\u044b, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 GPU \u0438 \u0436\u0434\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430 Instance, \u0442\u0430\u043a \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043b\u043e\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0435\u0433\u043e, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0443\u044e(\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e) GPU<\/p>\n<pre><code class=\"rust\">use ash::Entry; use ash::vk::*;  fn main() {      let entry = unsafe { Entry::load().unwrap() };     let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");      for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");      for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\");      let extension_names = extensions         .iter()         .map(|x| x.extension_name.as_ptr())         .collect::&lt;Vec&lt;*const i8&gt;&gt;();      let layer_names = layers         .iter()         .map(|x| x.layer_name.as_ptr())         .collect::&lt;Vec&lt;*const i8&gt;&gt;();      let instance_info = InstanceCreateInfo::default()         .enabled_extension_names(&amp;extension_names)         .enabled_layer_names(&amp;layer_names)         .application_info(&amp;app_info);      let instance = unsafe {         entry.create_instance(&amp;instance_info, None)         .map_err(|e| format!(\"Error create insatnce with errror: {}\", e))         .unwrap()     };      \/\/  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430     let phys_devs = unsafe { instance.enumerate_physical_devices().expect(\"Error enumerate Physical Devices\")};      let mut phsy_dev_index = 0;      println!(\"-------------Available GPU-------------------\");     for (index, i) in phys_devs.iter().enumerate() {          \/\/ \u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430         let prop = unsafe { instance.get_physical_device_properties(*i) };          \/\/ \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u043e\u0431\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e         println!(\"DEVICE_NAME:        {:?}\", prop.device_name_as_c_str().unwrap_or(&amp;c\"Undefined\"));         println!(\"VULKAN_API_VERSION: {:?}\", prop.api_version);         println!(\"DEVICE_TYPE:        {:?}\", prop.device_type);         println!(\"DRIVER VERSION:     {:?}\", prop.driver_version);          if prop.device_type == PhysicalDeviceType::INTEGRATED_GPU {             phsy_dev_index = index;             break;         }     } } <\/code><\/pre>\n<p><strong>QueueFamily<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0448\u0435\u043c GPU, \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u0430\u043a\u043e\u0439 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a Queue Familes(\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439). \u0423 GPU \u0435\u0441\u0442\u044c \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 Queue(\u041e\u0447\u0435\u0440\u0435\u0434\u0438) \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u041e\u0434\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c, \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 CPU \u043d\u0430 GPU, \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439. <u>\u0421\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441 \u043e\u0434\u043d\u0438\u043c\u0438 \u0438 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/u> \u041f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<pre><code class=\"rust\"> use std::ffi::CStr; use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };      let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");      for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");      for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\");      let required_extensions = [         CStr::from_bytes_with_nul(b\"VK_KHR_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_KHR_win32_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_report\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_utils\\0\").unwrap().as_ptr(),     ];      let required_layers = [         CStr::from_bytes_with_nul(b\"VK_LAYER_KHRONOS_validation\\0\").unwrap().as_ptr(),     ];      let instance_info = InstanceCreateInfo::default()         .enabled_extension_names(&amp;required_extensions)         .enabled_layer_names(&amp;required_layers)         .application_info(&amp;app_info);      let instance = unsafe {         entry.create_instance(&amp;instance_info, None)         .map_err(|e| format!(\"Error create insatnce with errror: {}\", e))         .unwrap()     };      let phys_devs = unsafe { instance.enumerate_physical_devices().expect(\"Error enumerate Physical Devices\") };     let mut phys_dev_index = 0;      println!(\"-------------Avaliable GPU-------------------\");     for (index, i) in phys_devs.iter().enumerate() {          let prop = unsafe { instance.get_physical_device_properties(*i) };         println!(\"DEVICE_NAME:        {:?}\", prop.device_name_as_c_str().unwrap_or(&amp;c\"Undefined\"));         println!(\"VULKAN_API_VERSION: {:?}\", prop.api_version);         println!(\"DEVICE_TYPE:        {:?}\", prop.device_type);         println!(\"DRIVER VERSION:     {:?}\", prop.driver_version);          if prop.device_type == PhysicalDeviceType::INTEGRATED_GPU {             phys_dev_index = index;             break;         }     }      let phys_dev = phys_devs[phys_dev_index];      \/\/\/ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0430\u043c\u044f\u0442\u0438     let memory_prop = unsafe { instance.get_physical_device_memory_properties(phys_dev) };     \/\/\/ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430\u0445 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439     let queue_family_prop = unsafe { instance.get_physical_device_queue_family_properties(phys_dev) };     \/\/\/ \u041e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e GPU     let phys_prop = unsafe { instance.get_physical_device_properties(phys_dev) };      \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u0441\u0432\u043e\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443     struct QueueFamilyInfo {         queue_family_index: usize,         queue_prop: QueueFamilyProperties     }      let mut queue_infos = vec![];      for (index, i) in queue_family_prop.iter().enumerate() {         println!(\"Queue Family: {}: Queue Count: {:?}, Flags: {:?}\", index, i.queue_count, i.queue_flags);         queue_infos.push(QueueFamilyInfo {             queue_family_index: index,             queue_prop: *i         });     } } <\/code><\/pre>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0432\u044b\u0432\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code class=\"bash\">Queue Family: 0: Queue Count: 1, Flags: GRAPHICS | COMPUTE | TRANSFER | SPARSE_BINDING Queue Family: 1: Queue Count: 2, Flags: COMPUTE | TRANSFER | SPARSE_BINDING Queue Family: 2: Queue Count: 1, Flags: TRANSFER | SPARSE_BINDING<\/code><\/pre>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043a\u0430\u043a \u043e\u0434\u043d\u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0442\u0430\u043a \u0438 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 1-2 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043e\u043d\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438, \u0447\u0435\u043c \u043e\u0431\u0449\u0438\u0435.<\/p>\n<p><strong>Priority<\/strong><\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043f\u043e\u043c\u0438\u043c\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0430\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0435, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0440\u0430\u0432\u043d\u044b\u043c\u0438. \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u043d\u0443\u0436\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u043c\u043e\u0433 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0437\u0436\u0435. <\/p>\n<pre><code class=\"rust\"> use std::ffi::CStr; use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };      let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");      for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");      for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\");      let required_extensions = [         CStr::from_bytes_with_nul(b\"VK_KHR_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_KHR_win32_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_report\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_utils\\0\").unwrap().as_ptr(),     ];      let required_layers = [         CStr::from_bytes_with_nul(b\"VK_LAYER_KHRONOS_validation\\0\").unwrap().as_ptr(),     ];      let instance_info = InstanceCreateInfo::default()         .enabled_extension_names(&amp;required_extensions)         .enabled_layer_names(&amp;required_layers)         .application_info(&amp;app_info);      let instance = unsafe {         entry.create_instance(&amp;instance_info, None)         .map_err(|e| format!(\"Error create insatnce with errror: {}\", e))         .unwrap()     };      let phys_devs = unsafe { instance.enumerate_physical_devices().expect(\"Error enumerate Physical Devices\") };     let mut phys_dev_index = 0;      println!(\"-------------Avaliable GPU-------------------\");     for (index, i) in phys_devs.iter().enumerate() {          let prop = unsafe { instance.get_physical_device_properties(*i) };         println!(\"DEVICE_NAME:        {:?}\", prop.device_name_as_c_str().unwrap_or(&amp;c\"Undefined\"));         println!(\"VULKAN_API_VERSION: {:?}\", prop.api_version);         println!(\"DEVICE_TYPE:        {:?}\", prop.device_type);         println!(\"DRIVER VERSION:     {:?}\", prop.driver_version);          if prop.device_type == PhysicalDeviceType::INTEGRATED_GPU {             phys_dev_index = index;             break;         }     }      let phys_dev = phys_devs[phys_dev_index];      let memory_prop = unsafe { instance.get_physical_device_memory_properties(phys_dev) };     let queue_family_prop = unsafe { instance.get_physical_device_queue_family_properties(phys_dev) };     let phys_prop = unsafe { instance.get_physical_device_properties(phys_dev) };      struct QueueFamilyInfo {         queue_family_index: usize,         queue_prop: QueueFamilyProperties     }      let mut queue_infos = vec![];      for (index, i) in queue_family_prop.iter().enumerate() {         println!(\"Queue Family: {}: Queue Count: {:?}, Flags: {:?}\", index, i.queue_count, i.queue_flags);         queue_infos.push(QueueFamilyInfo {             queue_family_index: index,             queue_prop: *i         });     }      \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u0432 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u0435     let priority = [1.0f32];     let mut queue_family_infos = vec![];      for i in queue_infos {          let device_queue_info = DeviceQueueCreateInfo::default()             .queue_family_index(i.queue_family_index as u32)             .queue_priorities(&amp;priority);          queue_family_infos.push(device_queue_info)     }  } <\/code><\/pre>\n<p>Device Extensions and Layers<\/p>\n<p>\u0423 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 &#8212; \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 Swapchain(\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u043c\u0435\u043d\u0430)<\/p>\n<pre><code class=\"rust\"> use std::ffi::CStr; use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };     let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");     for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");     for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }     println!(\"---------------------------------\");      let required_extensions = [         CStr::from_bytes_with_nul(b\"VK_KHR_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_KHR_win32_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_report\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_utils\\0\").unwrap().as_ptr(),     ];      let required_layers = [         CStr::from_bytes_with_nul(b\"VK_LAYER_KHRONOS_validation\\0\").unwrap().as_ptr(),     ];      let instance_info = InstanceCreateInfo::default()         .enabled_extension_names(&amp;required_extensions)         .enabled_layer_names(&amp;required_layers)         .application_info(&amp;app_info);      let instance = unsafe {         entry.create_instance(&amp;instance_info, None)         .map_err(|e| format!(\"Error create insatnce with errror: {}\", e))         .unwrap()     };      let phys_devs = unsafe { instance.enumerate_physical_devices().expect(\"Error enumerate Physical Devices\") };     let mut phys_dev_index = 0;      println!(\"-------------Avaliable GPU-------------------\");     for (index, i) in phys_devs.iter().enumerate() {          let prop = unsafe { instance.get_physical_device_properties(*i) };         println!(\"DEVICE_NAME:        {:?}\", prop.device_name_as_c_str().unwrap_or(&amp;c\"Undefined\"));         println!(\"VULKAN_API_VERSION: {:?}\", prop.api_version);         println!(\"DEVICE_TYPE:        {:?}\", prop.device_type);         println!(\"DRIVER VERSION:     {:?}\", prop.driver_version);          if prop.device_type == PhysicalDeviceType::INTEGRATED_GPU {             phys_dev_index = index;             break;         }     }      let phys_dev = phys_devs[phys_dev_index];      let memory_prop = unsafe { instance.get_physical_device_memory_properties(phys_dev) };     let queue_family_prop = unsafe { instance.get_physical_device_queue_family_properties(phys_dev) };     let phys_prop = unsafe { instance.get_physical_device_properties(phys_dev) };      struct QueueFamilyInfo {         queue_family_index: usize,         queue_prop: QueueFamilyProperties     }      let mut queue_infos = vec![];      for (index, i) in queue_family_prop.iter().enumerate() {         println!(\"Queue Family: {}: Queue Count: {:?}, Flags: {:?}\", index, i.queue_count, i.queue_flags);         queue_infos.push(QueueFamilyInfo {             queue_family_index: index,             queue_prop: *i         });     }      let priority = [1.0f32];     let mut queue_family_infos = vec![];      for i in queue_infos {          let device_queue_info = DeviceQueueCreateInfo::default()             .queue_family_index(i.queue_family_index as u32)             .queue_priorities(&amp;priority);          queue_family_infos.push(device_queue_info)     }      let extensions = unsafe { instance.enumerate_device_extension_properties(phys_dev).expect(\"Error enumerate device extensions\") };      println!(\"------------Device Extensions---------------------\");     for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      \/\/ \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e!     let required_extesions = [         CStr::from_bytes_with_nul(b\"VK_KHR_swapchain\\0\").unwrap().as_ptr()     ];      let layers = unsafe {          instance.enumerate_device_layer_properties(phys_dev)         .expect(\"Error enumerate device layers\")     };      println!(\"------------Device Layers---------------------\");     for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"-------------------------------------------------\");      \/\/ \u041f\u0443\u0441\u0442\u043e\u0439 features     let features = PhysicalDeviceFeatures::default();      \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438     let device_info = DeviceCreateInfo::default()         .enabled_features(&amp;features)         .queue_create_infos(&amp;queue_family_infos)         .enabled_extension_names(&amp;required_extesions);      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e     let device = unsafe {         instance.create_device(phys_dev, &amp;device_info, None).expect(\"Error create device\")     };   } <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451! \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043d\u043e\u0432\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0439, \u043d\u0435 \u043e\u0442\u043f\u0443\u0433\u043d\u0443\u043b \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0451\u043c &#8212; \u0434\u0430, \u0437\u0434\u0435\u0441\u044c \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u0447\u0435\u043c \u0432 \u0441\u0442\u0430\u0440\u044b\u0445 \u0434\u043e\u0431\u0440\u044b\u0445\u00a0<code>glBegin<\/code>\/<code>glEnd<\/code>, \u043d\u043e \u0437\u0430\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u00a0\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 GPU. \u0412\u0437\u044f\u0442\u044c \u0435\u0451 \u0437\u0430 \u0436\u0430\u0431\u0440\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c.  <\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/adrien-ben\/vulkan-tutorial-rs\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/adrien-ben\/vulkan-tutorial-rs<\/a> &#8212; \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043d\u0430 Rust<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/vulkan-tutorial.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/vulkan-tutorial.com\/<\/a> &#8212; \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044f\u0437\u044b\u043a C++<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/ash-rs\/ash\/tree\/master\/ash-examples\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/ash-rs\/ash\/tree\/master\/ash-examples<\/a> &#8212; \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439\u00a0<code>ash<\/code>  <\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/EmbarkStudios\/kajiya\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/EmbarkStudios\/kajiya<\/a> &#8212; \u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0432\u0438\u0436\u043e\u043a, \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Rust \u0431\u044b\u0432\u0448\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 Frostbite<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/olejaaaaaaaa\/VulkanExamples\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/olejaaaaaaaa\/VulkanExamples<\/a> &#8212; \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/942880\/\"> https:\/\/habr.com\/ru\/articles\/942880\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0432\u044b\u0432\u043e\u0434\u0443 \u0446\u0432\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0432 Vulkan c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 ash. \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u043b \u0434\u0435\u043b\u043e \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043b\u0438\u0431\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 api, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Vulkan &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0440\u0443\u0442\u044b\u0445 \u0444\u0438\u0447 \u043e\u0442 GPU<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 vulkan device<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0439 Vulkan<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 AppInfo&lt;&#8216;_&gt;<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0435\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 Instance<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0432\u044b\u0431\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u043b\u043e\u0435\u0432 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 rust<\/p>\n<pre><code class=\"bash\">cargo new --bin CryEngine<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c<\/p>\n<pre><code class=\"bash\">cargo add ash<\/code><\/pre>\n<pre><code class=\"rust\">use ash::Entry; use ash::vk::*;  fn main() {      \/*        \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Vulkan, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e load \u0438\u043b\u0438        \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e linked \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c features         \u0434\u043b\u044f ash     *\/     let entry = unsafe { Entry::load().unwrap() };      \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e VK_API_VERSION     let version = unsafe {          entry.try_enumerate_instance_version()        .expect(\"Error enumerate instance version\")      };      let api_version = match version {         \/\/ \u0422\u0443\u0442 \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u043e\u0432\u0435\u0435 \u0432\u0435\u0440\u0441\u0438\u044f 1.1+         Some(version) =&gt; {             version         },         \/\/ \u0415\u0441\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f         None =&gt; {             API_VERSION_1_0         }     }; } <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 ApplicationInfo&lt;&#8216;_&gt;, \u043e\u043d\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Vulkan Instance<\/p>\n<pre><code class=\"rust\"> use ash::Entry; use ash::vk::*;  fn main() {      let entry = unsafe { Entry::load().unwrap() };      \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e     let version = unsafe {          entry.try_enumerate_instance_version()        .expect(\"Error enumerate instance version\")      };      \/\/ \u0412\u044b\u0431\u043e\u0440 \u0432\u0435\u0440\u0441\u0438\u0438     let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      \/*          \u0421\u0430\u043c\u0430\u044f \u0432\u0430\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0437\u0434\u0435\u0441\u044c - \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f vulkan, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c,          \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0435 \u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u0411\u0443\u043a\u0432\u0430 \"\u0441\" \u043f\u0435\u0440\u0435\u0434 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442          \u0435\u0451 \u0432 CStr \u0441\u0442\u0440\u043e\u043a\u0443     *\/       let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);  } <\/code><\/pre>\n<p><strong>Layers and Extensions<\/strong><\/p>\n<p>\u0412 Vulkan \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u043e\u0438(Layers). Layers &#8212; \u044d\u0442\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b Vulkan API, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Vulkan. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438: <a href=\"https:\/\/docs.vulkan.org\/guide\/latest\/layers.html\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.vulkan.org\/guide\/latest\/layers.html<\/a><\/p>\n<pre><code class=\"rust\"> use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };     let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\")};      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");     for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     } }<\/code><\/pre>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0441\u043b\u043e\u0438:<\/p>\n<pre><code class=\"bash\">\"VK_LAYER_AMD_switchable_graphics\" \"VK_LAYER_VALVE_steam_overlay\" \"VK_LAYER_VALVE_steam_fossilize\" \"VK_LAYER_OBS_HOOK\" \"VK_LAYER_RENDERDOC_Capture\" \"VK_LAYER_LUNARG_api_dump\" \"VK_LAYER_LUNARG_gfxreconstruct\" \"VK_LAYER_KHRONOS_synchronization2\" \"VK_LAYER_KHRONOS_validation\" \"VK_LAYER_LUNARG_monitor\" \"VK_LAYER_LUNARG_screenshot\" \"VK_LAYER_KHRONOS_profiles\" \"VK_LAYER_KHRONOS_shader_object\" \"VK_LAYER_LUNARG_crash_diagnostic\"<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f &#8212; VK_LAYER_KHRONOS_validation, \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Vulkan<\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f extensions(\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f), \u043e\u043d\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 Vulkan<\/p>\n<pre><code class=\"rust\">use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };      let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\")};      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          \/\/\/ \u041c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c None, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u0445, \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c          \/\/\/ \u043e\u0431 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u044f, \u043d\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };      println!(\"-----------Layers--------------\");     for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");     for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\"); }<\/code><\/pre>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Window OS, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0443 \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439<\/p>\n<pre><code class=\"bash\">\"VK_KHR_device_group_creation\" \"VK_KHR_external_fence_capabilities\" \"VK_KHR_external_memory_capabilities\" \"VK_KHR_external_semaphore_capabilities\" \"VK_KHR_get_physical_device_properties2\" \"VK_KHR_get_surface_capabilities2\" \"VK_KHR_surface\" \"VK_KHR_win32_surface\" \"VK_EXT_debug_report\" \"VK_EXT_debug_utils\" \"VK_EXT_swapchain_colorspace\" \"VK_KHR_portability_enumeration\" \"VK_LUNARG_direct_driver_loading\" <\/code><\/pre>\n<p>\u0418\u0437 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u044f \u0432\u044b\u0434\u0435\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e 4 \u043d\u0443\u0436\u043d\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p> &#171;VK_KHR_surface&#187; &#8212; \u041f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. Vulkan \u043c\u043e\u0436\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 FrameBuffre \u043d\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e \u0441\u0430\u043c\u043e \u043e\u043a\u043d\u043e \u043e\u0441<\/p>\n<\/li>\n<li>\n<p> &#171;VK_KHR_win32_surface&#187; &#8212; \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 Windows<\/p>\n<\/li>\n<li>\n<p> &#171;VK_EXT_debug_report&#187; &#8212; \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<\/li>\n<li>\n<p> &#171;VK_EXT_debug_utils&#187;  &#8212; \u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c InstanceCreateInfo&lt;&#8216;_&gt; \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u0430\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0441\u043b\u043e\u044f\u043c\u0438<\/p>\n<pre><code class=\"rust\"> use ash::Entry; use ash::vk::*;  fn main() {       let entry = unsafe { Entry::load().unwrap() };      let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()         .application_name(c\"Far Cry 9\")         .engine_name(c\"Cry Engine\")         .engine_version(12)         .application_version(0)         .api_version(api_version);      let layers = unsafe { entry.enumerate_instance_layer_properties().expect(\"Error enumerate layers\") };      let extensions = unsafe {          entry.enumerate_instance_extension_properties(None).expect(\"Error enumerate instance properties\")     };       println!(\"------------Layers---------------\");      for i in &amp;layers {         println!(\"{:?}\", i.layer_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"------------Extensions------------\");      for i in &amp;extensions {         println!(\"{:?}\", i.extension_name_as_c_str().unwrap_or(&amp;c\"None\"));     }      println!(\"---------------------------------\");      \/\/\/ \u0411\u0435\u0440\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f!     let required_extensions = [         CStr::from_bytes_with_nul(b\"VK_KHR_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_KHR_win32_surface\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_report\\0\").unwrap().as_ptr(),         CStr::from_bytes_with_nul(b\"VK_EXT_debug_utils\\0\").unwrap().as_ptr(),     ];      \/\/\/ \u0422\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u043b\u043e\u0438!     let required_layers = [         CStr::from_bytes_with_nul(b\"VK_LAYER_KHRONOS_validation\\0\").unwrap().as_ptr(),     ];      let instance_info = InstanceCreateInfo::default()         .enabled_extension_names(&amp;required_extensions)         .enabled_layer_names(&amp;required_layers)         .application_info(&amp;app_info);      let instance = unsafe {         \/\/ \u0412\u043c\u0435\u0441\u0442\u043e None \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e callback \u0444\u0443\u043d\u043a\u0446\u0438\u044e         entry.create_instance(&amp;instance_info, None)         .map_err(|e| format!(\"Error create insatnce with errror: {}\", e))         .unwrap()     }; } <\/code><\/pre>\n<p><strong>Device(\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e)<\/strong><\/p>\n<p>Device &#8212; \u044d\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e device \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u0443\u0444\u0435\u0440\u044b, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 GPU \u0438 \u0436\u0434\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430 Instance, \u0442\u0430\u043a \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043b\u043e\u0438 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0435\u0433\u043e, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u0443\u044e(\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e) GPU<\/p>\n<pre><code class=\"rust\">use ash::Entry; use ash::vk::*;  fn main() {      let entry = unsafe { Entry::load().unwrap() };     let version = unsafe { entry.try_enumerate_instance_version().expect(\"Error enumerate instance version\") };      let api_version = match version {         Some(version) =&gt; {             version         },         None =&gt; {             API_VERSION_1_0         }     };      let app_info = ApplicationInfo::default()<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-472888","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/472888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=472888"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/472888\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=472888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=472888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=472888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}