WIP Vulkan compute: descriptor set and command buf
Some more Vulkan initialization code to set up Vulkan compute.
This commit is contained in:
parent
ea66a44238
commit
d4661996d2
1 changed files with 110 additions and 0 deletions
|
@ -730,6 +730,116 @@ image::Bl dither::blue_noise(int width, int height, int threads,
|
|||
internal::vulkan_copy_buffer(device, command_pool, compute_queue,
|
||||
staging_buffer, other_buf, other_size);
|
||||
}
|
||||
|
||||
VkDescriptorPool descriptor_pool;
|
||||
utility::Cleanup cleanup_descriptor_pool{};
|
||||
{
|
||||
VkDescriptorPoolSize pool_size{};
|
||||
pool_size.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
pool_size.descriptorCount = 4;
|
||||
|
||||
VkDescriptorPoolCreateInfo pool_info{};
|
||||
pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
pool_info.poolSizeCount = 1;
|
||||
pool_info.pPoolSizes = &pool_size;
|
||||
pool_info.maxSets = 1;
|
||||
|
||||
if (vkCreateDescriptorPool(device, &pool_info, nullptr,
|
||||
&descriptor_pool) != VK_SUCCESS) {
|
||||
std::clog << "WARNING: Failed to create descriptor pool!\n";
|
||||
goto ENDOF_VULKAN;
|
||||
}
|
||||
|
||||
cleanup_descriptor_pool = utility::Cleanup(
|
||||
[device](void *ptr) {
|
||||
vkDestroyDescriptorPool(device, *((VkDescriptorPool *)ptr),
|
||||
nullptr);
|
||||
},
|
||||
&descriptor_pool);
|
||||
}
|
||||
|
||||
VkDescriptorSet compute_descriptor_set;
|
||||
{
|
||||
VkDescriptorSetAllocateInfo alloc_info{};
|
||||
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
alloc_info.descriptorPool = descriptor_pool;
|
||||
alloc_info.descriptorSetCount = 1;
|
||||
alloc_info.pSetLayouts = &compute_desc_set_layout;
|
||||
|
||||
if (vkAllocateDescriptorSets(device, &alloc_info,
|
||||
&compute_descriptor_set) != VK_SUCCESS) {
|
||||
std::clog << "WARNING: Failed to allocate descriptor set!\n";
|
||||
goto ENDOF_VULKAN;
|
||||
}
|
||||
|
||||
std::array<VkWriteDescriptorSet, 4> descriptor_writes{};
|
||||
|
||||
descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptor_writes[0].dstSet = compute_descriptor_set;
|
||||
descriptor_writes[0].dstBinding = 0;
|
||||
descriptor_writes[0].dstArrayElement = 0;
|
||||
descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptor_writes[0].descriptorCount = 1;
|
||||
VkDescriptorBufferInfo precomputed_info{};
|
||||
precomputed_info.buffer = precomputed_buf;
|
||||
precomputed_info.offset = 0;
|
||||
precomputed_info.range = VK_WHOLE_SIZE;
|
||||
descriptor_writes[0].pBufferInfo = &precomputed_info;
|
||||
|
||||
descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptor_writes[1].dstSet = compute_descriptor_set;
|
||||
descriptor_writes[1].dstBinding = 1;
|
||||
descriptor_writes[1].dstArrayElement = 0;
|
||||
descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptor_writes[1].descriptorCount = 1;
|
||||
VkDescriptorBufferInfo filter_out_info{};
|
||||
filter_out_info.buffer = filter_out_buf;
|
||||
filter_out_info.offset = 0;
|
||||
filter_out_info.range = VK_WHOLE_SIZE;
|
||||
descriptor_writes[1].pBufferInfo = &filter_out_info;
|
||||
|
||||
descriptor_writes[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptor_writes[2].dstSet = compute_descriptor_set;
|
||||
descriptor_writes[2].dstBinding = 2;
|
||||
descriptor_writes[2].dstArrayElement = 0;
|
||||
descriptor_writes[2].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptor_writes[2].descriptorCount = 1;
|
||||
VkDescriptorBufferInfo pbp_info{};
|
||||
pbp_info.buffer = pbp_buf;
|
||||
pbp_info.offset = 0;
|
||||
pbp_info.range = VK_WHOLE_SIZE;
|
||||
descriptor_writes[2].pBufferInfo = &pbp_info;
|
||||
|
||||
descriptor_writes[3].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptor_writes[3].dstSet = compute_descriptor_set;
|
||||
descriptor_writes[3].dstBinding = 3;
|
||||
descriptor_writes[3].dstArrayElement = 0;
|
||||
descriptor_writes[3].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptor_writes[3].descriptorCount = 1;
|
||||
VkDescriptorBufferInfo other_info{};
|
||||
other_info.buffer = other_buf;
|
||||
other_info.offset = 0;
|
||||
other_info.range = VK_WHOLE_SIZE;
|
||||
descriptor_writes[3].pBufferInfo = &other_info;
|
||||
|
||||
vkUpdateDescriptorSets(device, descriptor_writes.size(),
|
||||
descriptor_writes.data(), 0, nullptr);
|
||||
}
|
||||
|
||||
VkCommandBuffer command_buffer;
|
||||
{
|
||||
VkCommandBufferAllocateInfo alloc_info{};
|
||||
alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
|
||||
alloc_info.commandPool = command_pool;
|
||||
alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
|
||||
alloc_info.commandBufferCount = 1;
|
||||
|
||||
if (vkAllocateCommandBuffers(device, &alloc_info, &command_buffer) !=
|
||||
VK_SUCCESS) {
|
||||
std::clog << "WARNING: Failed to allocate compute command buffer!\n";
|
||||
goto ENDOF_VULKAN;
|
||||
}
|
||||
}
|
||||
}
|
||||
ENDOF_VULKAN:
|
||||
std::clog << "TODO: Remove this once Vulkan support is implemented.\n";
|
||||
|
|
Loading…
Reference in a new issue