yuzu-emu
/
yuzu
Archived
1
0
Fork 0

vk_renderpass_cache: Make use of designated initializers where applicable

This commit is contained in:
Lioncash 2020-07-16 18:57:23 -04:00
parent 01f297f2e0
commit 8ebd6a21c5
1 changed files with 69 additions and 58 deletions

View File

@ -39,10 +39,14 @@ VkRenderPass VKRenderPassCache::GetRenderPass(const RenderPassParams& params) {
vk::RenderPass VKRenderPassCache::CreateRenderPass(const RenderPassParams& params) const { vk::RenderPass VKRenderPassCache::CreateRenderPass(const RenderPassParams& params) const {
using namespace VideoCore::Surface; using namespace VideoCore::Surface;
std::vector<VkAttachmentDescription> descriptors;
std::vector<VkAttachmentReference> color_references;
const std::size_t num_attachments = static_cast<std::size_t>(params.num_color_attachments); const std::size_t num_attachments = static_cast<std::size_t>(params.num_color_attachments);
std::vector<VkAttachmentDescription> descriptors;
descriptors.reserve(num_attachments);
std::vector<VkAttachmentReference> color_references;
color_references.reserve(num_attachments);
for (std::size_t rt = 0; rt < num_attachments; ++rt) { for (std::size_t rt = 0; rt < num_attachments; ++rt) {
const auto guest_format = static_cast<Tegra::RenderTargetFormat>(params.color_formats[rt]); const auto guest_format = static_cast<Tegra::RenderTargetFormat>(params.color_formats[rt]);
const PixelFormat pixel_format = PixelFormatFromRenderTargetFormat(guest_format); const PixelFormat pixel_format = PixelFormatFromRenderTargetFormat(guest_format);
@ -54,20 +58,22 @@ vk::RenderPass VKRenderPassCache::CreateRenderPass(const RenderPassParams& param
const VkImageLayout color_layout = ((params.texceptions >> rt) & 1) != 0 const VkImageLayout color_layout = ((params.texceptions >> rt) & 1) != 0
? VK_IMAGE_LAYOUT_GENERAL ? VK_IMAGE_LAYOUT_GENERAL
: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; : VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkAttachmentDescription& descriptor = descriptors.emplace_back(); descriptors.push_back({
descriptor.flags = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT; .flags = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT,
descriptor.format = format.format; .format = format.format,
descriptor.samples = VK_SAMPLE_COUNT_1_BIT; .samples = VK_SAMPLE_COUNT_1_BIT,
descriptor.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
descriptor.storeOp = VK_ATTACHMENT_STORE_OP_STORE; .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
descriptor.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
descriptor.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
descriptor.initialLayout = color_layout; .initialLayout = color_layout,
descriptor.finalLayout = color_layout; .finalLayout = color_layout,
});
VkAttachmentReference& reference = color_references.emplace_back(); color_references.push_back({
reference.attachment = static_cast<u32>(rt); .attachment = static_cast<u32>(rt),
reference.layout = color_layout; .layout = color_layout,
});
} }
VkAttachmentReference zeta_attachment_ref; VkAttachmentReference zeta_attachment_ref;
@ -82,32 +88,36 @@ vk::RenderPass VKRenderPassCache::CreateRenderPass(const RenderPassParams& param
const VkImageLayout zeta_layout = params.zeta_texception != 0 const VkImageLayout zeta_layout = params.zeta_texception != 0
? VK_IMAGE_LAYOUT_GENERAL ? VK_IMAGE_LAYOUT_GENERAL
: VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; : VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
VkAttachmentDescription& descriptor = descriptors.emplace_back(); descriptors.push_back({
descriptor.flags = 0; .flags = 0,
descriptor.format = format.format; .format = format.format,
descriptor.samples = VK_SAMPLE_COUNT_1_BIT; .samples = VK_SAMPLE_COUNT_1_BIT,
descriptor.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; .loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
descriptor.storeOp = VK_ATTACHMENT_STORE_OP_STORE; .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
descriptor.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
descriptor.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; .stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE,
descriptor.initialLayout = zeta_layout; .initialLayout = zeta_layout,
descriptor.finalLayout = zeta_layout; .finalLayout = zeta_layout,
});
zeta_attachment_ref.attachment = static_cast<u32>(num_attachments); zeta_attachment_ref = {
zeta_attachment_ref.layout = zeta_layout; .attachment = static_cast<u32>(num_attachments),
.layout = zeta_layout,
};
} }
VkSubpassDescription subpass_description; const VkSubpassDescription subpass_description{
subpass_description.flags = 0; .flags = 0,
subpass_description.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS,
subpass_description.inputAttachmentCount = 0; .inputAttachmentCount = 0,
subpass_description.pInputAttachments = nullptr; .pInputAttachments = nullptr,
subpass_description.colorAttachmentCount = static_cast<u32>(color_references.size()); .colorAttachmentCount = static_cast<u32>(color_references.size()),
subpass_description.pColorAttachments = color_references.data(); .pColorAttachments = color_references.data(),
subpass_description.pResolveAttachments = nullptr; .pResolveAttachments = nullptr,
subpass_description.pDepthStencilAttachment = has_zeta ? &zeta_attachment_ref : nullptr; .pDepthStencilAttachment = has_zeta ? &zeta_attachment_ref : nullptr,
subpass_description.preserveAttachmentCount = 0; .preserveAttachmentCount = 0,
subpass_description.pPreserveAttachments = nullptr; .pPreserveAttachments = nullptr,
};
VkAccessFlags access = 0; VkAccessFlags access = 0;
VkPipelineStageFlags stage = 0; VkPipelineStageFlags stage = 0;
@ -122,26 +132,27 @@ vk::RenderPass VKRenderPassCache::CreateRenderPass(const RenderPassParams& param
stage |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; stage |= VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
} }
VkSubpassDependency subpass_dependency; const VkSubpassDependency subpass_dependency{
subpass_dependency.srcSubpass = VK_SUBPASS_EXTERNAL; .srcSubpass = VK_SUBPASS_EXTERNAL,
subpass_dependency.dstSubpass = 0; .dstSubpass = 0,
subpass_dependency.srcStageMask = stage; .srcStageMask = stage,
subpass_dependency.dstStageMask = stage; .dstStageMask = stage,
subpass_dependency.srcAccessMask = 0; .srcAccessMask = 0,
subpass_dependency.dstAccessMask = access; .dstAccessMask = access,
subpass_dependency.dependencyFlags = 0; .dependencyFlags = 0,
};
VkRenderPassCreateInfo ci; return device.GetLogical().CreateRenderPass({
ci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
ci.pNext = nullptr; .pNext = nullptr,
ci.flags = 0; .flags = 0,
ci.attachmentCount = static_cast<u32>(descriptors.size()); .attachmentCount = static_cast<u32>(descriptors.size()),
ci.pAttachments = descriptors.data(); .pAttachments = descriptors.data(),
ci.subpassCount = 1; .subpassCount = 1,
ci.pSubpasses = &subpass_description; .pSubpasses = &subpass_description,
ci.dependencyCount = 1; .dependencyCount = 1,
ci.pDependencies = &subpass_dependency; .pDependencies = &subpass_dependency,
return device.GetLogical().CreateRenderPass(ci); });
} }
} // namespace Vulkan } // namespace Vulkan