vulkan/render_pass: Support VkAttachmentSampleCountInfoAMD
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16953>
This commit is contained in:
parent
541819b2d6
commit
21374eb777
|
@ -434,17 +434,19 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
pCreateInfo->dependencyCount);
|
||||
|
||||
uint32_t subpass_attachment_count = 0;
|
||||
uint32_t subpass_color_format_count = 0;
|
||||
uint32_t subpass_color_attachment_count = 0;
|
||||
for (uint32_t i = 0; i < pCreateInfo->subpassCount; i++) {
|
||||
subpass_attachment_count +=
|
||||
num_subpass_attachments2(&pCreateInfo->pSubpasses[i]);
|
||||
subpass_color_format_count +=
|
||||
subpass_color_attachment_count +=
|
||||
pCreateInfo->pSubpasses[i].colorAttachmentCount;
|
||||
}
|
||||
VK_MULTIALLOC_DECL(&ma, struct vk_subpass_attachment, subpass_attachments,
|
||||
subpass_attachment_count);
|
||||
VK_MULTIALLOC_DECL(&ma, VkFormat, subpass_color_formats,
|
||||
subpass_color_format_count);
|
||||
subpass_color_attachment_count);
|
||||
VK_MULTIALLOC_DECL(&ma, VkSampleCountFlagBits, subpass_color_samples,
|
||||
subpass_color_attachment_count);
|
||||
|
||||
if (!vk_object_multizalloc(device, &ma, pAllocator,
|
||||
VK_OBJECT_TYPE_RENDER_PASS))
|
||||
|
@ -464,6 +466,7 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
|
||||
struct vk_subpass_attachment *next_subpass_attachment = subpass_attachments;
|
||||
VkFormat *next_subpass_color_format = subpass_color_formats;
|
||||
VkSampleCountFlagBits *next_subpass_color_samples = subpass_color_samples;
|
||||
for (uint32_t s = 0; s < pCreateInfo->subpassCount; s++) {
|
||||
const VkSubpassDescription2 *desc = &pCreateInfo->pSubpasses[s];
|
||||
struct vk_subpass *subpass = &pass->subpasses[s];
|
||||
|
@ -635,27 +638,33 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
}
|
||||
|
||||
VkFormat *color_formats = NULL;
|
||||
VkSampleCountFlagBits *color_samples = NULL;
|
||||
VkSampleCountFlagBits samples = 0;
|
||||
if (desc->colorAttachmentCount > 0) {
|
||||
color_formats = next_subpass_color_format;
|
||||
color_samples = next_subpass_color_samples;
|
||||
for (uint32_t a = 0; a < desc->colorAttachmentCount; a++) {
|
||||
const VkAttachmentReference2 *ref = &desc->pColorAttachments[a];
|
||||
if (ref->attachment >= pCreateInfo->attachmentCount) {
|
||||
color_formats[a] = VK_FORMAT_UNDEFINED;
|
||||
color_samples[a] = VK_SAMPLE_COUNT_1_BIT;
|
||||
} else {
|
||||
const VkAttachmentDescription2 *att =
|
||||
&pCreateInfo->pAttachments[ref->attachment];
|
||||
|
||||
color_formats[a] = att->format;
|
||||
color_samples[a] = att->samples;
|
||||
|
||||
samples |= att->samples;
|
||||
}
|
||||
}
|
||||
next_subpass_color_format += desc->colorAttachmentCount;
|
||||
next_subpass_color_samples += desc->colorAttachmentCount;
|
||||
}
|
||||
|
||||
VkFormat depth_format = VK_FORMAT_UNDEFINED;
|
||||
VkFormat stencil_format = VK_FORMAT_UNDEFINED;
|
||||
VkSampleCountFlagBits depth_stencil_samples = VK_SAMPLE_COUNT_1_BIT;
|
||||
if (desc->pDepthStencilAttachment != NULL) {
|
||||
const VkAttachmentReference2 *ref = desc->pDepthStencilAttachment;
|
||||
if (ref->attachment < pCreateInfo->attachmentCount) {
|
||||
|
@ -667,6 +676,8 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
if (vk_format_has_stencil(att->format))
|
||||
stencil_format = att->format;
|
||||
|
||||
depth_stencil_samples = att->samples;
|
||||
|
||||
samples |= att->samples;
|
||||
}
|
||||
}
|
||||
|
@ -678,9 +689,17 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
.stencilSelfDependency = has_stencil_self_dep,
|
||||
};
|
||||
|
||||
subpass->sample_count_info_amd = (VkAttachmentSampleCountInfoAMD) {
|
||||
.sType = VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD,
|
||||
.pNext = &subpass->self_dep_info,
|
||||
.colorAttachmentCount = desc->colorAttachmentCount,
|
||||
.pColorAttachmentSamples = color_samples,
|
||||
.depthStencilAttachmentSamples = depth_stencil_samples,
|
||||
};
|
||||
|
||||
subpass->pipeline_info = (VkPipelineRenderingCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO,
|
||||
.pNext = &subpass->self_dep_info,
|
||||
.pNext = &subpass->sample_count_info_amd,
|
||||
.viewMask = desc->viewMask,
|
||||
.colorAttachmentCount = desc->colorAttachmentCount,
|
||||
.pColorAttachmentFormats = color_formats,
|
||||
|
@ -690,7 +709,7 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
|
||||
subpass->inheritance_info = (VkCommandBufferInheritanceRenderingInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO,
|
||||
.pNext = &subpass->self_dep_info,
|
||||
.pNext = &subpass->sample_count_info_amd,
|
||||
/* If we're inheriting, the contents are clearly in secondaries */
|
||||
.flags = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT,
|
||||
.viewMask = desc->viewMask,
|
||||
|
@ -704,7 +723,9 @@ vk_common_CreateRenderPass2(VkDevice _device,
|
|||
assert(next_subpass_attachment ==
|
||||
subpass_attachments + subpass_attachment_count);
|
||||
assert(next_subpass_color_format ==
|
||||
subpass_color_formats + subpass_color_format_count);
|
||||
subpass_color_formats + subpass_color_attachment_count);
|
||||
assert(next_subpass_color_samples ==
|
||||
subpass_color_samples + subpass_color_attachment_count);
|
||||
|
||||
/* Walk backwards over the subpasses to compute view masks and
|
||||
* last_subpass masks for all attachments.
|
||||
|
@ -792,6 +813,18 @@ vk_get_pipeline_rendering_create_info(const VkGraphicsPipelineCreateInfo *info)
|
|||
return vk_find_struct_const(info->pNext, PIPELINE_RENDERING_CREATE_INFO);
|
||||
}
|
||||
|
||||
const VkAttachmentSampleCountInfoAMD *
|
||||
vk_get_pipeline_sample_count_info_amd(const VkGraphicsPipelineCreateInfo *info)
|
||||
{
|
||||
VK_FROM_HANDLE(vk_render_pass, render_pass, info->renderPass);
|
||||
if (render_pass != NULL) {
|
||||
assert(info->subpass < render_pass->subpass_count);
|
||||
return &render_pass->subpasses[info->subpass].sample_count_info_amd;
|
||||
}
|
||||
|
||||
return vk_find_struct_const(info->pNext, ATTACHMENT_SAMPLE_COUNT_INFO_AMD);
|
||||
}
|
||||
|
||||
const VkCommandBufferInheritanceRenderingInfo *
|
||||
vk_get_command_buffer_inheritance_rendering_info(
|
||||
VkCommandBufferLevel level,
|
||||
|
|
|
@ -179,6 +179,12 @@ struct vk_subpass {
|
|||
*/
|
||||
VkRenderingSelfDependencyInfoMESA self_dep_info;
|
||||
|
||||
/** VkAttachmentSampleCountInfoAMD for this subpass
|
||||
*
|
||||
* This is in the pNext chain of pipeline_info and inheritance_info.
|
||||
*/
|
||||
VkAttachmentSampleCountInfoAMD sample_count_info_amd;
|
||||
|
||||
/** VkPipelineRenderingCreateInfo for this subpass
|
||||
*
|
||||
* Returned by vk_get_pipeline_rendering_create_info() if
|
||||
|
@ -320,6 +326,21 @@ VK_DEFINE_NONDISP_HANDLE_CASTS(vk_render_pass, base, VkRenderPass,
|
|||
const VkPipelineRenderingCreateInfo *
|
||||
vk_get_pipeline_rendering_create_info(const VkGraphicsPipelineCreateInfo *info);
|
||||
|
||||
/** Returns the VkAttachmentSampleCountInfoAMD for a graphics pipeline
|
||||
*
|
||||
* For render-pass-free drivers, this can be used in the implementaiton of
|
||||
* vkCreateGraphicsPipelines to get the VkAttachmentSampleCountInfoAMD. If
|
||||
* VkGraphicsPipelineCreateInfo::renderPass is not VK_NULL_HANDLE, it will
|
||||
* return the sample counts from the specified subpass as a
|
||||
* VkAttachmentSampleCountInfoAMD. If VkGraphicsPipelineCreateInfo::renderPass
|
||||
* is VK_NULL_HANDLE and there is a VkAttachmentSampleCountInfoAMD in the pNext
|
||||
* chain of VkGraphicsPipelineCreateInfo, it will return that.
|
||||
*
|
||||
* @param[in] info One of the pCreateInfos from vkCreateGraphicsPipelines
|
||||
*/
|
||||
const VkAttachmentSampleCountInfoAMD *
|
||||
vk_get_pipeline_sample_count_info_amd(const VkGraphicsPipelineCreateInfo *info);
|
||||
|
||||
/**
|
||||
* Returns the VkCommandBufferInheritanceRenderingInfo for secondary command
|
||||
* buffer execution
|
||||
|
|
Loading…
Reference in New Issue