diff --git a/src/dxvk/dxvk_barrier.cpp b/src/dxvk/dxvk_barrier.cpp index ba96655cd..b5f9e278f 100644 --- a/src/dxvk/dxvk_barrier.cpp +++ b/src/dxvk/dxvk_barrier.cpp @@ -31,7 +31,7 @@ namespace dxvk { m_srcAccess |= srcAccess; m_dstAccess |= dstAccess; - m_bufSlices.push_back({ bufSlice, access }); + this->insertBufferSlice({ bufSlice, access }); } @@ -73,7 +73,7 @@ namespace dxvk { m_imgBarriers.push_back(barrier); } - m_imgSlices.push_back({ image->handle(), subresources, access }); + this->insertImageSlice({ image->handle(), subresources, access }); } @@ -277,6 +277,34 @@ namespace dxvk { } + void DxvkBarrierSet::insertBufferSlice(BufSlice slice) { + for (auto i = m_bufSlices.begin(); i != m_bufSlices.end(); i++) { + // We could try to merge adjacent ranges, but for now, + // just make sure we don't have duplicate slices. + if (slice.slice.handle == i->slice.handle + && slice.slice.offset == i->slice.offset + && slice.slice.length == i->slice.length) { + i->access.set(slice.access); + return; + } + } + + m_bufSlices.push_back(slice); + } + + + void DxvkBarrierSet::insertImageSlice(ImgSlice slice) { + for (auto i = m_imgSlices.begin(); i != m_imgSlices.end(); i++) { + if (slice.image == i->image && slice.subres == i->subres) { + i->access.set(slice.access); + return; + } + } + + m_imgSlices.push_back(slice); + } + + DxvkAccessFlags DxvkBarrierSet::getAccessTypes(VkAccessFlags flags) const { const VkAccessFlags rflags = VK_ACCESS_INDIRECT_COMMAND_READ_BIT diff --git a/src/dxvk/dxvk_barrier.h b/src/dxvk/dxvk_barrier.h index 3e5d8a5c3..3d47ab9e4 100644 --- a/src/dxvk/dxvk_barrier.h +++ b/src/dxvk/dxvk_barrier.h @@ -111,7 +111,11 @@ namespace dxvk { std::vector m_bufSlices; std::vector m_imgSlices; - + + void insertBufferSlice(BufSlice slice); + + void insertImageSlice(ImgSlice slice); + DxvkAccessFlags getAccessTypes(VkAccessFlags flags) const; };