1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-01 08:52:11 +01:00

[dxvk] Normalize render target layouts when binding framebuffer

No reason to use ATTACHMENT_OPTIMAL when the default layout is GENERAL.
This commit is contained in:
Philip Rebohle 2024-10-12 14:41:36 +02:00 committed by Philip Rebohle
parent f76fb75956
commit af4ec3c63d
3 changed files with 18 additions and 17 deletions

View File

@ -50,19 +50,15 @@ namespace dxvk {
}
VkImageLayout GetRenderLayout() const {
if (m_view->image()->info().tiling == VK_IMAGE_TILING_OPTIMAL) {
switch (m_desc.Flags & (D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL)) {
default: // case 0
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
case D3D11_DSV_READ_ONLY_DEPTH:
return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR;
case D3D11_DSV_READ_ONLY_STENCIL:
return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR;
case D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL:
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
}
} else {
return VK_IMAGE_LAYOUT_GENERAL;
switch (m_desc.Flags & (D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL)) {
default: // case 0
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
case D3D11_DSV_READ_ONLY_DEPTH:
return VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR;
case D3D11_DSV_READ_ONLY_STENCIL:
return VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR;
case D3D11_DSV_READ_ONLY_DEPTH | D3D11_DSV_READ_ONLY_STENCIL:
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
}
}

View File

@ -52,9 +52,7 @@ namespace dxvk {
}
VkImageLayout GetRenderLayout() const {
return m_view->image()->info().tiling == VK_IMAGE_TILING_OPTIMAL
? VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
: VK_IMAGE_LAYOUT_GENERAL;
return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
}
UINT GetSampleCount() const {

View File

@ -120,9 +120,16 @@ namespace dxvk {
void bindRenderTargets(
DxvkRenderTargets&& targets,
VkImageAspectFlags feedbackLoop) {
// Set up default render pass ops
// Set up default render pass ops and normalize layouts
m_state.om.renderTargets = std::move(targets);
for (uint32_t i = 0; i < MaxNumRenderTargets; i++) {
auto& rt = m_state.om.renderTargets.color[i];
if (rt.view)
rt.layout = rt.view->pickLayout(rt.layout);
}
if (unlikely(m_state.gp.state.om.feedbackLoop() != feedbackLoop)) {
m_state.gp.state.om.setFeedbackLoop(feedbackLoop);
m_flags.set(DxvkContextFlag::GpDirtyPipelineState);