mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-21 22:54:16 +01:00
[d3d9] Optimize clears with rt mask and better ref tracking
This commit is contained in:
parent
072d3a039e
commit
2f22c1b53d
@ -1418,25 +1418,24 @@ namespace dxvk {
|
|||||||
VkClearValue clearValueColor;
|
VkClearValue clearValueColor;
|
||||||
DecodeD3DCOLOR(Color, clearValueColor.color.float32);
|
DecodeD3DCOLOR(Color, clearValueColor.color.float32);
|
||||||
|
|
||||||
auto dsv = m_state.depthStencil != nullptr ? m_state.depthStencil->GetDepthStencilView() : nullptr;
|
|
||||||
VkImageAspectFlags depthAspectMask = 0;
|
VkImageAspectFlags depthAspectMask = 0;
|
||||||
if (dsv != nullptr) {
|
if (m_state.depthStencil != nullptr) {
|
||||||
if (Flags & D3DCLEAR_ZBUFFER)
|
if (Flags & D3DCLEAR_ZBUFFER)
|
||||||
depthAspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
|
depthAspectMask |= VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||||
|
|
||||||
if (Flags & D3DCLEAR_STENCIL)
|
if (Flags & D3DCLEAR_STENCIL)
|
||||||
depthAspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
depthAspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||||
|
|
||||||
depthAspectMask &= imageFormatInfo(dsv->info().format)->aspectMask;
|
depthAspectMask &= imageFormatInfo(m_state.depthStencil->GetCommonTexture()->GetFormatMapping().FormatColor)->aspectMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ClearImageView = [this](
|
auto ClearImageView = [this](
|
||||||
bool fullClear,
|
bool fullClear,
|
||||||
VkOffset3D offset,
|
VkOffset3D offset,
|
||||||
VkExtent3D extent,
|
VkExtent3D extent,
|
||||||
Rc<DxvkImageView> imageView,
|
const Rc<DxvkImageView>& imageView,
|
||||||
VkImageAspectFlags aspectMask,
|
VkImageAspectFlags aspectMask,
|
||||||
VkClearValue clearValue) {
|
VkClearValue clearValue) {
|
||||||
if (fullClear) {
|
if (fullClear) {
|
||||||
EmitCs([
|
EmitCs([
|
||||||
cClearValue = clearValue,
|
cClearValue = clearValue,
|
||||||
@ -1472,14 +1471,14 @@ namespace dxvk {
|
|||||||
VkExtent3D extent) {
|
VkExtent3D extent) {
|
||||||
// Clear depth if we need to.
|
// Clear depth if we need to.
|
||||||
if (depthAspectMask != 0)
|
if (depthAspectMask != 0)
|
||||||
ClearImageView(fullClear, offset, extent, dsv, depthAspectMask, clearValueDepth);
|
ClearImageView(fullClear, offset, extent, m_state.depthStencil->GetDepthStencilView(), depthAspectMask, clearValueDepth);
|
||||||
|
|
||||||
// Clear render targets if we need to.
|
// Clear render targets if we need to.
|
||||||
if (Flags & D3DCLEAR_TARGET) {
|
if (Flags & D3DCLEAR_TARGET) {
|
||||||
for (auto rt : m_state.renderTargets) {
|
for (uint32_t rt = m_boundRTs; rt; rt &= rt - 1) {
|
||||||
auto rtv = rt != nullptr ? rt->GetRenderTargetView(srgb) : nullptr;
|
const auto& rtv = m_state.renderTargets[bit::tzcnt(rt)]->GetRenderTargetView(srgb);
|
||||||
|
|
||||||
if (unlikely(rtv != nullptr))
|
if (likely(rtv != nullptr))
|
||||||
ClearImageView(fullClear, offset, extent, rtv, VK_IMAGE_ASPECT_COLOR_BIT, clearValueColor);
|
ClearImageView(fullClear, offset, extent, rtv, VK_IMAGE_ASPECT_COLOR_BIT, clearValueColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user