def create_descriptor_sets(): global descriptor_pool, descriptor_set, uniforms_buffer, uniforms_mem global ubo_data_type, light_data_type, uniforms_data_type # Setup descriptor set resources ubo_data_type = Mat4 * 3 light_data_type = type( "Light", (Structure, ), { '_fields_': (('reverseLightDirection', c_float * 3), ('color', c_float * 4)) }) uniforms_data_type = type( "Uniforms", (Structure, ), {'_fields_': (('ubo', ubo_data_type), ('light', light_data_type))}) uniforms_data_size = sizeof(uniforms_data_type) # Create descriptor pool uniforms_pool_size = vk.DescriptorPoolSize( type=vk.DESCRIPTOR_TYPE_UNIFORM_BUFFER, descriptor_count=2) sampler_pool_size = vk.DescriptorPoolSize( type=vk.DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, descriptor_count=1) descriptor_pool = hvk.create_descriptor_pool( api, device, hvk.descriptor_pool_create_info(max_sets=1, pool_sizes=(uniforms_pool_size, sampler_pool_size))) descriptor_set = hvk.allocate_descriptor_sets( api, device, hvk.descriptor_set_allocate_info( descriptor_pool=descriptor_pool, set_layouts=(descriptor_set_layout, )))[0] # Allocate memory for the descriptor uniforms_buffer = hvk.create_buffer( api, device, hvk.buffer_create_info(size=uniforms_data_size, usage=vk.BUFFER_USAGE_UNIFORM_BUFFER_BIT)) ubo_buffer_req = hvk.buffer_memory_requirements(api, device, uniforms_buffer) mt_index = find_memory_type( 0, vk.MEMORY_PROPERTY_HOST_COHERENT_BIT | vk.MEMORY_PROPERTY_HOST_VISIBLE_BIT) uniforms_mem = hvk.allocate_memory( api, device, hvk.memory_allocate_info(allocation_size=ubo_buffer_req.size, memory_type_index=mt_index)) hvk.bind_buffer_memory(api, device, uniforms_buffer, uniforms_mem, 0)
def create_compute_descriptor_sets(): global compute_descriptor_pool, compute_descriptor_set pool_size = vk.DescriptorPoolSize(type=vk.DESCRIPTOR_TYPE_STORAGE_IMAGE, descriptor_count=1) compute_descriptor_pool = hvk.create_descriptor_pool( api, device, hvk.descriptor_pool_create_info(max_sets=1, pool_sizes=(pool_size, ))) compute_descriptor_set = hvk.allocate_descriptor_sets( api, device, hvk.descriptor_set_allocate_info( descriptor_pool=compute_descriptor_pool, set_layouts=(compute_descriptor_set_layout, )))[0]
def create_descriptor_sets(): global descriptor_pool, descriptor_set, color_buffer, color_mem # Uniform buffer values colors = (0.8, 0.8, 0.0, 1.0) colors_data = (c_float * len(colors))(*colors) colors_data_size = sizeof(colors_data) # Create descriptor pool pool_size = vk.DescriptorPoolSize(type=vk.DESCRIPTOR_TYPE_UNIFORM_BUFFER, descriptor_count=1) descriptor_pool = hvk.create_descriptor_pool( api, device, hvk.descriptor_pool_create_info(max_sets=1, pool_sizes=(pool_size, ))) descriptor_set = hvk.allocate_descriptor_sets( api, device, hvk.descriptor_set_allocate_info( descriptor_pool=descriptor_pool, set_layouts=(descriptor_set_layout, )))[0] # Allocate memory for the descriptor color_buffer = hvk.create_buffer( api, device, hvk.buffer_create_info(size=colors_data_size, usage=vk.BUFFER_USAGE_UNIFORM_BUFFER_BIT)) color_buffer_req = hvk.buffer_memory_requirements(api, device, color_buffer) mt_index = find_memory_type( 0, vk.MEMORY_PROPERTY_HOST_COHERENT_BIT | vk.MEMORY_PROPERTY_HOST_VISIBLE_BIT) color_mem = hvk.allocate_memory( api, device, hvk.memory_allocate_info(allocation_size=color_buffer_req.size, memory_type_index=mt_index)) hvk.bind_buffer_memory(api, device, color_buffer, color_mem, 0) # Upload color data to memory data_ptr = hvk.map_memory(api, device, color_mem, 0, colors_data_size).value memmove(data_ptr, byref(colors_data), colors_data_size) hvk.unmap_memory(api, device, color_mem)
def _setup_descriptor_sets_pool(self): _, api, device = self.ctx shaders, computes = self.shaders, self.computes pool_sizes, max_sets = {}, 0 # Lookup for the shader global descriptors for data_shader in shaders: if data_shader.descriptor_set_layouts is None: continue for dset_layout in data_shader.global_layouts: for dtype, dcount in dset_layout.pool_size_counts: if dtype in pool_sizes: pool_sizes[dtype] += dcount else: pool_sizes[dtype] = dcount max_sets += 1 # Lookup for the compute shader global descriptor for data_compute in computes: if data_compute.descriptor_set_layouts is None: continue for dset_layout in data_compute.global_layouts: for dtype, dcount in dset_layout.pool_size_counts: if dtype in pool_sizes: pool_sizes[dtype] += dcount else: pool_sizes[dtype] = dcount max_sets += 1 # Lookup for the object local descriptors for shader_index, objects in self._group_objects_by_shaders(): shader = shaders[shader_index] object_count = len(objects) if shader.descriptor_set_layouts is None: continue for dset_layout in shader.local_layouts: for dtype, dcount in dset_layout.pool_size_counts: if dtype in pool_sizes: pool_sizes[dtype] += dcount * object_count else: pool_sizes[dtype] = dcount * object_count max_sets += object_count if len(pool_sizes) == 0: self.descriptor_pool = None return pool_sizes = tuple( vk.DescriptorPoolSize(type=t, descriptor_count=c) for t, c in pool_sizes.items()) pool = hvk.create_descriptor_pool( api, device, hvk.descriptor_pool_create_info(max_sets=max_sets, pool_sizes=pool_sizes)) self.descriptor_pool = pool