| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can |
| * be found in the LICENSE file. |
| * |
| */ |
| |
| #pragma once |
| |
| // |
| // |
| // |
| |
| #include <vulkan/vulkan.h> |
| |
| // |
| // |
| // |
| |
| #include <stdint.h> |
| #include <stdbool.h> |
| |
| // |
| // |
| // |
| |
| #include "hs_vk_target.h" |
| |
| // |
| // Create a HotSort instance from a specific vendor, architecture and |
| // key/val size target. |
| // |
| |
| struct hs_vk * |
| hs_vk_create(struct hs_vk_target const * const target, |
| VkDevice device, |
| VkAllocationCallbacks const * allocator, |
| VkPipelineCache pipeline_cache); |
| |
| // |
| // Resources will be disposed of with the same device and allocator |
| // used for creation. |
| // |
| |
| void |
| hs_vk_release(struct hs_vk * const hs); |
| |
| // |
| // Allocate a thread local descriptor set for the vin and vout |
| // VkBuffers. Note that HotSort uses only one descriptor set. |
| // |
| // Don't forget to return the descriptor set back to the same pool |
| // with vkFreeDescriptorSets(). |
| // |
| |
| VkDescriptorSet |
| hs_vk_ds_alloc(struct hs_vk const * const hs, VkDescriptorPool desc_pool); |
| |
| // |
| // Explicitly bind the descriptor set describing the 'vin' and 'vout' |
| // buffers to the command buffer before calling 'hs_vk_sort()'. |
| // |
| // If 'vout' is VK_NULL_HANDLE then the sort will be performed in |
| // place. |
| // |
| // FIXME -- do we want to expose a set index? |
| // |
| // FIXME -- do we want to allow specialization of the buffer bindings |
| // or sets? |
| // |
| |
| void |
| hs_vk_ds_bind(struct hs_vk const * const hs, |
| VkDescriptorSet hs_ds, |
| VkCommandBuffer cb, |
| VkBuffer vin, |
| VkBuffer vout); |
| |
| // |
| // Explicitly reveal what padding of maximum valued keys will be |
| // applied to the input and output buffers. |
| // |
| // count : input number of keys |
| // count_padded_in : adjusted count of keys in vin[] buffer |
| // count_padded_out : adjusted count of keys in vout[] buffer |
| // |
| // Instead of implicitly padding the buffers, HotSort requires this |
| // explicit step to support use cases like: |
| // |
| // - writing past the end of the vin[] buffer |
| // - dynamically allocating a vout[] buffer before sorting |
| // |
| |
| void |
| hs_vk_pad(struct hs_vk const * const hs, |
| uint32_t const count, |
| uint32_t * const count_padded_in, |
| uint32_t * const count_padded_out); |
| |
| // |
| // Append commands to the command buffer that when enqueued will sort |
| // the keys in the 'vin' buffer and store them in the 'vout' buffer. |
| // |
| // If 'vout' is VK_NULL_HANDLE then the sort will be performed in |
| // place. |
| // |
| // Pipeline barriers should be applied both before and after invoking |
| // this function. |
| // |
| // Note that the algorithm *may* perform transfer operations on the |
| // buffers before executing a compute shader. |
| // |
| // The algorithm ends with a single compute shader. |
| // |
| |
| void |
| hs_vk_sort(struct hs_vk const * const hs, |
| VkCommandBuffer cb, |
| VkBuffer vin, |
| VkPipelineStageFlags const vin_src_stage, |
| VkAccessFlagBits const vin_src_access, |
| VkBuffer vout, |
| VkPipelineStageFlags const vout_src_stage, |
| VkAccessFlagBits const vout_src_access, |
| uint32_t const count, |
| uint32_t const count_padded_in, |
| uint32_t const count_padded_out, |
| bool const linearize); |
| |
| // |
| // |
| // |