|
|
|
@ -43,12 +43,13 @@ vk::DescriptorSetLayout VKComputePipeline::CreateDescriptorSetLayout() const { |
|
|
|
const auto add_bindings = [&](VkDescriptorType descriptor_type, std::size_t num_entries) { |
|
|
|
// TODO(Rodrigo): Maybe make individual bindings here?
|
|
|
|
for (u32 bindpoint = 0; bindpoint < static_cast<u32>(num_entries); ++bindpoint) { |
|
|
|
VkDescriptorSetLayoutBinding& entry = bindings.emplace_back(); |
|
|
|
entry.binding = binding++; |
|
|
|
entry.descriptorType = descriptor_type; |
|
|
|
entry.descriptorCount = 1; |
|
|
|
entry.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; |
|
|
|
entry.pImmutableSamplers = nullptr; |
|
|
|
bindings.push_back({ |
|
|
|
.binding = binding++, |
|
|
|
.descriptorType = descriptor_type, |
|
|
|
.descriptorCount = 1, |
|
|
|
.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT, |
|
|
|
.pImmutableSamplers = nullptr, |
|
|
|
}); |
|
|
|
} |
|
|
|
}; |
|
|
|
add_bindings(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, entries.const_buffers.size()); |
|
|
|
@ -58,25 +59,25 @@ vk::DescriptorSetLayout VKComputePipeline::CreateDescriptorSetLayout() const { |
|
|
|
add_bindings(VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, entries.storage_texels.size()); |
|
|
|
add_bindings(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, entries.images.size()); |
|
|
|
|
|
|
|
VkDescriptorSetLayoutCreateInfo ci; |
|
|
|
ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; |
|
|
|
ci.pNext = nullptr; |
|
|
|
ci.flags = 0; |
|
|
|
ci.bindingCount = static_cast<u32>(bindings.size()); |
|
|
|
ci.pBindings = bindings.data(); |
|
|
|
return device.GetLogical().CreateDescriptorSetLayout(ci); |
|
|
|
return device.GetLogical().CreateDescriptorSetLayout({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.bindingCount = static_cast<u32>(bindings.size()), |
|
|
|
.pBindings = bindings.data(), |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
vk::PipelineLayout VKComputePipeline::CreatePipelineLayout() const { |
|
|
|
VkPipelineLayoutCreateInfo ci; |
|
|
|
ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; |
|
|
|
ci.pNext = nullptr; |
|
|
|
ci.flags = 0; |
|
|
|
ci.setLayoutCount = 1; |
|
|
|
ci.pSetLayouts = descriptor_set_layout.address(); |
|
|
|
ci.pushConstantRangeCount = 0; |
|
|
|
ci.pPushConstantRanges = nullptr; |
|
|
|
return device.GetLogical().CreatePipelineLayout(ci); |
|
|
|
return device.GetLogical().CreatePipelineLayout({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.setLayoutCount = 1, |
|
|
|
.pSetLayouts = descriptor_set_layout.address(), |
|
|
|
.pushConstantRangeCount = 0, |
|
|
|
.pPushConstantRanges = nullptr, |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
vk::DescriptorUpdateTemplateKHR VKComputePipeline::CreateDescriptorUpdateTemplate() const { |
|
|
|
@ -89,59 +90,63 @@ vk::DescriptorUpdateTemplateKHR VKComputePipeline::CreateDescriptorUpdateTemplat |
|
|
|
return {}; |
|
|
|
} |
|
|
|
|
|
|
|
VkDescriptorUpdateTemplateCreateInfoKHR ci; |
|
|
|
ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR; |
|
|
|
ci.pNext = nullptr; |
|
|
|
ci.flags = 0; |
|
|
|
ci.descriptorUpdateEntryCount = static_cast<u32>(template_entries.size()); |
|
|
|
ci.pDescriptorUpdateEntries = template_entries.data(); |
|
|
|
ci.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR; |
|
|
|
ci.descriptorSetLayout = *descriptor_set_layout; |
|
|
|
ci.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
|
|
|
ci.pipelineLayout = *layout; |
|
|
|
ci.set = DESCRIPTOR_SET; |
|
|
|
return device.GetLogical().CreateDescriptorUpdateTemplateKHR(ci); |
|
|
|
return device.GetLogical().CreateDescriptorUpdateTemplateKHR({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.descriptorUpdateEntryCount = static_cast<u32>(template_entries.size()), |
|
|
|
.pDescriptorUpdateEntries = template_entries.data(), |
|
|
|
.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, |
|
|
|
.descriptorSetLayout = *descriptor_set_layout, |
|
|
|
.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, |
|
|
|
.pipelineLayout = *layout, |
|
|
|
.set = DESCRIPTOR_SET, |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
vk::ShaderModule VKComputePipeline::CreateShaderModule(const std::vector<u32>& code) const { |
|
|
|
device.SaveShader(code); |
|
|
|
|
|
|
|
VkShaderModuleCreateInfo ci; |
|
|
|
ci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; |
|
|
|
ci.pNext = nullptr; |
|
|
|
ci.flags = 0; |
|
|
|
ci.codeSize = code.size() * sizeof(u32); |
|
|
|
ci.pCode = code.data(); |
|
|
|
return device.GetLogical().CreateShaderModule(ci); |
|
|
|
return device.GetLogical().CreateShaderModule({ |
|
|
|
.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, |
|
|
|
.pNext = nullptr, |
|
|
|
.flags = 0, |
|
|
|
.codeSize = code.size() * sizeof(u32), |
|
|
|
.pCode = code.data(), |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
vk::Pipeline VKComputePipeline::CreatePipeline() const { |
|
|
|
VkComputePipelineCreateInfo ci; |
|
|
|
VkPipelineShaderStageCreateInfo& stage_ci = 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 = *shader_module; |
|
|
|
stage_ci.pName = "main"; |
|
|
|
stage_ci.pSpecializationInfo = nullptr; |
|
|
|
|
|
|
|
VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci; |
|
|
|
subgroup_size_ci.sType = |
|
|
|
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT; |
|
|
|
subgroup_size_ci.pNext = nullptr; |
|
|
|
subgroup_size_ci.requiredSubgroupSize = GuestWarpSize; |
|
|
|
|
|
|
|
VkComputePipelineCreateInfo ci{ |
|
|
|
.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 = *shader_module, |
|
|
|
.pName = "main", |
|
|
|
.pSpecializationInfo = nullptr, |
|
|
|
}, |
|
|
|
.layout = *layout, |
|
|
|
.basePipelineHandle = nullptr, |
|
|
|
.basePipelineIndex = 0, |
|
|
|
}; |
|
|
|
|
|
|
|
const VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT subgroup_size_ci{ |
|
|
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT, |
|
|
|
.pNext = nullptr, |
|
|
|
.requiredSubgroupSize = GuestWarpSize, |
|
|
|
}; |
|
|
|
|
|
|
|
if (entries.uses_warps && device.IsGuestWarpSizeSupported(VK_SHADER_STAGE_COMPUTE_BIT)) { |
|
|
|
stage_ci.pNext = &subgroup_size_ci; |
|
|
|
ci.stage.pNext = &subgroup_size_ci; |
|
|
|
} |
|
|
|
|
|
|
|
ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; |
|
|
|
ci.pNext = nullptr; |
|
|
|
ci.flags = 0; |
|
|
|
ci.layout = *layout; |
|
|
|
ci.basePipelineHandle = nullptr; |
|
|
|
ci.basePipelineIndex = 0; |
|
|
|
return device.GetLogical().CreateComputePipeline(ci); |
|
|
|
} |
|
|
|
|
|
|
|
|