Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.86 KB | None | 0 0
  1. use vulkan_lib :: error ; use std :: sync :: Arc ; use ash :: vk ; use ash ::
  2. version :: DeviceV1_0 ; pub struct Images {
  3. msaa_image : std :: sync :: Arc < vulkan_lib :: image :: IntermediaryImage > ,
  4. depth_image : std :: sync :: Arc < vulkan_lib :: image :: DepthImage > , }
  5. impl Images {
  6. pub fn new ( renderer : & vulkan_lib :: Renderer ) -> error :: Result < Self >
  7. {
  8. let depth_image = std :: sync :: Arc :: new (
  9. vulkan_lib :: image :: DepthImage :: new (
  10. renderer . device ( ) . clone ( ) , renderer . swapchain ( ) . clone ( ) ,
  11. renderer . allocator ( ) . clone ( ) , renderer . setup_command_buffer ( )
  12. . clone ( ) , renderer . samples ( ) , vk :: Format :: from_raw ( 124i32 ) )
  13. ? ) ; Ok (
  14. Images {
  15. msaa_image : std :: sync :: Arc :: new (
  16. vulkan_lib :: image :: IntermediaryImage :: new (
  17. renderer . device ( ) . clone ( ) , renderer . swapchain ( ) . clone ( ) ,
  18. renderer . allocator ( ) . clone ( ) , renderer . setup_command_buffer ( )
  19. . clone ( ) , renderer . samples ( ) , vk :: Format :: R32G32B32A32_SFLOAT ,
  20. ) ? ) , depth_image : depth_image , } ) } pub fn msaa_image ( & self ) -> std
  21. :: sync :: Arc < vulkan_lib :: image :: IntermediaryImage > {
  22. self . msaa_image . clone ( ) } # [ inline ] pub fn depth_image ( & self ) ->
  23. Arc < vulkan_lib :: image :: DepthImage > { self . depth_image . clone ( ) }
  24. } # [ derive ( Default ) ] struct MainPipeline {
  25. descriptor_sizes : Vec < vk :: DescriptorPoolSize > , desc_layout_bindings :
  26. Vec < vk :: DescriptorSetLayoutBinding > , descriptor_pool_info : Option < vk
  27. :: DescriptorPoolCreateInfo > , descriptor_info : Option < vk ::
  28. DescriptorSetLayoutCreateInfo > , desc_set_layouts : Vec < vk ::
  29. DescriptorSetLayout > , desc_alloc_info : Option < vk ::
  30. DescriptorSetAllocateInfo > , descriptor_sets : Vec < vk :: DescriptorSet > ,
  31. layout_create_info : Option < vk :: PipelineLayoutCreateInfo > ,
  32. pipeline_layout : Option < vk :: PipelineLayout > , write_desc_sets : Vec < vk
  33. :: WriteDescriptorSet > , vertex : Option < vulkan_lib :: shader :: Shader > ,
  34. fragment : Option < vulkan_lib :: shader :: Shader > ,
  35. shader_stage_create_infos : Vec < vk :: PipelineShaderStageCreateInfo > ,
  36. vertex_input_state_info : Option < vk :: PipelineVertexInputStateCreateInfo >
  37. , vertex_input_assembly_state_info : Option < vk ::
  38. PipelineInputAssemblyStateCreateInfo > , rasterization_info : Option < vk ::
  39. PipelineRasterizationStateCreateInfo > , color_blend_attachment_states : Vec <
  40. vk :: PipelineColorBlendAttachmentState > , color_blend_state : Option < vk ::
  41. PipelineColorBlendStateCreateInfo > , depth_state_info : Option < vk ::
  42. PipelineDepthStencilStateCreateInfo > , dynamic_state : Vec < vk ::
  43. DynamicState > , dynamic_state_info : Option < vk ::
  44. PipelineDynamicStateCreateInfo > , multisample_state_info : Option < vk ::
  45. PipelineMultisampleStateCreateInfo > , viewports : Vec < vk :: Viewport > ,
  46. scissors : Vec < vk :: Rect2D > , viewport_state_info : Option < vk ::
  47. PipelineViewportStateCreateInfo > , desc_0 : Option < vk ::
  48. DescriptorBufferInfo > , ubo : Option < vulkan_lib :: buffer :: CpuBuffer > ,
  49. desc_1 : Option < vk :: DescriptorImageInfo > , texture : Option < vulkan_lib
  50. :: texture :: Texture > , } impl MainPipeline {
  51. pub fn new (
  52. renderer : & vulkan_lib :: Renderer , images : std :: sync :: Arc < Images > ,
  53. texture : vulkan_lib :: texture :: Texture ) -> vulkan_lib :: error :: Result
  54. < Self > {
  55. let descriptor_sizes = vec ! [
  56. vk :: DescriptorPoolSize {
  57. ty : vk :: DescriptorType :: UNIFORM_BUFFER , descriptor_count : 1 , } , vk ::
  58. DescriptorPoolSize {
  59. ty : vk :: DescriptorType :: COMBINED_IMAGE_SAMPLER , descriptor_count : 1 , }
  60. ] ; let desc_layout_bindings = vec ! [
  61. vk :: DescriptorSetLayoutBinding {
  62. binding : 0u32 , descriptor_type : vk :: DescriptorType :: UNIFORM_BUFFER ,
  63. descriptor_count : 1 , stage_flags : vk :: ShaderStageFlags :: FRAGMENT | vk
  64. :: ShaderStageFlags :: VERTEX , .. Default :: default ( ) } , vk ::
  65. DescriptorSetLayoutBinding {
  66. binding : 1u32 , descriptor_type : vk :: DescriptorType ::
  67. COMBINED_IMAGE_SAMPLER , descriptor_count : 1 , stage_flags : vk ::
  68. ShaderStageFlags :: FRAGMENT , .. Default :: default ( ) } ] ; let mut this =
  69. Self { descriptor_sizes , desc_layout_bindings , .. Default :: default ( ) }
  70. ; this . descriptor_pool_info = Some (
  71. vk :: DescriptorPoolCreateInfo :: builder ( ) . pool_sizes (
  72. & this . descriptor_sizes ) . max_sets ( 4u32 ) . build ( ) ) ; let
  73. descriptor_pool = unsafe {
  74. renderer . device ( ) . device ( ) . create_descriptor_pool (
  75. this . descriptor_pool_info . as_ref ( ) . unwrap ( ) , None ) } ? ; this .
  76. descriptor_info = Some (
  77. vk :: DescriptorSetLayoutCreateInfo :: builder ( ) . bindings (
  78. & this . desc_layout_bindings [ .. ] ) . build ( ) ) ; this .
  79. desc_set_layouts . push (
  80. unsafe {
  81. renderer . device ( ) . device ( ) . create_descriptor_set_layout (
  82. this . descriptor_info . as_ref ( ) . unwrap ( ) , None ) } ? ) ; this .
  83. desc_alloc_info = Some (
  84. vk :: DescriptorSetAllocateInfo :: builder ( ) . descriptor_pool (
  85. descriptor_pool ) . set_layouts ( & this . desc_set_layouts [ .. ] ) . build (
  86. ) ) ; let mut descriptor_sets = unsafe {
  87. renderer . device ( ) . device ( ) . allocate_descriptor_sets (
  88. this . desc_alloc_info . as_ref ( ) . unwrap ( ) ) } ? ; this .
  89. descriptor_sets . append ( & mut descriptor_sets ) ; this . layout_create_info
  90. = Some (
  91. vk :: PipelineLayoutCreateInfo :: builder ( ) . set_layouts (
  92. & this . desc_set_layouts [ .. ] ) . build ( ) ) ; this . pipeline_layout =
  93. Some (
  94. unsafe {
  95. renderer . device ( ) . device ( ) . create_pipeline_layout (
  96. this . layout_create_info . as_ref ( ) . unwrap ( ) , None ) } ? ) ; this .
  97. ubo = Some (
  98. vulkan_lib :: buffer :: CpuBuffer :: new (
  99. renderer . allocator ( ) . clone ( ) , None , vk :: BufferUsageFlags ::
  100. UNIFORM_BUFFER , std :: mem :: size_of :: < super :: MyUBO > ( ) as u64 ) ? )
  101. ; this . desc_0 = Some (
  102. vk :: DescriptorBufferInfo {
  103. buffer : * this . ubo ( ) . buffer ( ) , offset : 0 , range : this . ubo (
  104. ) . size ( ) as u64 } ) ; this . texture = Some ( texture ) ; this . desc_1 =
  105. Some (
  106. vk :: DescriptorImageInfo {
  107. image_layout : vk :: ImageLayout :: SHADER_READ_ONLY_OPTIMAL , image_view :
  108. this . texture ( ) . image_view ( ) , sampler : this . texture ( ) .
  109. sampler ( ) , } ) ; this . write_desc_sets = vec ! [
  110. vk :: WriteDescriptorSet {
  111. dst_set : this . descriptor_sets [ 0 ] , dst_binding : 0u32 , descriptor_count
  112. : 1 , descriptor_type : vk :: DescriptorType :: UNIFORM_BUFFER , p_buffer_info
  113. : this . desc_0 . as_ref ( ) . unwrap ( ) , .. Default :: default ( ) } ,
  114. vk :: WriteDescriptorSet {
  115. dst_set : this . descriptor_sets [ 0 ] , dst_binding : 1u32 , descriptor_count
  116. : 1 , descriptor_type : vk :: DescriptorType :: COMBINED_IMAGE_SAMPLER ,
  117. p_image_info : this . desc_1 . as_ref ( ) . unwrap ( ) , .. Default ::
  118. default ( ) } ] ; unsafe {
  119. renderer . device ( ) . device ( ) . update_descriptor_sets (
  120. & this . write_desc_sets [ .. ] , & [ ] ) ; } let mut compiler = shaderc ::
  121. Compiler :: new ( ) . ok_or_else (
  122. || error :: Error :: ShaderCompilerCreationFailed ) ? ; this . vertex = Some (
  123. vulkan_lib :: shader :: Shader :: new (
  124. & mut compiler , renderer . device ( ) . clone ( ) ,
  125. "path_to_vertex_shader.glsl" , "vertex" , "main" , shaderc :: ShaderKind ::
  126. Vertex ) ? ) ; this . shader_stage_create_infos . push (
  127. this . vertex . as_ref ( ) . unwrap ( ) . as_pipeline_shader_stage_info ( )
  128. ) ; this . fragment = Some (
  129. vulkan_lib :: shader :: Shader :: new (
  130. & mut compiler , renderer . device ( ) . clone ( ) ,
  131. "path_to_vertex_shader.glsl" , "fragment" , "main" , shaderc :: ShaderKind ::
  132. Fragment ) ? ) ; this . shader_stage_create_infos . push (
  133. this . fragment . as_ref ( ) . unwrap ( ) . as_pipeline_shader_stage_info (
  134. ) ) ; let vertex_input_binding_descriptions = [
  135. vk :: VertexInputBindingDescription {
  136. binding : 0 , stride : std :: mem :: size_of :: < super :: MyVertex > ( ) as
  137. u32 , input_rate : vk :: VertexInputRate :: VERTEX , } ] ; use vulkan_lib ::
  138. Vertex ; let mut i = 0 ; let vertex_input_attribute_descriptions : Vec < vk ::
  139. VertexInputAttributeDescription > = super :: MyVertex :: get_fields ( ) .
  140. iter ( ) . map (
  141. | ( offset , kind ) | {
  142. i += 1 ; vk :: VertexInputAttributeDescription {
  143. location : i - 1 , binding : 0 , format : * kind , offset : * offset as u32 }
  144. } ) . collect ( ) ; this . vertex_input_state_info = Some (
  145. vk :: PipelineVertexInputStateCreateInfo {
  146. vertex_attribute_description_count : vertex_input_attribute_descriptions . len
  147. ( ) as u32 , p_vertex_attribute_descriptions :
  148. vertex_input_attribute_descriptions . as_ptr ( ) ,
  149. vertex_binding_description_count : vertex_input_binding_descriptions . len (
  150. ) as u32 , p_vertex_binding_descriptions : vertex_input_binding_descriptions .
  151. as_ptr ( ) , .. Default :: default ( ) } ) ; this .
  152. vertex_input_assembly_state_info = Some (
  153. vk :: PipelineInputAssemblyStateCreateInfo {
  154. topology : vk :: PrimitiveTopology :: TRIANGLE_LIST , .. Default :: default (
  155. ) } ) ; this . rasterization_info = Some (
  156. vk :: PipelineRasterizationStateCreateInfo {
  157. front_face : vk :: FrontFace :: COUNTER_CLOCKWISE , line_width : 1.0 ,
  158. polygon_mode : vk :: PolygonMode :: FILL , cull_mode : vk :: CullModeFlags ::
  159. BACK , .. Default :: default ( ) } ) ; let noop_stencil_state = vk ::
  160. StencilOpState {
  161. fail_op : vk :: StencilOp :: KEEP , pass_op : vk :: StencilOp :: KEEP ,
  162. depth_fail_op : vk :: StencilOp :: KEEP , compare_op : vk :: CompareOp ::
  163. ALWAYS , .. Default :: default ( ) } ; this . depth_state_info = Some (
  164. vk :: PipelineDepthStencilStateCreateInfo {
  165. depth_test_enable : 1 , depth_write_enable : 1 , depth_compare_op : vk ::
  166. CompareOp :: LESS_OR_EQUAL , front : noop_stencil_state . clone ( ) , back :
  167. noop_stencil_state . clone ( ) , max_depth_bounds : 1.0 , .. Default ::
  168. default ( ) } ) ; this . color_blend_attachment_states . append (
  169. & mut vec ! [
  170. vk :: PipelineColorBlendAttachmentState {
  171. blend_enable : 0 , src_color_blend_factor : vk :: BlendFactor :: SRC_COLOR ,
  172. dst_color_blend_factor : vk :: BlendFactor :: ONE_MINUS_DST_COLOR ,
  173. color_blend_op : vk :: BlendOp :: ADD , src_alpha_blend_factor : vk ::
  174. BlendFactor :: ZERO , dst_alpha_blend_factor : vk :: BlendFactor :: ZERO ,
  175. alpha_blend_op : vk :: BlendOp :: ADD , color_write_mask : vk ::
  176. ColorComponentFlags :: all ( ) , } ] ) ; this . color_blend_state = Some (
  177. vk :: PipelineColorBlendStateCreateInfo :: builder ( ) . logic_op (
  178. vk :: LogicOp :: CLEAR ) . attachments (
  179. & this . color_blend_attachment_states [ .. ] ) . build ( ) ) ; this .
  180. dynamic_state . append (
  181. & mut vec ! [ vk :: DynamicState :: VIEWPORT , vk :: DynamicState :: SCISSOR ]
  182. ) ; this . dynamic_state_info = Some (
  183. vk :: PipelineDynamicStateCreateInfo :: builder ( ) . dynamic_states (
  184. & this . dynamic_state [ .. ] ) . build ( ) ) ; Ok ( this ) } pub fn
  185. create_pipeline (
  186. & mut self , renderer : & vulkan_lib :: Renderer , renderpass : vk ::
  187. RenderPass ) -> vk :: GraphicsPipelineCreateInfo {
  188. self . multisample_state_info = Some (
  189. vk :: PipelineMultisampleStateCreateInfo {
  190. rasterization_samples : vk :: SampleCountFlags :: TYPE_1 , .. Default ::
  191. default ( ) } ) ; self . viewports = vec ! [
  192. vk :: Viewport {
  193. x : 0.0 , y : 0.0 , width : renderer . swapchain ( ) . surface_resolution (
  194. ) . width as f32 , height : renderer . swapchain ( ) . surface_resolution (
  195. ) . height as f32 , min_depth : 0.0 , max_depth : 1.0 , } ] ; self . scissors
  196. = vec ! [
  197. vk :: Rect2D {
  198. offset : vk :: Offset2D { x : 0 , y : 0 } , extent : renderer . swapchain ( )
  199. . surface_resolution ( ) , } ] ; self . viewport_state_info = Some (
  200. vk :: PipelineViewportStateCreateInfo :: builder ( ) . scissors (
  201. & self . scissors [ .. ] ) . viewports ( & self . viewports [ .. ] ) . build (
  202. ) ) ; vk :: GraphicsPipelineCreateInfo :: builder ( ) . stages (
  203. & self . shader_stage_create_infos ) . vertex_input_state (
  204. self . vertex_input_state_info . as_ref ( ) . unwrap ( ) ) .
  205. input_assembly_state (
  206. self . vertex_input_assembly_state_info . as_ref ( ) . unwrap ( ) ) .
  207. viewport_state ( self . viewport_state_info . as_ref ( ) . unwrap ( ) ) .
  208. rasterization_state ( self . rasterization_info . as_ref ( ) . unwrap ( ) )
  209. . multisample_state (
  210. self . multisample_state_info . as_ref ( ) . unwrap ( ) ) .
  211. depth_stencil_state ( self . depth_state_info . as_ref ( ) . unwrap ( ) ) .
  212. color_blend_state ( self . color_blend_state . as_ref ( ) . unwrap ( ) ) .
  213. dynamic_state ( self . dynamic_state_info . as_ref ( ) . unwrap ( ) ) .
  214. layout ( * self . pipeline_layout . as_ref ( ) . unwrap ( ) ) . render_pass
  215. ( renderpass ) . build ( ) } pub fn ubo ( & self ) -> & vulkan_lib :: buffer
  216. :: CpuBuffer { self . ubo . as_ref ( ) . unwrap ( ) } pub fn texture (
  217. & self ) -> & vulkan_lib :: texture :: Texture {
  218. self . texture . as_ref ( ) . unwrap ( ) } } # [ derive ( Default ) ] pub
  219. struct MainRenderpass {
  220. images : Option < std :: sync :: Arc < Images >> , attachments : Vec < vk ::
  221. AttachmentDescription > , renderpass : Option < vk :: RenderPass > ,
  222. dependencies : Vec < vk :: SubpassDependency > , renderpass_attachments : Vec
  223. < vk :: AttachmentDescription > , subpasses : Vec < vk :: SubpassDescription >
  224. , framebuffers : Vec < vk :: Framebuffer > , main_pipeline_colors : Vec < vk
  225. :: AttachmentReference > , main_pipeline_depth : Option < vk ::
  226. AttachmentReference > , main_pipeline_inputs : Vec < vk :: AttachmentReference
  227. > , main_pipeline : Option < MainPipeline > } impl MainRenderpass {
  228. pub fn new (
  229. renderer : & vulkan_lib :: Renderer , images : std :: sync :: Arc < Images > ,
  230. samples : u8 , texture : vulkan_lib :: texture :: Texture ) -> vulkan_lib ::
  231. error :: Result < Self > {
  232. let mut this = Self {
  233. images : Some ( images . clone ( ) ) , .. Default :: default ( ) } ; this .
  234. attachments = vec ! [
  235. vk :: AttachmentDescription {
  236. format : renderer . device ( ) . surface_format ( ) . format , samples : vk
  237. :: SampleCountFlags :: TYPE_1 , load_op : vk :: AttachmentLoadOp :: CLEAR ,
  238. store_op : vk :: AttachmentStoreOp :: STORE , final_layout : vk :: ImageLayout
  239. :: COLOR_ATTACHMENT_OPTIMAL , .. Default :: default ( ) } , vk ::
  240. AttachmentDescription {
  241. format : vk :: Format :: from_raw ( 124i32 ) , samples : vk ::
  242. SampleCountFlags :: from_raw ( samples as u32 ) , load_op : vk ::
  243. AttachmentLoadOp :: CLEAR , stencil_load_op : vk :: AttachmentLoadOp ::
  244. DONT_CARE , stencil_store_op : vk :: AttachmentStoreOp :: DONT_CARE ,
  245. final_layout : vk :: ImageLayout :: DEPTH_STENCIL_ATTACHMENT_OPTIMAL , ..
  246. Default :: default ( ) } ] ; if samples != 1 {
  247. this . attachments . push (
  248. vk :: AttachmentDescription {
  249. format : renderer . device ( ) . surface_format ( ) . format , samples : vk
  250. :: SampleCountFlags :: TYPE_1 , load_op : vk :: AttachmentLoadOp :: CLEAR ,
  251. store_op : vk :: AttachmentStoreOp :: STORE , final_layout : vk :: ImageLayout
  252. :: COLOR_ATTACHMENT_OPTIMAL , .. Default :: default ( ) } ) } let mut
  253. dependencies = vec ! [
  254. vk :: SubpassDependency {
  255. src_subpass : 4294967295u32 , dst_subpass : 4294967295u32 , src_stage_mask :
  256. vk :: PipelineStageFlags :: from_raw ( 8192u32 ) , dst_stage_mask : vk ::
  257. PipelineStageFlags :: from_raw ( 1024u32 ) , src_access_mask : vk ::
  258. AccessFlags :: from_raw ( 32768u32 ) , dst_access_mask : vk :: AccessFlags ::
  259. from_raw ( 1536u32 ) , dependency_flags : vk :: DependencyFlags :: BY_REGION ,
  260. .. Default :: default ( ) } , ] ; if samples != 1 {
  261. let len = dependencies . len ( ) ; dependencies [ len - 1 ] . dst_subpass =
  262. dependencies . len ( ) as u32 ; dependencies [ len - 1 ] . dst_stage_mask =
  263. vk :: PipelineStageFlags :: COLOR_ATTACHMENT_OUTPUT ; dependencies [ len - 1 ]
  264. . dst_access_mask = vk :: AccessFlags :: COLOR_ATTACHMENT_READ | vk ::
  265. AccessFlags :: COLOR_ATTACHMENT_WRITE ; dependencies . push (
  266. vk :: SubpassDependency {
  267. src_subpass : ( dependencies . len ( ) - 1 ) as u32 , dst_subpass : vk ::
  268. SUBPASS_EXTERNAL , src_stage_mask : vk :: PipelineStageFlags ::
  269. COLOR_ATTACHMENT_OUTPUT , dst_stage_mask : vk :: PipelineStageFlags ::
  270. BOTTOM_OF_PIPE , src_access_mask : vk :: AccessFlags :: COLOR_ATTACHMENT_READ
  271. | vk :: AccessFlags :: COLOR_ATTACHMENT_WRITE , dst_access_mask : vk ::
  272. AccessFlags :: MEMORY_READ , dependency_flags : vk :: DependencyFlags ::
  273. BY_REGION , .. Default :: default ( ) } ) ; } this . main_pipeline_colors .
  274. push (
  275. vk :: AttachmentReference {
  276. attachment : 1u32 , layout : vk :: ImageLayout :: COLOR_ATTACHMENT_OPTIMAL , }
  277. ) ; this . main_pipeline_depth = Some (
  278. vk :: AttachmentReference {
  279. attachment : 1u32 , layout : vk :: ImageLayout ::
  280. DEPTH_STENCIL_ATTACHMENT_OPTIMAL , } ) ; this . subpasses . push (
  281. vk :: SubpassDescription :: builder ( ) . color_attachments (
  282. & this . main_pipeline_colors [ .. ] ) . depth_stencil_attachment (
  283. this . main_pipeline_depth . as_ref ( ) . unwrap ( ) ) . pipeline_bind_point
  284. ( vk :: PipelineBindPoint :: GRAPHICS ) . build ( ) ) ; if samples != 1 {
  285. let len = this . subpasses . len ( ) ; let resolveReference = vk ::
  286. AttachmentReference {
  287. attachment : ( dependencies . len ( ) - 1 ) as u32 , layout : vk ::
  288. ImageLayout :: COLOR_ATTACHMENT_OPTIMAL , } ; this . subpasses [ len - 1 ] .
  289. color_attachment_count += 1 ; unsafe {
  290. (
  291. & mut * (
  292. this . subpasses [ len - 1 ] . p_color_attachments as * const Vec < vk ::
  293. AttachmentReference > ) ) . push ( resolveReference ) ; } } let
  294. renderpass_create_info = vk :: RenderPassCreateInfo :: builder ( ) .
  295. attachments ( & this . renderpass_attachments [ .. ] ) . subpasses (
  296. & this . subpasses [ .. ] ) . dependencies ( & this . dependencies [ .. ] ) ;
  297. this . renderpass = Some (
  298. unsafe {
  299. renderer . device ( ) . device ( ) . create_render_pass (
  300. & renderpass_create_info , None ) } ? ) ; let framebuffers : std :: result ::
  301. Result < Vec < _ > , _ > = renderer . images ( ) . iter ( ) . map (
  302. | present_image_view | {
  303. let framebuffer_attachments = [
  304. present_image_view . image ( ) , images . depth_image ( ) . depth_image_view
  305. ( ) ] ; let frame_buffer_create_info = vk :: FramebufferCreateInfo :: builder
  306. ( ) . render_pass ( * this . renderpass . as_ref ( ) . unwrap ( ) ) .
  307. attachments ( & framebuffer_attachments ) . width (
  308. renderer . swapchain ( ) . surface_resolution ( ) . width ) . height (
  309. renderer . swapchain ( ) . surface_resolution ( ) . height ) . layers ( 1 )
  310. ; unsafe {
  311. renderer . device ( ) . device ( ) . create_framebuffer (
  312. & frame_buffer_create_info , None ) } } ) . collect ( ) ; let framebuffers =
  313. framebuffers ? ; this . framebuffers = framebuffers ; this . main_pipeline =
  314. Some ( MainPipeline :: new ( renderer , images . clone ( ) , texture ) ? ) ;
  315. Ok ( this ) } } pub struct Renderer {
  316. renderer : vulkan_lib :: Renderer , images : std :: sync :: Arc < Images > ,
  317. main_renderpass : MainRenderpass } impl Renderer {
  318. # [ inline ] pub fn new (
  319. resolution : [ f64 ; 2 ] , samples : u8 , vsync : bool , triple_buffering :
  320. bool , texture : vulkan_lib :: texture :: Texture ) -> error :: Result < Self
  321. > {
  322. use std :: sync :: Arc ; use ash :: vk ; let renderer = vulkan_lib :: Renderer
  323. :: new ( resolution , samples , vsync , triple_buffering ) ? ; let images =
  324. Arc :: new ( Images :: new ( & renderer ) ? ) ; let main_renderpass =
  325. MainRenderpass :: new ( & renderer , images . clone ( ) , samples , texture )
  326. ? ; Ok ( Renderer { renderer , images , main_renderpass } ) } # [ inline ] pub
  327. fn main_renderpass ( & self ) -> & MainRenderpass { & self . main_renderpass }
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement