|
|
|
@ -115,32 +115,32 @@ constexpr u8 quad_array[] = { |
|
|
|
0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00}; |
|
|
|
|
|
|
|
VkDescriptorSetLayoutBinding BuildQuadArrayPassDescriptorSetLayoutBinding() { |
|
|
|
VkDescriptorSetLayoutBinding binding; |
|
|
|
binding.binding = 0; |
|
|
|
binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
|
|
|
binding.descriptorCount = 1; |
|
|
|
binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; |
|
|
|
binding.pImmutableSamplers = nullptr; |
|
|
|
return binding; |
|
|
|
return { |
|
|
|
.binding = 0, |
|
|
|
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
|
|
|
.descriptorCount = 1, |
|
|
|
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, |
|
|
|
.pImmutableSamplers = nullptr, |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
VkDescriptorUpdateTemplateEntryKHR BuildQuadArrayPassDescriptorUpdateTemplateEntry() { |
|
|
|
VkDescriptorUpdateTemplateEntryKHR entry; |
|
|
|
entry.dstBinding = 0; |
|
|
|
entry.dstArrayElement = 0; |
|
|
|
entry.descriptorCount = 1; |
|
|
|
entry.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
|
|
|
entry.offset = 0; |
|
|
|
entry.stride = sizeof(DescriptorUpdateEntry); |
|
|
|
return entry; |
|
|
|
return { |
|
|
|
.dstBinding = 0, |
|
|
|
.dstArrayElement = 0, |
|
|
|
.descriptorCount = 1, |
|
|
|
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
|
|
|
.offset = 0, |
|
|
|
.stride = sizeof(DescriptorUpdateEntry), |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
VkPushConstantRange BuildComputePushConstantRange(std::size_t size) { |
|
|
|
VkPushConstantRange range; |
|
|
|
range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; |
|
|
|
range.offset = 0; |
|
|
|
range.size = static_cast<u32>(size); |
|
|
|
return range; |
|
|
|
return { |
|
|
|
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, |
|
|
|
.offset = 0, |
|
|
|
.size = static_cast<u32>(size), |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
// Uint8 SPIR-V module. Generated from the "shaders/" directory.
|
|
|
|
@ -344,29 +344,33 @@ constexpr u8 QUAD_INDEXED_SPV[] = { |
|
|
|
0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00}; |
|
|
|
|
|
|
|
std::array<VkDescriptorSetLayoutBinding, 2> BuildInputOutputDescriptorSetBindings() { |
|
|
|
std::array<VkDescriptorSetLayoutBinding, 2> bindings; |
|
|
|
bindings[0].binding = 0; |
|
|
|
bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
|
|
|
bindings[0].descriptorCount = 1; |
|
|
|
bindings[0].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; |
|
|
|
bindings[0].pImmutableSamplers = nullptr; |
|
|
|
bindings[1].binding = 1; |
|
|
|
bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
|
|
|
bindings[1].descriptorCount = 1; |
|
|
|
bindings[1].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; |
|
|
|
bindings[1].pImmutableSamplers = nullptr; |
|
|
|
return bindings; |
|
|
|
return {{ |
|
|
|
{ |
|
|
|
.binding = 0, |
|
|
|
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
|
|
|
.descriptorCount = 1, |
|
|
|
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, |
|
|
|
.pImmutableSamplers = nullptr, |
|
|
|
}, |
|
|
|
{ |
|
|
|
.binding = 1, |
|
|
|
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
|
|
|
.descriptorCount = 1, |
|
|
|
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, |
|
|
|
.pImmutableSamplers = nullptr, |
|
|
|
}, |
|
|
|
}}; |
|
|
|
} |
|
|
|
|
|
|
|
VkDescriptorUpdateTemplateEntryKHR BuildInputOutputDescriptorUpdateTemplate() { |
|
|
|
VkDescriptorUpdateTemplateEntryKHR entry; |
|
|
|
entry.dstBinding = 0; |
|
|
|
entry.dstArrayElement = 0; |
|
|
|
entry.descriptorCount = 2; |
|
|
|
entry.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; |
|
|
|
entry.offset = 0; |
|
|
|
entry.stride = sizeof(DescriptorUpdateEntry); |
|
|
|
return entry; |
|
|
|
return { |
|
|
|
.dstBinding = 0, |
|
|
|
.dstArrayElement = 0, |
|
|
|
.descriptorCount = 2, |
|
|
|
.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
|
|
|
.offset = 0, |
|
|
|
.stride = sizeof(DescriptorUpdateEntry), |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
} // Anonymous namespace
|
|
|
|
@ -376,37 +380,37 @@ VKComputePass::VKComputePass(const VKDevice& device, VKDescriptorPool& descripto |
|
|
|
vk::Span<VkDescriptorUpdateTemplateEntryKHR> templates, |
|
|
|
vk::Span<VkPushConstantRange> push_constants, std::size_t code_size, |
|
|
|
const u8* code) { |
|
|
|
VkDescriptorSetLayoutCreateInfo descriptor_layout_ci; |
|
|
|
descriptor_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; |
|
|
|
descriptor_layout_ci.pNext = nullptr; |
|
|
|
descriptor_layout_ci.flags = 0; |
|
|
|
descriptor_layout_ci.bindingCount = bindings.size(); |
|
|
|
descriptor_layout_ci.pBindings = bindings.data(); |
|
|
|
descriptor_set_layout = device.GetLogical().CreateDescriptorSetLayout(descriptor_layout_ci); |
|
|
|
|
|
|
|
VkPipelineLayoutCreateInfo pipeline_layout_ci; |
|
|
|
pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; |
|
|
|
pipeline_layout_ci.pNext = nullptr; |
|
|
|
pipeline_layout_ci.flags = 0; |
|
|
|
pipeline_layout_ci.setLayoutCount = 1; |
|
|
|
pipeline_layout_ci.pSetLayouts = descriptor_set_layout.address(); |
|
|
|
pipeline_layout_ci.pushConstantRangeCount = push_constants.size(); |
|
|
|
pipeline_layout_ci.pPushConstantRanges = push_constants.data(); |
|
|
|
layout = device.GetLogical().CreatePipelineLayout(pipeline_layout_ci); |
|
|
|
descriptor_set_layout = device.GetLogical().CreateDescriptorSetLayout({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.bindingCount = bindings.size(), |
|
|
|
.pBindings = bindings.data(), |
|
|
|
}); |
|
|
|
|
|
|
|
layout = device.GetLogical().CreatePipelineLayout({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.setLayoutCount = 1, |
|
|
|
.pSetLayouts = descriptor_set_layout.address(), |
|
|
|
.pushConstantRangeCount = push_constants.size(), |
|
|
|
.pPushConstantRanges = push_constants.data(), |
|
|
|
}); |
|
|
|
|
|
|
|
if (!templates.empty()) { |
|
|
|
VkDescriptorUpdateTemplateCreateInfoKHR template_ci; |
|
|
|
template_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR; |
|
|
|
template_ci.pNext = nullptr; |
|
|
|
template_ci.flags = 0; |
|
|
|
template_ci.descriptorUpdateEntryCount = templates.size(); |
|
|
|
template_ci.pDescriptorUpdateEntries = templates.data(); |
|
|
|
template_ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR; |
|
|
|
template_ci.descriptorSetLayout = *descriptor_set_layout; |
|
|
|
template_ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
|
|
|
template_ci.pipelineLayout = *layout; |
|
|
|
template_ci.set = 0; |
|
|
|
descriptor_template = device.GetLogical().CreateDescriptorUpdateTemplateKHR(template_ci); |
|
|
|
descriptor_template = device.GetLogical().CreateDescriptorUpdateTemplateKHR({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.descriptorUpdateEntryCount = templates.size(), |
|
|
|
.pDescriptorUpdateEntries = templates.data(), |
|
|
|
.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, |
|
|
|
.descriptorSetLayout = *descriptor_set_layout, |
|
|
|
.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, |
|
|
|
.pipelineLayout = *layout, |
|
|
|
.set = 0, |
|
|
|
}); |
|
|
|
|
|
|
|
descriptor_allocator.emplace(descriptor_pool, *descriptor_set_layout); |
|
|
|
} |
|
|
|
@ -414,32 +418,32 @@ VKComputePass::VKComputePass(const VKDevice& device, VKDescriptorPool& descripto |
|
|
|
auto code_copy = std::make_unique<u32[]>(code_size / sizeof(u32) + 1); |
|
|
|
std::memcpy(code_copy.get(), code, code_size); |
|
|
|
|
|
|
|
VkShaderModuleCreateInfo module_ci; |
|
|
|
module_ci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; |
|
|
|
module_ci.pNext = nullptr; |
|
|
|
module_ci.flags = 0; |
|
|
|
module_ci.codeSize = code_size; |
|
|
|
module_ci.pCode = code_copy.get(); |
|
|
|
module = device.GetLogical().CreateShaderModule(module_ci); |
|
|
|
|
|
|
|
VkComputePipelineCreateInfo pipeline_ci; |
|
|
|
pipeline_ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; |
|
|
|
pipeline_ci.pNext = nullptr; |
|
|
|
pipeline_ci.flags = 0; |
|
|
|
pipeline_ci.layout = *layout; |
|
|
|
pipeline_ci.basePipelineHandle = nullptr; |
|
|
|
pipeline_ci.basePipelineIndex = 0; |
|
|
|
|
|
|
|
VkPipelineShaderStageCreateInfo& stage_ci = pipeline_ci.stage; |
|
|
|
stage_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; |
|
|
|
stage_ci.pNext = nullptr; |
|
|
|
stage_ci.flags = 0; |
|
|
|
stage_ci.stage = VK_SHADER_STAGE_COMPUTE_BIT; |
|
|
|
stage_ci.module = *module; |
|
|
|
stage_ci.pName = "main"; |
|
|
|
stage_ci.pSpecializationInfo = nullptr; |
|
|
|
|
|
|
|
pipeline = device.GetLogical().CreateComputePipeline(pipeline_ci); |
|
|
|
module = device.GetLogical().CreateShaderModule({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.codeSize = code_size, |
|
|
|
.pCode = code_copy.get(), |
|
|
|
}); |
|
|
|
|
|
|
|
pipeline = device.GetLogical().CreateComputePipeline({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.stage = |
|
|
|
{ |
|
|
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.stage = VK_SHADER_STAGE_COMPUTE_BIT, |
|
|
|
.module = *module, |
|
|
|
.pName = "main", |
|
|
|
.pSpecializationInfo = nullptr, |
|
|
|
}, |
|
|
|
.layout = *layout, |
|
|
|
.basePipelineHandle = nullptr, |
|
|
|
.basePipelineIndex = 0, |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
VKComputePass::~VKComputePass() = default; |
|
|
|
|