1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-28 02:19:26 +01:00

[dxvk] Use clearRenderTarget for discards as well

This commit is contained in:
Philip Rebohle 2025-03-21 03:03:33 +01:00
parent 496091815e
commit 31529b8bab
4 changed files with 24 additions and 64 deletions

View File

@ -203,11 +203,11 @@ namespace dxvk {
}
}
// Since we don't handle SRVs here, we can assume that the
// view covers all aspects of the underlying resource.
EmitCs([cView = view] (DxvkContext* ctx) {
ctx->discardImageView(cView, cView->formatInfo()->aspectMask);
});
if (rtv || dsv) {
EmitCs([cView = view] (DxvkContext* ctx) {
ctx->clearRenderTarget(cView, 0, VkClearValue(), cView->info().aspects);
});
}
}
@ -430,10 +430,9 @@ namespace dxvk {
cClearValue = color,
cImageView = std::move(view)
] (DxvkContext* ctx) {
ctx->clearRenderTarget(
cImageView,
ctx->clearRenderTarget(cImageView,
VK_IMAGE_ASPECT_COLOR_BIT,
cClearValue);
cClearValue, 0u);
});
}
@ -667,10 +666,8 @@ namespace dxvk {
cAspectMask = aspectMask,
cImageView = dsv->GetImageView()
] (DxvkContext* ctx) {
ctx->clearRenderTarget(
cImageView,
cAspectMask,
cClearValue);
ctx->clearRenderTarget(cImageView,
cAspectMask, cClearValue, 0u);
});
}
@ -795,17 +792,10 @@ namespace dxvk {
bool isFullSize = cImageView->mipLevelExtent(0) == cAreaExtent;
if ((cImageView->info().usage & rtUsage) && isFullSize) {
ctx->clearRenderTarget(
cImageView,
cClearAspect,
cClearValue);
ctx->clearRenderTarget(cImageView, cClearAspect, cClearValue, 0u);
} else {
ctx->clearImageView(
cImageView,
cAreaOffset,
cAreaExtent,
cClearAspect,
cClearValue);
ctx->clearImageView(cImageView, cAreaOffset, cAreaExtent,
cClearAspect, cClearValue);
}
});
}

View File

@ -1552,7 +1552,7 @@ namespace dxvk {
Rc<DxvkImageView> view = cImage->createView(viewKey);
if (cOffset == VkOffset3D() && cExtent == cImage->mipLevelExtent(viewKey.mipIndex)) {
ctx->clearRenderTarget(view, cSubresource.aspectMask, cClearValue);
ctx->clearRenderTarget(view, cSubresource.aspectMask, cClearValue, 0u);
} else {
ctx->clearImageView(view, cOffset, cExtent,
cSubresource.aspectMask, cClearValue);
@ -1913,10 +1913,8 @@ namespace dxvk {
cAspectMask = aspectMask,
cImageView = imageView
] (DxvkContext* ctx) {
ctx->clearRenderTarget(
cImageView,
cAspectMask,
cClearValue);
ctx->clearRenderTarget(cImageView,
cAspectMask, cClearValue, 0u);
});
}
else {

View File

@ -378,7 +378,8 @@ namespace dxvk {
void DxvkContext::clearRenderTarget(
const Rc<DxvkImageView>& imageView,
VkImageAspectFlags clearAspects,
VkClearValue clearValue) {
VkClearValue clearValue,
VkImageAspectFlags discardAspects) {
// Make sure the color components are ordered correctly
if (clearAspects & VK_IMAGE_ASPECT_COLOR_BIT) {
clearValue.color = util::swizzleClearColor(clearValue.color,
@ -413,6 +414,9 @@ namespace dxvk {
// next draw if there is no reason to interrupt the render pass. This is
// useful to adjust store ops for tilers, and ensures that pending resolves
// are handled correctly.
if (discardAspects)
this->deferDiscard(imageView, discardAspects);
if (clearAspects)
this->deferClear(imageView, clearAspects, clearValue);
@ -866,27 +870,6 @@ namespace dxvk {
}
void DxvkContext::discardImageView(
const Rc<DxvkImageView>& imageView,
VkImageAspectFlags discardAspects) {
VkImageUsageFlags viewUsage = imageView->info().usage;
if (!(viewUsage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)))
return;
// Perform store op optimization on bound render targets
if (m_flags.test(DxvkContextFlag::GpRenderPassBound)) {
VkImageSubresourceRange subresource = imageView->imageSubresources();
subresource.aspectMask &= discardAspects;
discardRenderTarget(*imageView->image(), subresource);
}
// Perform load op optimization on subsequent render passes
deferDiscard(imageView, discardAspects);
}
void DxvkContext::discardImage(
const Rc<DxvkImage>& image) {
VkImageUsageFlags imageUsage = image->info().usage;

View File

@ -500,12 +500,14 @@ namespace dxvk {
* \param [in] imageView Render target view to clear
* \param [in] clearAspects Image aspects to clear
* \param [in] clearValue The clear value
* \param [in] discardAspects Image aspects to discard
*/
void clearRenderTarget(
const Rc<DxvkImageView>& imageView,
VkImageAspectFlags clearAspects,
VkClearValue clearValue);
VkClearValue clearValue,
VkImageAspectFlags discardAspects);
/**
* \brief Clears an image view
*
@ -705,19 +707,6 @@ namespace dxvk {
const uint32_t* pages,
const Rc<DxvkBuffer>& srcBuffer,
VkDeviceSize srcOffset);
/**
* \brief Discards contents of an image view
*
* Discards the current contents of the image
* and performs a fast layout transition. This
* may improve performance in some cases.
* \param [in] imageView View to discard
* \param [in] discardAspects Image aspects to discard
*/
void discardImageView(
const Rc<DxvkImageView>& imageView,
VkImageAspectFlags discardAspects);
/**
* \brief Discards contents of an image