1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-14 22:29:15 +01:00

[dxvk] Store clear values inside render pass ops

The previous model was designed around vkCmdBeginRenderPass, which was
somewhat clunky regarding attachment clears. This is no longer needed.
This commit is contained in:
Philip Rebohle 2022-07-04 21:03:20 +02:00
parent d71e85785c
commit fcadaec129
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 11 additions and 19 deletions

View File

@ -2046,17 +2046,17 @@ namespace dxvk {
if (m_state.om.renderPassOps.colorOps[colorIndex].loadOp != VK_ATTACHMENT_LOAD_OP_LOAD && !is3D) if (m_state.om.renderPassOps.colorOps[colorIndex].loadOp != VK_ATTACHMENT_LOAD_OP_LOAD && !is3D)
m_state.om.renderPassOps.colorOps[colorIndex].loadLayout = VK_IMAGE_LAYOUT_UNDEFINED; m_state.om.renderPassOps.colorOps[colorIndex].loadLayout = VK_IMAGE_LAYOUT_UNDEFINED;
m_state.om.clearValues[attachmentIndex].color = clearValue.color; m_state.om.renderPassOps.colorOps[colorIndex].clearValue = clearValue.color;
} }
if ((clearAspects | discardAspects) & VK_IMAGE_ASPECT_DEPTH_BIT) { if ((clearAspects | discardAspects) & VK_IMAGE_ASPECT_DEPTH_BIT) {
m_state.om.renderPassOps.depthOps.loadOpD = depthOp.loadOpD; m_state.om.renderPassOps.depthOps.loadOpD = depthOp.loadOpD;
m_state.om.clearValues[attachmentIndex].depthStencil.depth = clearValue.depthStencil.depth; m_state.om.renderPassOps.depthOps.clearValue.depth = clearValue.depthStencil.depth;
} }
if ((clearAspects | discardAspects) & VK_IMAGE_ASPECT_STENCIL_BIT) { if ((clearAspects | discardAspects) & VK_IMAGE_ASPECT_STENCIL_BIT) {
m_state.om.renderPassOps.depthOps.loadOpS = depthOp.loadOpS; m_state.om.renderPassOps.depthOps.loadOpS = depthOp.loadOpS;
m_state.om.clearValues[attachmentIndex].depthStencil.stencil = clearValue.depthStencil.stencil; m_state.om.renderPassOps.depthOps.clearValue.stencil = clearValue.depthStencil.stencil;
} }
if ((clearAspects | discardAspects) & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if ((clearAspects | discardAspects) & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
@ -4010,9 +4010,7 @@ namespace dxvk {
this->renderPassBindFramebuffer( this->renderPassBindFramebuffer(
m_state.om.framebufferInfo, m_state.om.framebufferInfo,
m_state.om.renderPassOps, m_state.om.renderPassOps);
m_state.om.framebufferInfo.numAttachments(),
m_state.om.clearValues.data());
// Track the final layout of each render target // Track the final layout of each render target
this->applyRenderTargetStoreLayouts(); this->applyRenderTargetStoreLayouts();
@ -4207,15 +4205,12 @@ namespace dxvk {
void DxvkContext::renderPassBindFramebuffer( void DxvkContext::renderPassBindFramebuffer(
const DxvkFramebufferInfo& framebufferInfo, const DxvkFramebufferInfo& framebufferInfo,
const DxvkRenderPassOps& ops, const DxvkRenderPassOps& ops) {
uint32_t clearValueCount,
const VkClearValue* clearValues) {
const DxvkFramebufferSize fbSize = framebufferInfo.size(); const DxvkFramebufferSize fbSize = framebufferInfo.size();
this->renderPassEmitInitBarriers(framebufferInfo, ops); this->renderPassEmitInitBarriers(framebufferInfo, ops);
this->renderPassEmitPostBarriers(framebufferInfo, ops); this->renderPassEmitPostBarriers(framebufferInfo, ops);
uint32_t clearValueIndex = 0;
uint32_t colorInfoCount = 0; uint32_t colorInfoCount = 0;
std::array<VkRenderingAttachmentInfoKHR, MaxNumRenderTargets> colorInfos; std::array<VkRenderingAttachmentInfoKHR, MaxNumRenderTargets> colorInfos;
@ -4231,9 +4226,8 @@ namespace dxvk {
colorInfos[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE; colorInfos[i].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
if (ops.colorOps[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) if (ops.colorOps[i].loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
colorInfos[i].clearValue = clearValues[clearValueIndex]; colorInfos[i].clearValue.color = ops.colorOps[i].clearValue;
clearValueIndex += 1;
colorInfoCount = i + 1; colorInfoCount = i + 1;
} }
} }
@ -4250,7 +4244,7 @@ namespace dxvk {
depthInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; depthInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
if (ops.depthOps.loadOpD == VK_ATTACHMENT_LOAD_OP_CLEAR) if (ops.depthOps.loadOpD == VK_ATTACHMENT_LOAD_OP_CLEAR)
depthInfo.clearValue = clearValues[clearValueIndex]; depthInfo.clearValue.depthStencil.depth = ops.depthOps.clearValue.depth;
} }
VkRenderingAttachmentInfoKHR stencilInfo = depthInfo; VkRenderingAttachmentInfoKHR stencilInfo = depthInfo;
@ -4260,7 +4254,7 @@ namespace dxvk {
stencilInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; stencilInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
if (ops.depthOps.loadOpS == VK_ATTACHMENT_LOAD_OP_CLEAR) if (ops.depthOps.loadOpS == VK_ATTACHMENT_LOAD_OP_CLEAR)
stencilInfo.clearValue = clearValues[clearValueIndex]; stencilInfo.clearValue.depthStencil.stencil = ops.depthOps.clearValue.stencil;
} }
VkRenderingInfoKHR renderingInfo = { VK_STRUCTURE_TYPE_RENDERING_INFO_KHR }; VkRenderingInfoKHR renderingInfo = { VK_STRUCTURE_TYPE_RENDERING_INFO_KHR };

View File

@ -1297,9 +1297,7 @@ namespace dxvk {
void renderPassBindFramebuffer( void renderPassBindFramebuffer(
const DxvkFramebufferInfo& framebufferInfo, const DxvkFramebufferInfo& framebufferInfo,
const DxvkRenderPassOps& ops, const DxvkRenderPassOps& ops);
uint32_t clearValueCount,
const VkClearValue* clearValues);
void renderPassUnbindFramebuffer(); void renderPassUnbindFramebuffer();

View File

@ -97,8 +97,6 @@ namespace dxvk {
struct DxvkOutputMergerState { struct DxvkOutputMergerState {
std::array<VkClearValue, MaxNumRenderTargets + 1> clearValues = { };
DxvkRenderTargets renderTargets; DxvkRenderTargets renderTargets;
DxvkRenderPassOps renderPassOps; DxvkRenderPassOps renderPassOps;
DxvkFramebufferInfo framebufferInfo; DxvkFramebufferInfo framebufferInfo;

View File

@ -24,6 +24,7 @@ namespace dxvk {
VkAttachmentLoadOp loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; VkAttachmentLoadOp loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
VkImageLayout loadLayout = VK_IMAGE_LAYOUT_UNDEFINED; VkImageLayout loadLayout = VK_IMAGE_LAYOUT_UNDEFINED;
VkImageLayout storeLayout = VK_IMAGE_LAYOUT_GENERAL; VkImageLayout storeLayout = VK_IMAGE_LAYOUT_GENERAL;
VkClearColorValue clearValue = VkClearColorValue();
}; };
@ -38,6 +39,7 @@ namespace dxvk {
VkAttachmentLoadOp loadOpS = VK_ATTACHMENT_LOAD_OP_DONT_CARE; VkAttachmentLoadOp loadOpS = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
VkImageLayout loadLayout = VK_IMAGE_LAYOUT_UNDEFINED; VkImageLayout loadLayout = VK_IMAGE_LAYOUT_UNDEFINED;
VkImageLayout storeLayout = VK_IMAGE_LAYOUT_GENERAL; VkImageLayout storeLayout = VK_IMAGE_LAYOUT_GENERAL;
VkClearDepthStencilValue clearValue = VkClearDepthStencilValue();
}; };