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)
Esempio n. 2
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)
Esempio n. 4
0
    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