Added fallback to vkCreateRenderPass if VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME isn't supported

This commit is contained in:
Bastiaan Olij 2022-10-11 11:32:00 +11:00
parent 28f642097a
commit 64a78c3dad
2 changed files with 114 additions and 6 deletions

View file

@ -48,15 +48,119 @@
VulkanHooks *VulkanContext::vulkan_hooks = nullptr;
VkResult VulkanContext::vkCreateRenderPass2KHR(VkDevice p_device, const VkRenderPassCreateInfo2 *p_create_info, const VkAllocationCallbacks *p_allocator, VkRenderPass *p_render_pass) {
if (fpCreateRenderPass2KHR == nullptr) {
fpCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)vkGetInstanceProcAddr(inst, "vkCreateRenderPass2KHR");
Vector<VkAttachmentReference> VulkanContext::_convert_VkAttachmentReference2(uint32_t p_count, const VkAttachmentReference2 *p_refs) {
Vector<VkAttachmentReference> att_refs;
if (p_refs != nullptr) {
for (uint32_t i = 0; i < p_count; i++) {
// We lose aspectMask in this conversion but we don't use it currently.
VkAttachmentReference ref = {
p_refs[i].attachment, /* attachment */
p_refs[i].layout /* layout */
};
att_refs.push_back(ref);
}
}
if (fpCreateRenderPass2KHR == nullptr) {
return VK_ERROR_EXTENSION_NOT_PRESENT;
return att_refs;
}
VkResult VulkanContext::vkCreateRenderPass2KHR(VkDevice p_device, const VkRenderPassCreateInfo2 *p_create_info, const VkAllocationCallbacks *p_allocator, VkRenderPass *p_render_pass) {
if (has_renderpass2_ext) {
if (fpCreateRenderPass2KHR == nullptr) {
fpCreateRenderPass2KHR = (PFN_vkCreateRenderPass2KHR)vkGetDeviceProcAddr(p_device, "vkCreateRenderPass2KHR");
}
if (fpCreateRenderPass2KHR == nullptr) {
return VK_ERROR_EXTENSION_NOT_PRESENT;
} else {
return (fpCreateRenderPass2KHR)(p_device, p_create_info, p_allocator, p_render_pass);
}
} else {
return (fpCreateRenderPass2KHR)(p_device, p_create_info, p_allocator, p_render_pass);
// need to fall back on vkCreateRenderPass
const void *next = p_create_info->pNext; // ATM we only support multiview which should work if supported.
Vector<VkAttachmentDescription> attachments;
for (uint32_t i = 0; i < p_create_info->attachmentCount; i++) {
// Basically the old layout just misses type and next.
VkAttachmentDescription att = {
p_create_info->pAttachments[i].flags, /* flags */
p_create_info->pAttachments[i].format, /* format */
p_create_info->pAttachments[i].samples, /* samples */
p_create_info->pAttachments[i].loadOp, /* loadOp */
p_create_info->pAttachments[i].storeOp, /* storeOp */
p_create_info->pAttachments[i].stencilLoadOp, /* stencilLoadOp */
p_create_info->pAttachments[i].stencilStoreOp, /* stencilStoreOp */
p_create_info->pAttachments[i].initialLayout, /* initialLayout */
p_create_info->pAttachments[i].finalLayout /* finalLayout */
};
attachments.push_back(att);
}
Vector<VkSubpassDescription> subpasses;
for (uint32_t i = 0; i < p_create_info->subpassCount; i++) {
// Here we need to do more, again it's just stripping out type and next
// but we have VkAttachmentReference2 to convert to VkAttachmentReference.
// Also viewmask is not supported but we don't use it outside of multiview.
Vector<VkAttachmentReference> input_attachments = _convert_VkAttachmentReference2(p_create_info->pSubpasses[i].inputAttachmentCount, p_create_info->pSubpasses[i].pInputAttachments);
Vector<VkAttachmentReference> color_attachments = _convert_VkAttachmentReference2(p_create_info->pSubpasses[i].colorAttachmentCount, p_create_info->pSubpasses[i].pColorAttachments);
Vector<VkAttachmentReference> resolve_attachments = _convert_VkAttachmentReference2(p_create_info->pSubpasses[i].colorAttachmentCount, p_create_info->pSubpasses[i].pResolveAttachments);
Vector<VkAttachmentReference> depth_attachments = _convert_VkAttachmentReference2(p_create_info->pSubpasses[i].colorAttachmentCount, p_create_info->pSubpasses[i].pDepthStencilAttachment);
VkSubpassDescription subpass = {
p_create_info->pSubpasses[i].flags, /* flags */
p_create_info->pSubpasses[i].pipelineBindPoint, /* pipelineBindPoint */
p_create_info->pSubpasses[i].inputAttachmentCount, /* inputAttachmentCount */
input_attachments.size() == 0 ? nullptr : input_attachments.ptr(), /* pInputAttachments */
p_create_info->pSubpasses[i].colorAttachmentCount, /* colorAttachmentCount */
color_attachments.size() == 0 ? nullptr : color_attachments.ptr(), /* pColorAttachments */
resolve_attachments.size() == 0 ? nullptr : resolve_attachments.ptr(), /* pResolveAttachments */
depth_attachments.size() == 0 ? nullptr : depth_attachments.ptr(), /* pDepthStencilAttachment */
p_create_info->pSubpasses[i].preserveAttachmentCount, /* preserveAttachmentCount */
p_create_info->pSubpasses[i].pPreserveAttachments /* pPreserveAttachments */
};
subpasses.push_back(subpass);
}
Vector<VkSubpassDependency> dependencies;
for (uint32_t i = 0; i < p_create_info->dependencyCount; i++) {
// We lose viewOffset here but again I don't believe we use this anywhere.
VkSubpassDependency dep = {
p_create_info->pDependencies[i].srcSubpass, /* srcSubpass */
p_create_info->pDependencies[i].dstSubpass, /* dstSubpass */
p_create_info->pDependencies[i].srcStageMask, /* srcStageMask */
p_create_info->pDependencies[i].dstStageMask, /* dstStageMask */
p_create_info->pDependencies[i].srcAccessMask, /* srcAccessMask */
p_create_info->pDependencies[i].dstAccessMask, /* dstAccessMask */
p_create_info->pDependencies[i].dependencyFlags, /* dependencyFlags */
};
dependencies.push_back(dep);
}
// CorrelatedViewMask is not supported in vkCreateRenderPass but we
// currently only use this for multiview.
// We'll need to look into this.
VkRenderPassCreateInfo create_info = {
VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, /* sType */
next, /* pNext*/
p_create_info->flags, /* flags */
(uint32_t)attachments.size(), /* attachmentCount */
attachments.ptr(), /* pAttachments */
(uint32_t)subpasses.size(), /* subpassCount */
subpasses.ptr(), /* pSubpasses */
(uint32_t)dependencies.size(), /* */
dependencies.ptr(), /* */
};
return vkCreateRenderPass(device, &create_info, p_allocator, p_render_pass);
}
}
@ -1060,6 +1164,7 @@ Error VulkanContext::_create_physical_device(VkSurfaceKHR p_surface) {
extension_names[enabled_extension_count++] = VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME;
}
if (!strcmp(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME, device_extensions[i].extensionName)) {
has_renderpass2_ext = true;
extension_names[enabled_extension_count++] = VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME;
}
if (enabled_extension_count >= MAX_EXTENSIONS) {

View file

@ -188,6 +188,7 @@ private:
uint32_t enabled_extension_count = 0;
const char *extension_names[MAX_EXTENSIONS];
bool enabled_debug_utils = false;
bool has_renderpass2_ext = false;
/**
* True if VK_EXT_debug_report extension is used. VK_EXT_debug_report is deprecated but it is
@ -257,6 +258,8 @@ private:
Error _create_swap_chain();
Error _create_semaphores();
Vector<VkAttachmentReference> _convert_VkAttachmentReference2(uint32_t p_count, const VkAttachmentReference2 *p_refs);
protected:
virtual const char *_get_platform_surface_extension() const = 0;