def _setup_depth_stencil(self): engine, api, device = self.ctx width, height = engine.info["swapchain_extent"].values() depth_format = engine.info["depth_format"] mem = engine.memory_manager if self.depth_stencil is not None: hvk.destroy_image_view(api, device, self.depth_stencil.view) hvk.destroy_image(api, device, self.depth_stencil.image) mem.free_alloc(self.depth_stencil_alloc) depth_stencil_image = hvk.create_image( api, device, hvk.image_create_info( format=depth_format, extent=vk.Extent3D(width=width, height=height, depth=1), usage=vk.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) alloc = mem.alloc(depth_stencil_image, vk.STRUCTURE_TYPE_IMAGE_CREATE_INFO, types=(vk.MEMORY_PROPERTY_DEVICE_LOCAL_BIT, )) depth_stencil_view = hvk.create_image_view( api, device, hvk.image_view_create_info( image=depth_stencil_image, format=depth_format, subresource_range=hvk.image_subresource_range( aspect_mask=vk.IMAGE_ASPECT_DEPTH_BIT | vk.IMAGE_ASPECT_STENCIL_BIT))) self.depth_stencil = ImageAndView(image=depth_stencil_image, view=depth_stencil_view) self.depth_stencil_alloc = alloc
def setup_swapchain_depth_stencil(recreate=False): global depth_format, depth_stencil, depth_alloc, depth_view if recreate: hvk.destroy_image_view(api, device, depth_view) hvk.destroy_image(api, device, depth_stencil) hvk.free_memory(api, device, depth_alloc) width, height = window.dimensions() # Depth stencil attachment setup depth_format = None depth_formats = (vk.FORMAT_D32_SFLOAT_S8_UINT, vk.FORMAT_D24_UNORM_S8_UINT, vk.FORMAT_D16_UNORM_S8_UINT) for fmt in depth_formats: prop = hvk.physical_device_format_properties(api, physical_device, fmt) if IntFlag(vk.FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) in IntFlag( prop.optimal_tiling_features): depth_format = fmt break if depth_format is None: raise RuntimeError("Failed to find a suitable depth stencil format.") # Depth stencil image creation depth_stencil = hvk.create_image( api, device, hvk.image_create_info(format=depth_format, extent=vk.Extent3D(width=width, height=height, depth=1), usage=vk.IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | vk.IMAGE_USAGE_TRANSFER_SRC_BIT)) # Depth stencil image memory image_memreq = hvk.image_memory_requirements(api, device, depth_stencil) mt_index = find_memory_type(vk.MEMORY_HEAP_DEVICE_LOCAL_BIT, vk.MEMORY_PROPERTY_DEVICE_LOCAL_BIT) depth_stencil_size = image_memreq.size * 2 depth_alloc = hvk.allocate_memory( api, device, hvk.memory_allocate_info(allocation_size=depth_stencil_size, memory_type_index=mt_index)) hvk.bind_image_memory(api, device, depth_stencil, depth_alloc) # Depth stencil image view depth_view = hvk.create_image_view( api, device, hvk.image_view_create_info( image=depth_stencil, format=depth_format, subresource_range=hvk.image_subresource_range( aspect_mask=vk.IMAGE_ASPECT_DEPTH_BIT | vk.IMAGE_ASPECT_STENCIL_BIT)))
def clean_resources(): window.hide() hvk.device_wait_idle(api, device) hvk.destroy_fence(api, device, staging_fence) hvk.destroy_command_pool(api, device, staging_pool) hvk.destroy_buffer(api, device, staging_mesh_buffer) hvk.free_memory(api, device, staging_mesh_memory) hvk.destroy_command_pool(api, device, drawing_pool) hvk.destroy_buffer(api, device, mesh_buffer) hvk.free_memory(api, device, mesh_memory) hvk.destroy_descriptor_pool(api, device, descriptor_pool) hvk.destroy_buffer(api, device, uniforms_buffer) hvk.free_memory(api, device, uniforms_mem) hvk.destroy_pipeline(api, device, pipeline) hvk.destroy_pipeline_cache(api, device, pipeline_cache) hvk.destroy_pipeline_layout(api, device, pipeline_layout) for m in shader_modules: hvk.destroy_shader_module(api, device, m) hvk.destroy_descriptor_set_layout(api, device, descriptor_set_layout) for fb in framebuffers: hvk.destroy_framebuffer(api, device, fb) hvk.destroy_render_pass(api, device, render_pass) hvk.destroy_semaphore(api, device, image_ready) hvk.destroy_semaphore(api, device, rendering_done) for f in render_fences: hvk.destroy_fence(api, device, f) hvk.destroy_image(api, device, depth_stencil) hvk.destroy_image_view(api, device, depth_view) hvk.free_memory(api, device, depth_alloc) for v in swapchain_image_views: hvk.destroy_image_view(api, device, v) hvk.destroy_swapchain(api, device, swapchain) hvk.destroy_device(api, device) hvk.destroy_surface(api, instance, surface) debugger.stop() hvk.destroy_instance(api, instance) window.destroy()
def free(self): engine, api, device = self.ctx mem = engine.memory_manager if self.uniforms_alloc is not None: hvk.destroy_buffer(api, device, self.uniforms_buffer) mem.free_alloc(self.uniforms_alloc) if self.descriptor_pool is not None: hvk.destroy_descriptor_pool(api, device, self.descriptor_pool) for pipeline in self.pipelines: hvk.destroy_pipeline(api, device, pipeline) for pipeline in self.compute_pipelines: hvk.destroy_pipeline(api, device, pipeline) hvk.destroy_pipeline_cache(api, device, self.pipeline_cache) if self.meshes_buffer is not None: hvk.destroy_buffer(api, device, self.meshes_buffer) mem.free_alloc(self.meshes_alloc) for sampler in self.samplers: sampler.free() for img in self.images: for view in img.views.values(): hvk.destroy_image_view(api, device, view) img.free() if self.images_alloc is not None: mem.free_alloc(self.images_alloc) for compute in self.computes: compute.free() for shader in self.shaders: shader.free() hvk.destroy_command_pool(api, device, self.command_pool) for _, pool in self.compute_pools: hvk.destroy_command_pool(api, device, pool) # Make it easier for python to deal with the circular dependencies del self.engine del self.scene del self.shaders
def free(self): ctx, api, device = self.ctx memory_manager = ctx.memory_manager hvk.destroy_image_view(api, device, self.depth_stencil.view) hvk.destroy_image(api, device, self.depth_stencil.image) memory_manager.free_alloc(self.depth_stencil_alloc) for fb in self.framebuffers: hvk.destroy_framebuffer(api, device, fb) for (_, view) in self.swapchain_images: hvk.destroy_image_view(api, device, view) hvk.destroy_render_pass(api, device, self.render_pass) del self.engine
def setup_swapchain_image_views(recreate=False): global swapchain_images, swapchain_image_views if recreate: for view in swapchain_image_views: hvk.destroy_image_view(api, device, view) # Fetch swapchain images swapchain_images = hvk.swapchain_images(api, device, swapchain) # Create the swapchain images view swapchain_image_views = [] for image in swapchain_images: view = hvk.create_image_view( api, device, hvk.image_view_create_info(image=image, format=swapchain_image_format)) swapchain_image_views.append(view)
def _setup_swapchain_images(self): engine, api, device = self.ctx swapchain = engine.swapchain if len(self.swapchain_images) > 0: for (_, view) in self.swapchain_images: hvk.destroy_image_view(api, device, view) # Fetch swapchain images swapchain_images = hvk.swapchain_images(api, device, swapchain) swapchain_fmt = engine.info["swapchain_format"] # Create the swapchain images view self.swapchain_images = [] for image in swapchain_images: view = hvk.create_image_view( api, device, hvk.image_view_create_info(image=image, format=swapchain_fmt)) self.swapchain_images.append(ImageAndView(image=image, view=view))